资讯动态

高分辨率遥感影像土地覆盖分类:迁移学习实战与调优

发布时间:2026/10/13 14:49:21 来源:尧图企业网站定制
1. 项目缘起与核心问题拆解遥感影像的自动解译这些年一直是个热门方向但真正动手做过的人都知道坑远比想象中多。我最早接触这个领域是在一个区域土地覆盖普查的辅助项目里当时手头有一批亚米级的高分辨率影像分辨率能到0.5米左右理论上地物细节非常丰富但实际标注数据少得可怜——整片区域能拿到的可靠标注样本只有几千个像素级标签而且类别分布极度不均衡建设用地和水体占了七成以上剩下的林地、耕地、裸地都是零散小块。这种场景下如果从零训练一个深度网络基本等于自杀模型会严重过拟合到多数类上。这个项目的核心命题就是在高分辨率遥感影像上用可迁移的深度模型完成土地覆盖分类。说白了就是借助在大规模自然图像数据集上预训练好的网络把学到的通用特征迁移到遥感场景里再通过少量标注样本做微调最终输出每个像素的类别标签。它解决的是遥感领域最典型的两个痛点一是标注成本极高二是不同传感器、不同区域、不同季节的影像分布差异大模型泛化能力差。适合谁来参考这篇内容如果你是从业者手头有遥感影像分类任务但标注数据有限或者你正在做多源数据迁移学习那这篇东西应该能帮你少走弯路。如果你是对深度学习落地感兴趣的学生或工程师想了解迁移学习在真实场景里怎么调、怎么踩坑也可以顺着往下看。我会把整个流程拆开从数据准备、模型选型、迁移策略、训练细节到问题排查尽量讲透。2. 整体方案设计与迁移逻辑2.1 为什么选迁移学习而不是从零训练先算一笔账。假设你要从零训练一个ResNet-50级别的网络做像素级分类至少需要多少标注按照经验每个类别没有几千到上万个独立样本网络根本学不到稳定特征。而遥感影像的像素级标注一个熟练的标注员一天能标完的干净区域可能就几平方公里换算成像素也就百万级别但这里面有效类别样本可能只有几万。更麻烦的是遥感影像的类内差异极大——同样是水体深水区和浅水区、清水和浊水的光谱响应完全不同同样是建设用地密集城区和工业园区的纹理差异也很大。从零训练的网络很容易把这些差异当成不同类别来学。迁移学习的逻辑就完全不一样了。像ImageNet这种大规模自然图像数据集包含了一千多万张标注图像网络在训练过程中已经学到了边缘、纹理、颜色梯度、局部形状等底层和中层特征。这些特征对遥感影像同样有效因为地物的边界、纹理、光谱模式在底层视觉特征上是相通的。你要做的只是让网络学会把这些通用特征映射到遥感类别上而不是重新发明一套特征提取器。注意迁移学习不是万能药。如果源域自然图像和目标域遥感影像的差异过大比如源域全是室内场景目标域是农田那底层特征可能就不太匹配。但ImageNet的多样性足够好覆盖了天空、水面、植被、建筑等大量与遥感重叠的语义所以实际效果通常很稳。2.2 可迁移深度模型的选型考量选什么骨干网络直接决定了迁移效果和计算成本。我试过几种主流方案这里把对比列出来方便你根据自己手头的算力和数据量做选择。骨干网络参数量预训练数据迁移到遥感的适配难度适用场景ResNet-5025MImageNet低特征通用性强中等数据量算力有限ResNet-10144MImageNet低但训练更慢数据量较大追求精度EfficientNet-B312MImageNet中需要调输入分辨率算力紧张移动端部署ViT-Base86MImageNet-21k高需要更多数据微调大数据量追求SOTASwin-T28MImageNet中窗口注意力对遥感友好高分辨率输入细节丰富我最终选的是ResNet-50作为基线原因很实际第一它的预训练权重最容易拿到社区支持好第二25M参数量在单卡上就能跑不用折腾分布式第三它的特征金字塔结构天然适合做多尺度融合而遥感影像里地物尺度变化极大从几米宽的小路到几公里的大型农田多尺度信息非常关键。如果你手头数据量超过十万级像素样本可以上ResNet-101或者Swin-T精度会有提升但训练时间大概翻倍。2.3 迁移策略的分层设计迁移不是简单地把预训练权重加载进来就完事了。网络的不同层学到的东西不一样底层学的是边缘、角点、颜色这些通用特征高层学的是语义类别相关的抽象特征。遥感影像和自然图像在底层特征上高度相似但在高层语义上差异明显。所以我的策略是分层设置学习率底层用极小的学习率甚至冻结中层用中等学习率高层用正常学习率。具体来说ResNet-50的conv1到layer2我直接冻结学习率设为0layer3用1e-4的学习率layer4和后面的分类头用1e-3的学习率。这样做的逻辑是底层特征不需要改改了反而破坏通用性中层特征需要轻微调整以适应遥感纹理高层特征需要大幅调整来适配新的类别定义。实测下来这种分层策略比全局统一学习率收敛快至少30%而且最终精度高2到3个百分点。3. 数据准备与预处理的关键细节3.1 高分辨率影像的读取与分块高分辨率遥感影像动辄几个GB直接塞进内存不现实。我的做法是先把大图切成512x512的图块重叠率设成25%也就是步长384。为什么要重叠因为如果直接硬切地物边界正好落在切块边缘时上下文信息就丢了分类结果会出现明显的拼接缝。25%的重叠能保证边界区域至少出现在两个图块里后续做推理时可以把重叠区域的预测结果做平均消除拼接痕迹。切块的时候要注意遥感影像的坐标参考系和普通图像不一样切块后要记录每个图块在原图中的行列号方便后续拼接回完整分类图。我一般用一个简单的CSV文件记录图块文件名、起始行、起始列、宽度、高度。这个文件在最后出图的时候是刚需千万别省。import rasterio from rasterio.windows import Window def tile_image(src_path, tile_size512, overlap0.25): with rasterio.open(src_path) as src: height, width src.height, src.width stride int(tile_size * (1 - overlap)) tiles [] for row in range(0, height, stride): for col in range(0, width, stride): w min(tile_size, width - col) h min(tile_size, height - row) if w tile_size or h tile_size: continue window Window(col, row, w, h) tile src.read(windowwindow) tiles.append((tile, row, col)) return tiles3.2 标注数据的清洗与类别平衡遥感标注数据最大的问题是噪声。不同标注员对同一块地物的判断可能不一致比如稀疏草地到底算草地还是裸地边界模糊的区域经常标错。我拿到标注后第一件事是做一致性检查把同一区域的多份标注叠在一起只保留完全一致的部分有争议的要么重新确认要么直接丢弃。这一步会损失大概15%到20%的标注量但剩下的数据质量高很多训练出来的模型稳定得多。类别不平衡的处理也很关键。我的做法不是简单地上采样少数类而是用类别加权损失函数。具体来说每个类别的权重设为该类别像素总数的倒数再归一化到均值为1。这样少数类的损失权重会大一些但不会像重采样那样导致过拟合。另外我还会在数据增强阶段对少数类做额外的旋转和翻转增加其样本多样性。提示遥感影像的旋转增强要小心。自然图像旋转90度没问题但遥感影像有地理方向性比如农田的垄沟方向、建筑的朝向过度旋转可能引入不真实的样本。我一般只做90度、180度、270度旋转和水平垂直翻转不做任意角度旋转。3.3 归一化与波段处理高分辨率遥感影像通常有四个波段红、绿、蓝、近红外。预训练网络是在RGB三通道上训练的所以要么把近红外丢掉要么把它映射到某个通道。我试过两种方案一是直接用RGB三通道简单但丢了近红外信息二是把近红外当成第四个通道复制预训练权重的第一层卷积核多出来的通道用零初始化或者均值初始化。实测下来第二种方案在植被分类上精度高不少因为近红外对植被健康状态非常敏感。归一化方面不能直接用ImageNet的均值和方差因为遥感影像的像素分布和自然图像差别很大。我的做法是统计自己数据集的均值和方差然后做标准化。如果数据集不大可以用整个训练集的全局统计量如果数据集很大可以分区域统计避免不同区域的光照差异影响。4. 模型搭建与训练实操4.1 网络结构改造ResNet-50原本是用于图像分类的输出是一个1000维的向量。要做像素级分类需要把最后的全连接层去掉换成卷积层和上采样层。我的做法是保留ResNet-50的前面所有卷积层在layer4后面接一个1x1卷积把通道数降到类别数然后用双线性插值上采样回原图尺寸。这样输出的就是每个像素的类别概率图。具体结构是这样的输入512x512x4如果用了近红外经过ResNet-50的卷积层后特征图变成16x16x2048然后1x1卷积降到16x16xNN是类别数再经过三次上采样每次放大2倍变成128x128xN最后再上采样一次到512x512xN。上采样用双线性插值而不是转置卷积因为转置卷积容易产生棋盘格伪影而遥感影像对伪影很敏感会干扰后续的面积统计。import torch import torch.nn as nn import torchvision.models as models class RemoteSensingSegmenter(nn.Module): def __init__(self, num_classes, in_channels4): super().__init__() resnet models.resnet50(pretrainedTrue) # 修改第一层以接受4通道输入 if in_channels 4: old_conv resnet.conv1 new_conv nn.Conv2d(4, 64, kernel_size7, stride2, padding3, biasFalse) new_conv.weight.data[:, :3] old_conv.weight.data new_conv.weight.data[:, 3] old_conv.weight.data.mean(dim1) resnet.conv1 new_conv self.backbone nn.Sequential(*list(resnet.children())[:-2]) self.head nn.Conv2d(2048, num_classes, kernel_size1) self.upsample nn.Upsample(scale_factor32, modebilinear, align_cornersFalse) def forward(self, x): features self.backbone(x) out self.head(features) return self.upsample(out)4.2 损失函数与优化器配置损失函数我用的是加权交叉熵加Dice损失的组合。交叉熵负责像素级分类Dice损失负责类别间的区域重叠度两者结合能同时优化像素精度和区域完整性。权重比例我设的是交叉熵占0.7Dice占0.3这个比例是试出来的交叉熵太高会导致小类别被淹没Dice太高会让边界变得模糊。优化器用AdamW学习率按前面说的分层设置。权重衰减设0.01这是AdamW的推荐值。批次大小根据显存来单卡11GB的话512x512的图块可以放8个。如果显存不够可以降到256x256的图块批次大小翻倍但要注意小图块的上下文信息少精度会略降。训练轮数我一般设50到80轮配合余弦退火学习率调度。前5轮做warmup学习率从1e-5线性升到设定值避免一开始就大学习率破坏预训练权重。之后每10轮验证一次如果验证集精度连续3轮不提升就提前停止。4.3 训练过程中的监控指标光看损失值不够遥感分类要看几个关键指标总体精度、Kappa系数、各类别的F1分数。总体精度就是所有像素里分对的比例但它在类别不平衡时会虚高所以必须看Kappa系数它排除了随机一致性的影响。F1分数是精确率和召回率的调和平均能反映每个类别的分类质量。我一般每轮训练后在验证集上算这三个指标记录到TensorBoard里。如果发现某个类别的F1一直上不去就要检查是不是样本太少或者标注有问题。有一次我发现水体的F1只有0.6其他类别都在0.85以上排查后发现是浅水区和深水区的标注混在一起了模型学不到统一的特征。后来把水体细分成深水和浅水两个子类F1就上到0.82了。5. 迁移效果评估与调优经验5.1 迁移前后的精度对比为了验证迁移学习的价值我做过一组对照实验一组从零训练一组用预训练权重迁移。其他条件完全一样结果差异非常明显。训练方式总体精度Kappa系数训练轮数收敛时间从零训练0.720.61120约18小时迁移学习冻结底层0.860.7945约6小时迁移学习全网络微调0.840.7660约9小时从零训练不仅精度低而且训练轮数多、收敛慢验证集精度波动也大。迁移学习冻结底层的方案精度最高因为底层通用特征被完整保留高层特征又能充分适配遥感类别。全网络微调反而略低原因是底层特征被遥感数据“带偏”了丢失了通用性。5.2 不同迁移策略的消融实验除了冻结和全微调我还试过几种中间策略这里把结果整理出来方便你根据自己情况选择。策略冻结层可训练层总体精度备注策略Aconv1-layer2layer3-layer4head0.86推荐平衡精度和速度策略Bconv1-layer3layer4head0.83训练快但精度略低策略C无全部0.84需要更多数据否则过拟合策略Dconv1-layer4head only0.78只适合类别极少的场景策略A是我最常用的它在精度和训练成本之间取得了很好的平衡。策略B适合快速验证想法比如你刚拿到数据想看看大概能分几类。策略C需要至少五万级像素样本否则验证集精度会明显低于训练集。策略D基本只适合二分类任务多类别时高层特征不够用。5.3 跨区域迁移的泛化表现迁移学习还有一个隐藏价值跨区域泛化。我在A区域训练的模型直接拿到B区域推理如果不做任何适配精度会掉10到15个百分点。但如果用B区域的少量样本做微调哪怕只有几百个像素精度就能恢复到接近A区域的水平。这说明预训练权重提供的通用特征确实有很强的跨域能力只需要少量目标域数据就能完成适配。具体操作上我会先在A区域训练好模型然后把B区域的少量标注样本拿出来冻结底层只微调layer4和分类头学习率设1e-4训练10到15轮就够了。这个过程通常只需要几十分钟比从零训练快两个数量级。注意跨区域迁移时如果两个区域的光照、季节差异很大最好先做色彩归一化。我试过用直方图匹配把B区域的色彩分布对齐到A区域精度能再提升3到5个百分点。这个方法在遥感里很实用因为不同季节的植被颜色差异极大。6. 常见问题与排查技巧实录6.1 训练不收敛或精度震荡这是最常见的问题原因通常有三个学习率太大、批次太小、数据标注噪声太多。排查顺序是先把学习率降一个数量级如果还震荡检查批次大小是否小于4如果小于4就增大图块尺寸或者用梯度累积。如果这两步都没用那大概率是标注问题需要抽样检查标注质量。我遇到过一次精度剧烈震荡最后发现是数据增强里的随机旋转用了任意角度导致有些图块旋转后地物方向完全失真。改成只做90度倍数旋转后震荡就消失了。遥感影像的方向性比自然图像强得多增强策略要保守一些。6.2 小类别分类效果差小类别F1低首先要看样本量。如果某个类别的像素数不到总像素的1%那模型很难学到有效特征。解决办法有两个一是增加该类别样本可以通过旋转、翻转、加噪声等方式扩充二是调整损失权重把该类别权重调高。我一般会把权重设为该类别像素占比倒数的平方根这样既不会过度放大又能给小类别足够的关注。如果样本量够了但F1还是低那可能是类别定义有问题。比如“裸地”和“稀疏草地”在光谱上很接近模型很难区分。这时候要么合并类别要么引入额外的辅助信息比如纹理特征或者时序信息。我试过在输入里加一个NDVI指数通道对区分植被和裸地帮助很大。6.3 推理结果有拼接缝拼接缝是分块推理的典型问题。前面说了用25%重叠可以缓解但如果重叠区域的平均策略没做好还是会有痕迹。我的做法是在重叠区域用高斯权重做加权平均中心像素权重高边缘像素权重低。这样拼接缝基本看不出来。还有一个细节分块推理时每个图块都要做和训练时一样的归一化。如果训练时用的是全局均值和方差推理时也要用同一套参数不能重新统计。我见过有人推理时对每个图块单独做归一化结果不同图块的色彩不一致拼接后像打了补丁。6.4 显存不足的应对方案高分辨率影像加深度网络显存很容易爆。除了减小图块尺寸和批次大小还有几个技巧一是用混合精度训练能省30%到40%的显存二是用梯度检查点牺牲一点速度换显存三是把模型切成两半分别放在两张卡上做模型并行。我一般优先用混合精度因为改动最小效果也最明显。from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for images, labels in dataloader: optimizer.zero_grad() with autocast(): outputs model(images) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()6.5 常见问题速查表问题现象可能原因排查方法解决方案损失不下降学习率过大/过小打印梯度范数调整学习率加warmup验证精度远低于训练过拟合对比训练验证曲线加正则化增数据增强小类别F1低样本不足/权重低统计类别分布调权重扩充样本拼接缝明显重叠不足/归一化不一致检查重叠率和归一化参数增重叠统一归一化显存溢出批次太大/图块太大监控显存占用混合精度梯度检查点跨区域精度骤降域差异大对比两区域色彩分布色彩归一化少量微调7. 实操心得与后续扩展方向这个项目做下来我最大的体会是迁移学习的核心不是模型有多深而是迁移策略有多细。同样的ResNet-50分层学习率设得好精度能比全局统一学习率高3到5个百分点。很多人把预训练权重加载进来就完事了其实那只是第一步后面的分层微调、损失加权、数据增强策略才是决定成败的关键。另外遥感影像的预处理比自然图像重要得多。自然图像你随便裁剪、旋转、缩放语义基本不变。但遥感影像有地理坐标、有方向性、有季节差异预处理不当会引入大量噪声。我建议在做任何模型训练之前先花时间把数据清洗和增强策略定好磨刀不误砍柴工。后续如果想进一步提升有几个方向可以尝试。一是引入多时相数据同一区域不同季节的影像能提供额外的判别信息比如农田在播种期和收割期的光谱差异很大多时相融合能显著提升分类精度。二是用自监督预训练在大量无标注遥感影像上先做对比学习再迁移到有标注任务上这样能进一步减少对标注的依赖。三是尝试轻量化模型把ResNet-50换成MobileNetV3或者EfficientNet-Lite在保持精度的同时把推理速度提上去方便部署到边缘设备上做实时分类。最后分享一个小技巧如果你手头的标注数据实在少可以先用预训练模型做一遍推理把高置信度的预测结果当成伪标签和真实标注一起训练。这个方法在遥感里叫自训练我试过用10%的标注加90%的伪标签精度能达到全标注的85%左右性价比很高。当然伪标签的阈值要调好太高了样本不够太低了噪声太多一般设0.9左右比较稳。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑