
1. 为什么先啃传统遥感这根硬骨头1.1 大模型不是银弹基线才是护城河先聊个很多刚入行的朋友容易踩的坑一听到“遥感大模型”第一反应就是直接上SegFormer、SAM、MAE预训练权重恨不得拿Transformer把整景影像全部吞进去。但真到了生产级项目里你会发现团队里最值钱的往往不是那个能把UNet改成Swin-UNet的同事而是那个能三分钟告诉你“这块地现在到底种的是什么、长得好不好、和去年比差多少”的老遥感工程师。为什么因为大模型解决的是“模式拟合”而生产级遥感解决的是“决策可信”。你要给农田保险定损给林业部门报变化检测结果给环保督察提供排污口线索每一个结论背后都牵扯真金白银和行政责任。这个时候模型输出的精度固然重要但更重要的是你知道这个精度是在什么数据条件、什么样本分布、什么时空范围内成立的。这就是基线baseline存在的意义。我在这系列文章的前三篇里分别讲了AI遥感工程师的基础素养、数据基础设施和标注工程这一篇来聊第四块传统遥感分析与机器学习基线。换句话说在大模型进场之前得先用相对“朴素”的手段把问题的可解边界摸清楚。这项工作听着不如大模型炫酷但它决定了你后面所有复杂模型的上限和下限。1.2 这一篇要解决什么问题这篇文章不是教程式的罗列公式而是从工程落地视角回答几个非常现实的问题传统遥感分析的经典手段光谱指数、像元分类到底还在不在生产线上用用在哪一环当我们说“跑一个机器学习基线”时具体要跑什么、怎么跑、踩过哪些坑一套合格的基线实验应该包含哪些环节输出什么结果才能让团队和客户真正买账在走向遥感大模型之前基线结果应该成为什么角色的参照物。适合阅读这篇文章的人分为两类。第一类是刚从纯深度学习转过来做遥感的朋友你们熟悉PyTorch却不熟悉GDAL、不熟悉波段组合、不熟悉样本“时空一致性”的坑这篇文章能帮你们把地基补齐。第二类是已经在做遥感但主要以目视解译和人工特征为主的工程师你们会发现用机器学习基线替代部分重复劳动其实并不需要多高深的技术关键是方法框架要对。2. 传统遥感分析方法体系拆解2.1 光谱指数用波段运算做“物理先验”传统遥感分析最经典、也最被低估的一类工具就是光谱指数。不管你后面上不上深度学习只要你在做植被、水体、建筑、土壤相关的应用这些指数就是你的先验特征。神经网络再强它能自己学出NDVI和NDWI吗能但需要足够多样本去“发现”这个规律。而你直接把指数作为特征输入等于把人类几十年的遥感物理知识直接编码进模型这本质上就是一种极有效的特征工程。拿农业应用举例NDVI归一化差异植被指数的公式是[ NDVI \frac{NIR - Red}{NIR Red} ]NIR是近红外波段Red是红光波段。为什么这两个波段做差比上和被用来表征植被因为健康植物的叶绿素在红光波段有强吸收而在近红外波段有高反射所以NDVI值高说明这个像元覆盖着活跃的绿色植被。这个逻辑简单到用栅格计算器几分钟就能跑完但它比任何黑盒模型都稳定。在水体识别中则是NDWI[ NDWI \frac{Green - NIR}{Green NIR} ]由于水体在近红外波段几乎全吸收而绿光有一定反射NDWI能把水体从植被和土壤背景中分离出来。很多刚接触遥感的朋友觉得这类公式老掉牙但现实中大量业务系统比如洪水监测、农业长势评估到今天依然把这类指数作为核心指标。因为它的计算成本近乎为零、物理含义清晰、跨影像泛化能力强这些都是深度学习模型短期内无法完全替代的。2.2 像元级机器学习让模型替你看图说话再往前走一步是利用机器学习对影像的每一个像元进行分类或回归这就是像元级机器学习。这类方法在上世纪九十年代就开始普及到今天依然是很多遥感生产流程的标配。道理很简单一个像元上有多个波段的反射率值再加上可能有的纹理、地形、邻域统计特征构成了一个多维特征向量然后用分类器去学习从特征到地类的映射。常用的算法我在实际项目中用下来大致分三档第一档是线性模型和决策树代表是逻辑回归、CART决策树。它们适合特征维度低、类别边界清晰的小任务最大的优点是模型可解释性极强你能看到每个波段和特征对分类决策的权重贡献这对业务汇报非常有用。第二档是集成学习代表是随机森林、梯度提升树XGBoost、LightGBM。这是目前传统机器学习基线的主力。随机森林对高维特征、非线性关系、缺失值都有不错的鲁棒性训练速度快不容易过拟合几乎不需要太多调参就能达到一个可以接受的水平。梯度提升树精度上限更高但对噪声和异常值更敏感在遥感数据中如果标签本身有噪声反而容易把错误也学进去。第三档是核方法代表是支持向量机SVM。在小样本、高维特征的场景下SVM曾经表现优异但随着样本量增大训练成本直线上升现在已经不太适合生产级大区域任务更多是作为论文对比基线出现。2.3 这些方法的边界到底在哪传统方法当然有天花板。首当其冲的问题是像元级分析不考虑空间上下文。一个像元孤立地看它的光谱信息可能非常接近另一类地物但如果把它周围的像元一起看就能判断出这其实是建筑物阴影下的草地。传统像元级方法在这种场景下就会产生椒盐噪声式的结果分类图的破碎度非常高。另外一个痛点是它对特征工程的依赖太重。你需要人工设计特征比如纹理特征用灰度共生矩阵GLCM提取地形特征用DEM计算坡度坡向光谱特征做各种比值和变换。特征设计得好不好直接决定精度上限。这也是为什么后来大家转向深度学习——让网络自己去学习卷积核本质上就是让模型从数据中自动学出比人工设计更复杂的空间特征。但关键在于你不能因为传统方法有天花板就直接跳过它。恰恰是这个“天花板”的数值给了你一个判断后续复杂模型是否有效的标尺。如果你连传统基线都只能做到F1分数0.6那说明问题出在数据质量和类别可分性上这时候上一个大的Transformer未必能救你。3. 机器学习基线的完整搭建实操3.1 数据划分千万别随机切要按时空维度切这一节是整个基线搭建里最重要、也最容易翻车的地方。很多人拿着标注好的矢量数据和影像像元进行叠加采样然后train_test_split(X, y, test_size0.2, random_state42)一写得到漂亮的精度指标兴冲冲拿到生产环境一验证效果崩得一塌糊涂。我几乎可以断定八成是因为数据划分方式错了。遥感数据的核心特性是空间自相关——相邻像元之间存在强相关性。如果你随机划分训练集和测试集很多来自同一个地块或者同一景影像的像元会同时出现在两边模型实际上见过“答案”了测试分数自然虚高。这就是时空泄漏spatiotemporal leakage。正确的做法是分两层控制。第一层是空间划分常用方式是按地块polygon划分保证同一个地块的像元要么全进训练集、要么全进验证集不能两头都占。更严格的做法是设置一个空间缓冲区在训练集和测试集之间留出至少几十米甚至几百米的距离。第二层是时间划分如果你的数据跨了多个年份或季节要用时间外推的方式验证比如用2021到2023年的数据训练拿2024年的数据做测试这才能真正检验模型在“未来”数据上的表现。在实际操作中我习惯直接在GeoDataFrame层面操作先对地块ID分组再用GroupShuffleSplit而不是在打平后的像元数组上直接随机切。这一步做对了你的基线分数可能比随机划分低10到20个百分点但那才是真实水平。别慌这是好事说明之前你一直在自欺欺人。3.2 特征工程光谱、纹理、地形一个都不能少特征工程直接决定了传统机器学习的上限。我做遥感分类基线时的标准特征配置包括三块。光谱特征原始的各波段反射率必须进模型这是信息的基本盘。在此之上加两类衍生特征一类是光谱指数NDVI、NDWI、EVI、BSI等另一类是波段比值或主成分分析PCA的前几个分量。PCA在特征维度较高时可以起到压缩和去相关作用但要注意PCA的拟合必须在训练集上完成然后以相同的变换参数应用到验证集和测试集否则就是特征泄漏。纹理特征用灰度共生矩阵GLCM提取。常用的统计量包括对比度contrast、相关性correlation、能量energy、同质性homogeneity文字窗口大小一般取3×3、5×5或7×7。窗口太小噪声大窗口太大地物边界被模糊。实践上我会针对主要地物尺寸做一两个尺度的对比实验在精度和计算量之间取平衡。地形特征如果研究区域有地形起伏坡度slope、坡向aspect、高程elevation对分类帮助极大。特别是山区的林地分类阴坡和阳坡的光谱差异非常大没有地形特征的模型会把同一个树种分成两类。地形特征一般由DEM计算生成在GIS软件或rasterio里都能方便地实现。特征构建完之后归一化处理也需要注意。树模型随机森林、XGBoost对特征尺度不敏感但如果你在基线路里放了逻辑回归或SVM就必须做标准化且要注意用训练集的均值和标准差去放缩其他数据集。3.3 模型与超参数从逻辑回归到梯度提升树的暴力测试基线实验的核心目标不是刷到最高分而是用最低的成本确定“这个问题的可解性”。所以我的习惯是先跑一组“快速基线套餐”包括以下四类模型逻辑回归相当于一个可解释的下限验证特征和标签之间是否存在最基本的线性可分关系随机森林以默认参数先跑一轮得到一个集成了非线性能力和鲁棒性的参考线XGBoost或LightGBM比随机森林更强的拟合能力作为传统机器学习的天花板探针简单MLP单隐藏层在传统机器学习和大模型之间做一个过渡看看增加非线性表达能带来多少提升。这四类模型用同一套训练集和验证集跑下来你会得到一个非常有价值的“精度阶梯”。如果逻辑回归和XGBoost的差距非常大说明问题具有很强的非线性传统模型的天花板较低如果随机森林和XGBoost都打不过逻辑回归那就得回头看特征质量和标签准确性而不是急着加模型复杂度。超参数方面不需要做大规模网格搜索。随机森林我一般只调n_estimators400到800、max_depth10到30和min_samples_leaf1到5XGBoost主要调learning_rate0.01到0.1、max_depth4到8和subsample0.7到0.9。用scikit-learn的RandomizedSearchCV配合3折交叉验证每个模型控制在两百次搜索以内足够找到一组不错的参数。代码示例供参考以随机森林为例import numpy as np import xgboost as xgb from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import RandomizedSearchCV from sklearn.metrics import classification_report # 假设 X_train, y_train 已经构建完成 # 注意X_train 行是样本像元列是特征 # 这些特征应该已经提前完成了分组划分和标准化如果用树模型可跳过标准化 param_dist_rf { n_estimators: [400, 600, 800], max_depth: [10, 20, 30], min_samples_leaf: [1, 2, 5] } rf RandomForestClassifier(random_state42, n_jobs-1) search RandomizedSearchCV( rf, param_distributionsparam_dist_rf, n_iter50, cv3, scoringf1_macro, random_state42, n_jobs-1 ) search.fit(X_train, y_train) print(Best params:, search.best_params_) print(Best CV score:, search.best_score_) y_pred search.predict(X_val) print(classification_report(y_val, y_pred))3.4 评估指标别只看准确率要看F1和IoU遥感分类场景里类别不平衡是常态。大面积的水体、森林、农田覆盖率高而建筑物、裸地、特定作物等类别覆盖比例很小。这时候总体准确率Overall Accuracy, OA是一个极具欺骗性的指标。你哪怕把所有像元都预测成背景类OA也可能高达90%以上。所以我通常在基线上同时看三组指标。第一组是类别级的精确率Precision、召回率Recall、F1分数。重点观察稀疏类别的召回率因为漏分通常比错分代价更大比如灾害评估中建筑物损毁检测漏报一栋受损房屋的后果远比多报一栋严重。第二组是Kappa系数。它的本质是衡量分类结果和随机分类相比的改进程度能一定程度修正类别不平衡带来的“虚高OA”。注意Kappa也有争议但在行业内汇报时仍然被广泛接受看它有沟通成本低的优势。第三组是当任务涉及像元级分割或变化检测时加一个IoUIntersection over Union指标。IoU计算的是预测区域和真实区域交并比比像素级F1更能反映空间形状上的匹配度。如果说F1是“点名点对了没”IoU就是“框画得准不准”。4. 工具链与实验管理把基线变成可复现的资产4.1 遥感数据读写与处理工具要跑基线你至少得有一套趁手的遥感数据工具。我日常的主力组合是GDAL通过rasterio封装加geopandas再加scikit-learn和lightgbm/xgboost。这套组合的优点在于从读影像、读矢量、做空间采样、到跑模型能全部在Python环境内闭环不需要来回切换软件。rasterio用于读写栅格数据处理波段、投影、仿射变换这些底层细节geopandas用于读取标注矢量Shapefile、GeoJSON并进行空间操作shapely负责几何运算。在构建样本的时候我通常先用rasterio把影像转成numpy数组把波段拼成一个多维数组然后用geopandas把矢量转成与栅格对齐的mask矩阵最后在mask为1的位置抽取特征向量。这里提醒一个细节一定要确认矢量和栅格的坐标系CRS统一。我见过太多人拿WGS84的矢量去叠UTM投影的影像得到的样本位置全错最后模型效果奇差还找不到原因。处理办法是在读取数据后先检查raster.crs和gdf.crs不一致就to_crs(raster.crs)转过去。4.2 实验记录与版本管理机器学习基线看起来简单但如果实验记录做得不好返工成本非常高。你可能今天用了一组特征、明天换了一组参数一周后回头看当时的数字根本说不清这个精度是哪份数据、哪个代码版本、哪些特征跑出来的。我的建议是引入两层管理。第一层是数据版本管理推荐用DVCData Version Control。它能像git管代码一样管数据文件每次实验前把影像、标注、样本特征记录为一个版本实验后可以随时回溯。第二层是实验跟踪推荐用MLflow或者Weight Biases。至少每次跑完模型把超参数、指标、模型文件路径、特征配置都记下来。如果不想引入太多工具也可以用最朴素的办法建立一个固定的实验目录模板每一次实验都按日期和序号建目录里面放一个config.yaml记录参数一个metrics.json记录结果几行代码就能实现。关键是“可复现”这件事不能靠记忆必须靠记录。4.3 一套基线实验的目录规范我用的目录结构大致是这样的experiments/ 20250115_baseline_rf/ config.yaml features_train.npy labels_train.npy features_val.npy labels_val.npy model.joblib metrics.json report.txtconfig.yaml里写清楚用了哪些影像、哪些标注、哪个时间范围、哪些特征、模型参数。metrics.json里记录总的OA、Kappa、各类别的F1和IoU。这样做的好处是哪怕过半年再回头也能完完整整地复现当时的实验条件和结果。在此基础上后续无论你是调参、加特征、换深度学习模型都能清楚地知道每一个改动带来了多大的增量。这其实就是工程化最核心的资产——不是某一个高分模型而是清晰的实验演进史。5. 常见问题与排查技巧实录5.1 时空泄漏基线分数虚高的头号杀手我见过最典型的一个案例某同事做城市绿地分类整体精度报出95%结果到实际业务区域一验证直接掉到70%以下。排查到最后发现是训练数据和验证数据来自同一景影像的相邻区域因为空间自相关验证集里的像元和训练集里的像元“长得很像”模型相当于半开卷考试。解决办法就是我前面提到的分组划分。但这里再往深说一步分组的粒度也很关键。如果按地块分但同一个地块内包含了从影像左上角到右下角跨越很远的像元仍然可能泄漏。更稳妥的方式是按网格分把研究区切成若干规则网格同一网格的所有像元必须同进同出。网格尺寸根据地物尺度来定我一般用500米到2公里。5.2 类别不平衡稀疏类别怎么破当一个类别在总体中占比低于1%时常规采样的训练集里这个类别的样本可能只有几百个模型学不好是正常的。我的处理策略分三步。第一步是过采样或欠采样。对稀疏类别做SMOTE过采样对占比过大的类别做随机欠采样让训练集里各类别比例尽量平衡。需要注意的是SMOTE在空间数据上可能会在特征空间里合成不真实的样本所以用的时候要评估生成样本是否符合物理常识。第二步是调整类别权重。在scikit-learn和XGBoost中都可以设置class_weightbalanced或者手动指定权重。本质上这是给稀疏类别的错分施加一个更大的惩罚让模型更愿意把边界上的像元分给稀疏类别。第三步是结果后处理。如果稀疏类别仍然大量被漏分可以在概率输出上做阈值调整把该类别的最小概率阈值从0.5降到0.3甚至0.2。代价是误检增加但在地物制图中宁可多标几个候选点让人工复核也不要漏掉关键地物。5.3 云和阴影预处理比模型重要很多算法效果差的根源不在模型而在数据本身。有云的影像、云影遮蔽的区域、传感器损坏导致的条带噪声这些如果不过滤掉再先进的模型也白搭。好在现在主流影像产品比如Sentinel-2 L2A自带云掩膜QA波段处理流程里第一步就应该把云和阴影像元mask掉或者标记为无效值。在传统机器学习基线中我建议在样本构建阶段就对无效像元做过滤而不是留到模型预测阶段才处理。原因很简单无效像元的光谱特征会污染模型的类分布估计。你没把云像元剔除模型会学着把云分到某个地类里这是逻辑层面的错误不是精度层面的不足。5.4 问题排查速查表现象常见原因排查方法训练精度极高验证精度骤降数据泄漏或过拟合检查划分方式是否按空间分组查看特征是否混入标签信息降低模型复杂度看缓解程度某个地类精度特别低类别不平衡或特征可分性差统计类别样本数查看该类的特征分布直方图考虑新增特征或后处理阈值调整分类图破碎、椒盐噪声严重空间上下文特征不足增加GLCM纹理特征后期可以用众数滤波/majority filter做后处理验证精度尚可但迁移到新区域很差时空域外推能力弱检查训练数据覆盖的时间、地域范围考虑采用多时相、多样本采集策略模型训练速度极慢像元样本量过大对占绝对优势的地类做欠采样用批量训练而不是一次性全部加载考虑使用LightGBM加速6. 写在最后的个人经验做遥感AI工程这几年我最大的一个感触是真正难的不是模型而是对数据和问题的理解。传统遥感分析和机器学习基线在整个生产链路中看起来是“陪跑”但恰恰是它们逼着你把问题定义清楚。你把NDVI的原理搞明白了把样本划分做规范了把稀疏类别的坑填平了后面上大模型只是在同一个清晰的问题框架里换一个更强的函数逼近器。对我个人来说每接一个新项目前两周我几乎都在和基线和数据纠缠。等我把基线跑到一个稳定的水平把数据里的坑都摸了一遍后面无论是自己设计深度学习模型还是引入大模型微调都变得顺理成章。反过来如果一上来就奔向最复杂的方案大概率会被数据问题打得措手不及。最后再分享一个小技巧。每次基线实验跑完后我会顺手保存一张特征重要性排序图无论用的是随机森林还是XGBoost这个图能告诉你哪些波段和特征对模型决策贡献最大。这张图不只是工程产物更是和行业专家沟通的桥梁。我把特征重要性拿给农业专家看他们能直接告诉你“NDVI在夏季最重要是符合常理的”“这个纹理特征在高分辨率下确实能区分果园和自然林地”。当模型和领域知识互相印证的时候你才真正对生产结果有信心。下一篇我会开始进入深度学习的部分聊一聊从MLP到CNN再到语义分割模型在遥感场景里的演进和选型。现在先把基线打好后面的事会简单很多。