1. 从一张高分影像说起:为什么土地覆盖分类值得认真做
第一次接触高分辨率遥感影像分类,是帮一个做城市绿地调查的朋友处理一批亚米级航拍图。他给的需求很朴素:把图里的建筑、道路、水体、植被、裸地分开就行。我原以为拿个现成的分类模型跑一遍就完事,结果现实狠狠上了一课——同一片区域,换一景影像,模型精度直接掉一大截,阴影、季节、地物纹理差异全成了拦路虎。后来才明白,这就是遥感土地覆盖分类里最经典的痛点:跨场景泛化能力差。
土地覆盖分类(Land-cover classification)说白了就是给影像上的每个像素或每个图斑贴一个标签,告诉计算机这块地是"建设用地""耕地""林地"还是"水体"。它听起来像图像分类,但和普通图像分类有本质区别:普通图像分类一张图一个标签,土地覆盖分类是逐像素的密集预测,属于语义分割的范畴。而高分辨率遥感影像(High-resolution remote sensing images)又把这个任务推向了更难的层级——分辨率越高,地物内部纹理越丰富,类内差异越大,类间边界越模糊,一棵树和一片草地可能长得差不多,屋顶和水泥地也容易混淆。
这个项目标题里最关键的词其实是transferable deep models,也就是"可迁移的深度模型"。为什么强调可迁移?因为遥感领域有一个绕不开的现实:标注数据极其昂贵。让测绘人员逐像素勾画一张高分影像,成本高得吓人,而且不同传感器、不同地区、不同季节的影像分布差异巨大。如果每换一个场景就重新标注、重新训练,那这套方法根本没有工程价值。所以核心诉求就变成了:在一个或几个源域上训练好的深度模型,能不能迁移到没有标注的目标域上,还能保持可用的精度?
这篇文章适合谁看?如果你是从业者,正在做遥感解译、地理信息提取、城市变化监测,或者你手上有高分影像但苦于标注成本,那这套思路值得你花时间研究。如果你是深度学习方向的学生,想找一个既有理论深度又有落地价值的迁移学习应用场景,土地覆盖分类是个绝佳的练手场。我会从整体设计思路、核心细节、实操流程到踩坑经验,一层层拆开讲,尽量让你看完能直接上手复现。
2. 整体方案设计:迁移学习到底怎么"迁"
2.1 为什么不能直接拿ImageNet预训练模型硬套
很多人第一反应是:语义分割不是有现成的DeepLab、U-Net吗,拿ImageNet预训练的骨干网络微调一下不就行了?我一开始也这么干过,结果发现两个致命问题。
第一,域差异(domain shift)太大。ImageNet是自然图像,拍摄角度是地面视角,目标是单一物体;遥感影像是俯视视角,地物是成片的、有空间结构的。一个"车"在ImageNet里是主体,在遥感影像里可能只有几个像素,而且和道路、阴影纠缠在一起。骨干网络学到的底层特征(边缘、纹理)或许能复用,但高层语义特征几乎要重新学。
第二,标注域和目标域之间的分布差异。就算你在A城市的高分影像上训练得很好,换到B城市,由于光照、大气、传感器响应、地物类型的差异,模型性能会显著下降。这就是所谓的跨域问题。迁移学习要解决的,正是这个"源域训练、目标域可用"的矛盾。
2.2 可迁移深度模型的三种主流思路
结合我自己的实践和这个领域常见的做法,可迁移方案大致分三条路线,各有取舍。
第一条是特征对齐(feature alignment)。核心思想是让源域和目标域在特征空间里的分布尽量接近。常见做法是在网络中间层加一个域判别器,做对抗训练,让特征提取器学到的特征"分不清"来自哪个域。这条路线理论优雅,但训练不稳定,对抗训练容易崩,调参成本高。
第二条是自训练(self-training)与伪标签(pseudo-labeling)。先用源域模型给目标域打伪标签,挑置信度高的样本加入训练集,迭代优化。这条路工程上最实用,我后面会重点展开。它的好处是不需要目标域真值,坏处是伪标签噪声会累积,需要设计筛选策略。
第三条是数据层面的域适应,比如风格迁移,把目标域的影像"翻译"成源域风格再分类。这条路线对影像外观差异大的场景有效,但会引入额外的生成模型,流程变长。
提示:实际项目中,我通常采用"预训练骨干 + 特征对齐 + 伪标签自训练"的组合拳,而不是死磕单一方法。单一方法很难同时解决外观差异和语义差异。
2.3 方案选型的判断依据
怎么选?我总结了一个简单的判断逻辑,用表格列出来更清楚。
| 场景特征 | 推荐路线 | 理由 |
|---|---|---|
| 源域目标域外观接近,仅地物分布不同 | 伪标签自训练 | 成本低,见效快 |
| 外观差异大(季节、传感器不同) | 风格迁移 + 特征对齐 | 先消除外观鸿沟 |
| 目标域有少量标注 | 半监督微调 | 少量真值能极大稳定训练 |
| 目标域完全无标注且差异大 | 对抗域适应 + 伪标签 | 组合策略兜底 |
这个判断表是我踩了不少坑之后总结的。早期我迷信对抗训练,觉得"高级",结果在一个跨季节任务上折腾了两周还不如伪标签跑三天。后来才想明白:方法没有高低,只有匹配不匹配。
3. 核心细节拆解:数据、模型与迁移机制
3.1 高分辨率影像的预处理要点
高分影像和普通图像最大的不同是尺寸。一景影像动辄上万像素,直接塞进网络显存根本扛不住。所以第一步是切图(tiling)。我一般切成512×512或1024×1024的块,重叠率设10%到20%,避免边界地物被切断导致训练噪声。
切图之后是归一化。这里有个容易忽略的点:不同影像的辐射差异很大,不能简单除以255。我通常按波段做z-score标准化,或者用直方图匹配把目标域影像的色调拉到源域附近。这一步对后续迁移效果影响很大,实测能提升几个点的精度。
还有一个细节是类别不平衡。土地覆盖里水体、建筑往往占比小,植被、农田占比大。直接训练模型会偏向多数类。我的做法是采用加权交叉熵,权重按类别频率的倒数来设,或者用focal loss压制易分样本。具体用哪个,看你的类别分布有多极端。
3.2 骨干网络与分割头的选择
骨干网络我推荐从两个方向选。如果追求精度,用ResNet-101或EfficientNet做编码器,配合空洞卷积(atrous convolution)保持感受野,这是DeepLab系列的经典配置。如果追求速度和部署便利,MobileNetV3或轻量Transformer做编码器更合适。
分割头部分,我实测下来ASPP(空洞空间金字塔池化)在多尺度地物上表现稳定,因为它能同时捕捉不同大小的目标。对于高分影像里"大楼"和"小路"这种尺度差异极大的情况,多尺度特征融合几乎是必须的。
这里补充一个关键点:迁移的时候,冻结哪些层、微调哪些层是有讲究的。底层特征(边缘、颜色)通用性强,可以冻结;高层语义特征域相关性强,必须微调。我的经验是冻结编码器前1/3的层,其余全部参与训练,这样既省算力又保精度。
3.3 迁移机制的核心:从特征对齐到伪标签
特征对齐的具体实现,我常用的是最大均值差异(MMD)或者域对抗神经网络(DANN)的思路。MMD的做法是在特征层计算源域和目标域特征的分布距离,把它作为损失的一部分,逼迫网络学出域不变特征。相比对抗训练,MMD更稳定,不容易崩,适合工程落地。
伪标签的流程我拆成四步走。第一步,用源域模型对目标域做推理,得到每个像素的类别概率。第二步,设定置信度阈值(我一般取0.9),只保留高置信度像素作为伪标签。第三步,把伪标签样本和源域样本混合,重新训练模型。第四步,重复前三步两到三轮,每轮适当降低阈值,让更多样本参与。
注意:伪标签的阈值不能一上来就设太低,否则噪声标签会把模型带偏。宁可少而精,不要多而杂。我见过有人阈值设0.6,结果第二轮模型就退化了。
3.4 损失函数的设计
损失函数是迁移效果的隐形推手。我的常规配置是:主损失用交叉熵(或focal loss)保证分类精度,辅助损失用MMD或对抗损失保证域不变性,再加一个一致性正则让伪标签训练更稳。三者加权求和,权重需要调,一般主损失占大头,辅助损失占0.1到0.5之间。
这里有个实操心得:辅助损失的权重不要固定,用渐进式增长。训练初期让模型先学好源域分类,后期再逐渐加大域对齐的权重。这样能避免一开始就被域对齐带偏,导致分类能力都没学好。
4. 实操流程:从零跑通一套可迁移分类方案
4.1 环境与数据准备
环境上,我一般用PyTorch配合CUDA,显卡显存建议不低于11GB,因为高分影像切块后batch size很难做大。数据准备阶段,源域需要有标注的影像和标签图,目标域只需要影像,不需要标签。如果目标域能搞到一点点标注(哪怕几十个图斑),对最终精度帮助巨大,强烈建议争取。
数据组织上,我习惯按如下结构存放,方便后续扩展:
dataset/ source/ images/ # 源域影像切块 masks/ # 源域标签 target/ images/ # 目标域影像切块4.2 源域模型训练
第一步先在源域上把模型训到收敛。这一步不用考虑迁移,目标就是把分类精度拉满。学习率我用余弦退火,初始1e-3,训练100个epoch左右。batch size根据显存尽量大,配合BN层效果更稳。
训练过程中要盯紧验证集的混淆矩阵,尤其关注容易混的类别对,比如"建筑"和"道路"、"草地"和"农田"。如果某两类一直混,说明特征区分度不够,可以考虑加类别权重或者引入边界损失。
4.3 目标域伪标签生成与筛选
源域模型训好后,直接对目标域影像推理。输出的概率图里,每个像素取最大概率对应的类别。然后按置信度筛选,我一般先取0.9,统计一下高置信像素占比。如果占比太低(比如不到30%),说明域差异太大,得先做风格迁移或者降低阈值试探。
筛选出来的伪标签要可视化检查。这一步千万别省,我吃过亏——有一次伪标签里把大片水体标成了建筑,原因是源域水体样本太少。可视化一看就发现了,及时补了源域样本。
4.4 联合训练与迭代优化
把源域真值样本和目标域伪标签样本混合,重新训练。这一轮训练时,源域样本的损失权重可以设高一点(比如1.0),目标域伪标签样本权重设低一点(比如0.5),因为伪标签毕竟有噪声。
训练完一轮后,用新模型重新给目标域打伪标签,再筛选、再训练。一般迭代2到3轮就够了,再多收益递减还容易过拟合伪标签噪声。每一轮都记录目标域上的评估指标(如果有少量真值)或者目视检查效果。
4.5 关键参数与计算过程
这里给几个我常用的参数,附上选择理由。
| 参数 | 取值 | 理由 |
|---|---|---|
| 切图尺寸 | 512×512 | 兼顾显存与上下文信息 |
| 重叠率 | 15% | 减少边界断裂 |
| 初始学习率 | 1e-3 | 余弦退火配合 |
| 伪标签阈值 | 0.9→0.85→0.8 | 逐轮放宽 |
| MMD权重 | 0.1→0.3 | 渐进增长 |
| batch size | 8~16 | 视显存而定 |
关于MMD权重的渐进增长,我一般用线性升温:前20个epoch权重从0升到0.3,之后保持。这样模型先专注分类,再逐步对齐域分布。
5. 常见问题与排查技巧实录
5.1 精度不升反降怎么办
这是最常见的问题。原因通常有三个:伪标签噪声太大、域对齐损失权重过高、学习率太大把预训练特征冲垮了。排查顺序我建议先看伪标签质量,可视化几张,如果明显错标,就提高阈值或先做风格迁移。其次检查损失权重,把辅助损失调小试试。最后降学习率,用更小的步长微调。
5.2 某些类别始终分不对
如果某一类在目标域上一直错,八成是源域里这类样本太少或者外观差异太大。解决办法有两个:一是在源域里补充该类样本,二是对这类单独做类别加权。我遇到过一次"裸地"总被分成"建筑",后来发现源域裸地样本只有几十个,补到几百个后问题基本解决。
5.3 训练不稳定、loss震荡
对抗训练尤其容易震荡。我的经验是:能用MMD就别用对抗,能加梯度裁剪就加,batch size尽量大,BN层在域差异大时可以考虑换成GN(GroupNorm)。另外,伪标签训练时如果loss突然飙升,多半是某批伪标签噪声集中,可以加一个loss截断或者直接跳过异常batch。
5.4 常见问题速查表
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| 目标域精度低 | 域差异大 | 风格迁移/特征对齐 |
| 伪标签错标多 | 阈值太低/源域偏差 | 提高阈值/补源域样本 |
| loss震荡 | 对抗训练不稳 | 换MMD/加梯度裁剪 |
| 某类全错 | 类别不平衡 | 类别加权/补样本 |
| 显存不足 | 切图太大 | 减小尺寸/梯度累积 |
提示:排查问题时,永远先看数据,再看模型,最后看超参。我见过太多人一上来就调学习率,结果问题是标签本身错了。
6. 影响范围与延展思考
这套可迁移深度模型的价值,远不止于土地覆盖分类本身。它的核心思想——用标注丰富的源域知识去解决标注稀缺的目标域任务——可以迁移到很多遥感相关场景。比如城市变化检测,你可以用历史时期的标注去辅助当前时期的解译;比如跨传感器地物提取,用高分影像训练的模型去适配中分影像;再比如灾害应急评估,灾区往往没有标注,但可以用邻近地区的模型快速迁移过去。
从工程角度看,这套方案最大的意义是把标注成本从"每场景重标"降到了"一次标注、多次迁移"。对于做地理信息服务的团队来说,这意味着交付周期和人力成本的大幅压缩。当然,迁移不是万能的,域差异过大时仍然需要人工介入,但至少能把人工从"全量勾画"降到"抽检修正"。
我自己在实际操作中的体会是:迁移学习的效果,七分靠数据,两分靠对齐策略,一分靠调参。很多人把精力全花在模型结构上,却忽略了源域数据的代表性和目标域伪标签的质量,这是本末倒置。如果你正准备上手这个方向,我的建议是先老老实实把源域数据做扎实,把伪标签流程跑通,再去考虑加什么花哨的域适应模块。最后再分享一个小技巧:每次迭代后,把目标域的预测结果和上一轮做差分,变化剧烈的区域重点人工检查,往往能发现系统性的错标模式,比盲目调参高效得多。