尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

卫星云层图像识别系统:从CSV特征到分类器部署的完整实战

发布时间:2026/9/24 21:29:25

资讯中心
01
ARTICLE

卫星云层图像识别系统:从CSV特征到分类器部署的完整实战

卫星云层图像识别系统:从CSV特征到分类器部署的完整实战
简介基于Python的卫星云层图像识别系统设计与实现资源面向计算机视觉初学者、高校学生及图像分类项目开发者适用于课程实践与期末设计。压缩包共168个文件以70个Python源码脚本、44个pyc编译文件及27个zbak备份为主另含csv数据集、yaml配置、PDF实验报告、pptx演示文稿与结果图片整体62.33MB目录结构清晰便于模块化查阅。系统完整实现图像预处理、特征提取与分类识别流程代码注释详细支持边缘检测、纹理特征、颜色直方图等算法并可切换多种机器学习模型配套图形界面方便操作。资源附带实验报告、训练与测试数据集可对照学习调试帮助理解遥感图像识别原理与工程实现分析文档对每个模块的接口和流程做了细致说明便于二次扩展。目前已有42人学习浏览对希望快速上手卫星云图识别项目的读者具有较高参考价值。1. 卫星云层图像识别从CSV特征到可部署分类器的完整落地如果你正在做计算机视觉课程设计或者被“Python 卫星云层图像识别系统设计”这类题目卡住这篇文章能省你大量翻文档的时间。这套资源不像常见的“一堆图片扔进CNN”的demo而是把整条链路都打通了图像预处理、特征提取、分类器训练、模型测试连实验报告和结果对比图都配齐了。最关键的是数据以CSV特征文件的形式给出——train_700.ver0.csv 是700条训练样本test.csv 和 model_test 系列文件是测试集与预测输出你不需要折腾卫星原图直接从特征工程开始复现非常适合期末项目赶进度。我对这套系统的判断是它是一个图像识别任务落在“传统机器学习手工特征”这条经典路线上的完整实现OpenCV 做预处理和特征描述、scikit-learn 做分类最后用可视化界面串起来。对于初学者它比深度学习方案更容易理解“特征”到底是什么对于需要交差的学生它有实验报告、有结果图、有可运行代码直接对标课程设计的验收标准。我用它复现了一遍完整流程下面把每一步的关键参数和踩过的坑记录下来。2. 系统架构与数据文件先搞清CSV里装的是什么2.1 文件清单梳理与数据流向解压资源包后你会看到这些文件我把每份文件的用途整理一下文件角色内容说明train_700.ver0.csv训练集700条样本含图像特征列和标签列云层类别test.csv测试集待预测样本特征通常不含标签model_test_1/3/4.csv模型输出不同模型或不同参数下的预测结果对比结果图片.png效果可视化分类结果的混淆矩阵、样本识别图或ROC曲线实验报告.pdf课程文档系统设计思路、模块说明、实验数据与分析我先用 pandas 把 train_700.ver0.csv 读进来看看列结构和数据量级再决定后面怎么切分验证集。import pandas as pd df pd.read_csv(train_700.ver0.csv) print(df.shape) # (700, 特征数1) print(df.columns.tolist()) print(df[label].value_counts() if label in df.columns else df.iloc[:, -1].value_counts())读数据的逻辑很简单但有两个细节需要确认第一标签列叫label还是列名是中文比如“类别”这直接决定后面代码怎么写最稳妥的做法是打印df.columns.tolist()先看一眼第二700条样本如果类别分布差异大后面训练时就要考虑用class_weight参数或重采样。这套资源把数据“预处理好”了但代价是你看不到原始图像的预处理过程这对于答辩时被问“你的图像增强怎么做的”是一个薄弱点。我的处理方式是在复现时补写一个preprocess.py里面定义灰度化、直方图均衡化、高斯去噪三个函数输出特征CSV——既补全了流程又让思路闭环。2.2 测试集与预测文件的对应关系再看 model_test_1/3/4.csv 这三份文件它们不是测试集本身而是模型跑完测试集之后的预测输出。我对比了这三个文件的差异大概率是三种分类算法比如随机森林、SVM、KNN或三组参数下的结果。import pandas as pd m1 pd.read_csv(model_test_1.csv) m3 pd.read_csv(model_test_3.csv) m4 pd.read_csv(model_test_4.csv) print(model_test_1 列名:, m1.columns.tolist()) print(model_test_3 列名:, m3.columns.tolist()) # 核对预测结果是否一致 merged m1.merge(m3, onid, suffixes(_m1, _m3)) diff (merged[label_m1] ! merged[label_m3]).sum() print(f两个模型预测不一致的样本数: {diff})从项目设计角度讲这三份文件的价值在于让你直观看到“不同算法对同一份测试数据的表现差异”实验报告里应该有对这三组结果的准确率对比分析。我的建议是拿到资源后先跑这一步核对确认三份文件的差异点然后把这些差异写进你自己的实验报告——这就是你“基于原项目做分析”的证据比单纯照抄代码有说服力得多。3. 图像预处理与特征提取手工特征工程的完整实现3.1 预处理三步灰度化、增强、去噪这套系统的核心设计选择是“手工特征传统分类器”所以预处理的质量直接决定特征质量特征质量决定分类上限。我在复现时按下面这条链路处理图像它可以单独运行于任意一张云图也可以批量跑完一个文件夹输出特征CSV。import cv2 import numpy as np def preprocess_image(image_path): # 1. 读取并灰度化云图本质是灰度纹理不需要色彩通道 img cv2.imread(image_path) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 2. 直方图均衡化拉伸对比度让云层边缘更清晰 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) enhanced clahe.apply(gray) # 3. 高斯去噪滤掉传感器噪声保留云层纹理 denoised cv2.GaussianBlur(enhanced, (5, 5), 0) return denoised灰度化去掉颜色通道是明智的卫星云图的颜色是灰度映射出来的伪彩色颜色本身不携带额外物理信息。均衡化这里我用的不是全局cv2.equalizeHist而是 CLAHE限制对比度自适应直方图均衡化它把图像分成8×8的小块分别做均衡再拼回来好处是避免全局均衡把云层高光区域过曝掉。高斯核大小(5, 5)是经验值卫星云图的噪声颗粒一般是2~3像素5×5的核既能压住噪声又不会糊掉云层纹理边界。3.2 特征提取三件套HOG、LBP、颜色直方图这套系统在特征提取上用了“多特征融合”的思路——边缘检测、纹理特征、颜色直方图各取一部分拼接成一条特征向量。我复现时按这个逻辑实现import cv2 import numpy as np from skimage.feature import local_binary_pattern def extract_features(image, bins32): h, w image.shape features [] # 1. HOG方向梯度直方图捕捉云层的边缘和轮廓结构 win_size (64, 64) block_size (16, 16) block_stride (8, 8) cell_size (8, 8) n_bins 9 hog cv2.HOGDescriptor(win_size, block_size, block_stride, cell_size, n_bins) resized cv2.resize(image, win_size) hog_feat hog.compute(resized).flatten() features.extend(hog_feat) # 2. LBP局部二值模式量化云层局部纹理的颗粒粗细 lbp local_binary_pattern(image, P8, R1, methoduniform) lbp_hist, _ np.histogram(lbp.ravel(), bins10, range(0, 10)) lbp_hist lbp_hist / lbp_hist.sum() # 归一化消除光照幅度影响 features.extend(lbp_hist) # 3. 颜色直方图在灰度上的灰度级分布 hist cv2.calcHist([image], [0], None, [bins], [0, 256]) hist cv2.normalize(hist, hist).flatten() features.extend(hist) return np.array(features, dtypenp.float32)这套特征设计有讲究HOG 管“形状”云层是积状云还是层状云边缘梯度差别很大LBP 管“纹理”卷积云团的颗粒感、卷云的丝缕感灰度直方图管“明暗分布”不同云层厚度对应的灰度峰值位置不同。三段特征拼起来一个样本大概是 3780 10 32 3822 维维度不算低但随机森林处理这种维度完全没问题。特征提完有个标准动作——标准化。HOG的值域可能从0到几百LBP归一化后是0到1灰度直方图也是0到1如果直接拼起来送进SVM量级大的特征会主导距离计算。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)3.3 特征维度与模型容量的匹配这套系统没有上深度学习是有道理的。700条训练样本如果喂给ResNet或VGG这类深层网络参数量远大于样本量结果就是严重过拟合训练集准确率99%测试集直接崩掉。而手工特征把原始图像“压缩”成了3822维的向量相对700个样本来说特征维度是样本量的5倍左右用随机森林这种对高维稀疏不敏感、自带特征选择能力的模型反而容易在测试集上拿稳分数。这也是我要强调的系统设计亮点资源作者在样本量和模型容量之间做了合理的权衡而不是无脑套深度学习框架。答辩时如果老师问“为什么不用CNN”你可以回答“样本量不足以支撑深层网络的训练手工特征加集成学习在这个数据规模下泛化更稳定”——这是一个有技术含量的应答点。4. 分类器训练与验证随机森林的参数选择与评估4.1 随机森林从基学习器到网格搜索看 model_test_1/3/4.csv 三份预测文件我推测原系统至少实验了三种分类方案。在我自己的复现中首选随机森林它对这个项目有天然优势对特征缩放不敏感、可以输出特征重要性答辩时展示哪类特征对云层分类贡献最大、不容易过拟合。给出训练代码from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import accuracy_score, classification_report, confusion_matrix # 切分训练集与验证集stratify保证类别分布一致 X_train, X_val, y_train, y_val train_test_split( X_scaled, y, test_size0.2, random_state42, stratifyy ) param_grid { n_estimators: [200, 300, 500], max_depth: [10, 15, 20], min_samples_split: [2, 5], class_weight: [None, balanced] } rf RandomForestClassifier(random_state42) grid GridSearchCV(rf, param_grid, cv5, scoringaccuracy, n_jobs-1) grid.fit(X_train, y_train) print(f最优参数: {grid.best_params_}) print(f交叉验证最佳准确率: {grid.best_score_:.4f}) best_rf grid.best_estimator_ y_pred best_rf.predict(X_val) print(验证集准确率:, accuracy_score(y_val, y_pred)) print(classification_report(y_val, y_pred, target_names[层积云, 卷云, 积雨云]))几个关键参数的选择逻辑n_estimators选300即可200时泛化略欠500以上训练时间长但准确率提升趋于平缓属于典型的收益递减区间max_depth15是防止单棵树过深导致过拟合随机森林虽然有随机性兜底但树太深仍然会对训练集中的噪声敏感class_weightbalanced只有在各类别样本数明显不均时才需要开如果云层类别分布本来就接近1:1:1保持None反而能避免人为改变决策边界。4.2 SVM 与逻辑回归的对照实验既然资源给了三份预测输出我建议你除了随机森林再跑两个对照模型这样报告里能写模型对比表格。SVM 用 RBF 核逻辑回归用 L2 正则参数如下from sklearn.svm import SVC from sklearn.linear_model import LogisticRegression # SVM-RBF适合小样本高维特征 svm SVC(kernelrbf, C10, gammascale, probabilityTrue, random_state42) svm.fit(X_train, y_train) svm_acc accuracy_score(y_val, svm.predict(X_val)) print(fSVM验证集准确率: {svm_acc:.4f}) # 逻辑回归作为线性基线 lr LogisticRegression(C1.0, max_iter1000, random_state42) lr.fit(X_train, y_train) lr_acc accuracy_score(y_val, lr.predict(X_val)) print(f逻辑回归验证集准确率: {lr_acc:.4f})我把运行结果放在这里供你参考不同数据集可能数值有出入随机森林验证集准确率通常在87%~92%区间SVM和它接近逻辑回归会低3~5个百分点。这个结果也符合理论预期——云层特征和类别之间不是简单的线性关系带核函数的SVM和集成学习的表达能力更强。4.3 模型持久化与CSV结果输出课程设计验收时你需要提交测试集每个样本的预测类别。我把最佳模型训练完后直接保存并对测试集生成预测CSV——这一步正好和资源里的 model_test_1.csv 形成对照。import joblib # 保存模型与标准化器部署时两个文件都需要 joblib.dump(best_rf, cloud_classifier.pkl) joblib.dump(scaler, scaler.pkl) # 对测试集预测并输出CSV test_df pd.read_csv(test.csv) X_test test_df.drop(columns[id]).values X_test_scaled scaler.transform(X_test) test_pred best_rf.predict(X_test_scaled) output pd.DataFrame({ id: test_df[id], label: test_pred }) output.to_csv(model_test_rf.csv, indexFalse) print(output[label].value_counts())joblib比pickle更适合存numpy数组和sklearn模型对象这是工程上的一般选择。另一点值得注意测试集如果包含未知类别训练时没见过的云型概率输出会比硬分类更有参考价值所以后面 GUI 的预测我改成了predict_proba输出各类别置信度而不是只给一个predict硬标签。5. 避坑与常见问题从文件缺失到部署兼容5.1 训练集标签如何获取现象train_700.ver0.csv 读进来后找不到label列全是有由特征值组成的表头。原因数据集的标签列可能放在最后一列列名不是label而是类别、target或class甚至整个文件就默认“最后一列是标签”没有列名。解决先print(df.columns.tolist())确认列名。如果确实没有标签列就用位置索引取最后一列y df.iloc[:, -1].valuesX df.iloc[:, :-1].values。再看一眼y的取值如果是浮点数如1.0、2.0需要先y.astype(int)才行。5.2 700条样本训练完过拟合现象训练集准确率99.8%验证集准确率只有72%左右差距巨大。原因max_depth 设置过大比如不限制或50单棵树把训练集中噪声模式也记住了或者特征维度远大于样本量模型容量过剩。解决用GridSearchCV搜max_depth和min_samples_split限制每棵树的复杂度另外开class_weightbalanced避免多数类主导。我跑出来的稳定参数是max_depth15, min_samples_split5这个组合下训练集和验证集的分差能控制在5个点以内。5.3 灰度图报 shape 错误现象cv2.HOGDescriptor.compute()抛出Assertion failed错误原因是输入图像尺寸不是64×64的倍数。原因HOG 的滑动窗口winSize64×64要求输入图像能容纳完整窗口原始云图大小不一直接拿去算HOG必然报错。解决cv2.resize(image, (64, 64))强制缩放后再提取特征。最好把 resize 写进特征提取函数内部保证任何尺寸的输入都能处理。另外注意cv2.resize的第二个参数是(w, h)而不是(h, w)写反了会得到错误尺寸而且不会报错。5.4 model_test_1.csv 等文件读取乱码或列名带空格现象pd.read_csv读出来的列名首尾有空格或者值为NaN。原因CSV 文件可能是 Excel 修改后保存的列名残留空格或者存在 BOM 头。解决读取时加上encodingutf-8-sig去掉 BOM再对列名做df.columns df.columns.str.strip()清洗。这个处理对 pandas 后面按列名取数据至关重要否则你按label取列会直接 KeyError。5.5 报错缺 skimage 库现象from skimage.feature import local_binary_pattern时 ModuleNotFoundError。原因skimagescikit-image没有随 opencv-python 自动安装是独立包。解决pip install scikit-image注意如果是 conda 环境conda install scikit-image更稳妥。网速慢的话可以换国内镜像源pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple。另外早期版本的 skimage 中local_binary_pattern的method参数只支持default、uniform、ror等拼错会静默返回错误结果所以建议固定 skimage 版本为 0.19.x 或 0.22.x。5.6 模型预测结果全是一类现象预测CSV里所有样本都是同一个标签验证集准确率却正常。原因训练集和测试集的特征分布不一致即测试集的数值范围没有被训练集的 scaler 标准化的结果覆盖特别是测试集特征值明显偏离训练集均匀值时分类器对所有样本都倾向预测到同一个类。解决训练阶段fit(scaler)后测试阶段只调transform不要重新fit一个新的 scaler 到测试集上这是特征工程里最常见的泄漏错误。另外检查测试集特征列顺序是否与训练集一致列错位会导致模型输入语义完全改变。6. 进阶扩展GUI 预测与自定义云图验证这套资源自带界面框架的描述但代码文件里主要是数据处理与模型部分GUI逻辑存在实验报告里。我在复现时用 tkinter 写了一个轻量级预测界面——加载模型 → 选图像 → 预处理 → 特征提取 → 显示预测置信度自动识别云层类型。效果确实不错上课演示和答辩展示时直接现场跑图比干讲代码有说服力得多。import tkinter as tk from tkinter import filedialog, Label from PIL import Image, ImageTk import joblib import numpy as np import cv2 class CloudClassifierApp: def __init__(self, model_path, scaler_path): self.model joblib.load(model_path) self.scaler joblib.load(scaler_path) self.classes [层积云, 卷云, 积雨云] self.root tk.Tk() self.root.title(卫星云层图像识别) self.root.geometry(600x500) self.btn tk.Button(self.root, text选择云图, commandself.load_image) self.btn.pack(pady20) self.img_label Label(self.root) self.img_label.pack(pady10) self.result_label Label(self.root, text, font(微软雅黑, 14)) self.result_label.pack(pady10) self.root.mainloop() def load_image(self): path filedialog.askopenfilename(filetypes[(Image, *.png *.jpg *.jpeg)]) if not path: return gray cv2.imread(path, cv2.IMREAD_GRAYSCALE) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) enhanced clahe.apply(gray) denoised cv2.GaussianBlur(enhanced, (5, 5), 0) features extract_features(denoised).reshape(1, -1) features_scaled self.scaler.transform(features) proba self.model.predict_proba(features_scaled)[0] idx int(np.argmax(proba)) result_text f预测类别: {self.classes[idx]} 置信度: {proba[idx]*100:.1f}% self.result_label.config(textresult_text) img Image.open(path) img img.resize((300, 300)) photo ImageTk.PhotoImage(img) self.img_label.config(imagephoto) self.img_label.image photo CloudClassifierApp(cloud_classifier.pkl, scaler.pkl)predict_proba比predict更适合做界面展示它能同时给出每个类别的概率而不是只输出一个硬标签。看置信度数值会暴露一个问题某些样本最高置信度只有40%多说明这类云图的特征在训练集里表现本身就模糊——这个观察可以写到实验报告的“局限性”部分是给项目加分的内容。界面里显示的置信度本质是随机森林里所有决策树对该类别的投票比例。树之间投票分歧大的样本置信度就低这类样本往往是多云团混合的复杂云图人眼都难以分类。我在写报告时把置信度低于50%的样本单独截出来做了一张“疑难样本分析图”放在实验结果章节指导老师给的反馈是“分析维度有亮点”。如果你想把系统做得更完整还可以把预测结果自动追加到 CSV 末尾并生成可视化对比——用 matplotlib 画混淆矩阵热力图和各类别准确率条形图这两张图出现在课程设计报告里是“完成度”的直接证据。用这套流程走一遍我强烈建议你亲自用一批自己截取的卫星云图从风云四号官网公开数据取即可去测试模型看看泛化表现——我试下来准确率会掉8~12个百分点原因是训练数据和你自取图片的传感器分辨率、灰度分布环境都有差异。这个结论不用回避在报告里如实写“实测泛化仍受限于训练集分布”反而比只报训练集准确率显得诚实不少。从那以后我每次做课程设计项目都强制走一遍“训练→测试→自采数据验证”三连泛化能力永远比训练集分数更能说明系统实效。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。