尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SCDUNet++:融合注意力与密集连接的滑坡遥感语义分割模型

SCDUNet++:融合注意力与密集连接的滑坡遥感语义分割模型 每年汛期一过做地质灾害的人就开始盯着一堆遥感影像发愁。山坡上一块一块找滑坡找到之后还要手动画边界、标范围、核对前后期影像熟练的作业员一天能处理几十平方公里已经算快手。可一场暴雨下来隐患点经常是几十上百个这个工作量根本不是纯人工能扛住的。成都理工大学这个 SCDUNet 项目做的事情说白了就一句话把“人眼在影像里找滑坡”变成“模型逐像素自动圈出滑坡范围”。这套思路属于遥感语义分割的范畴模型整体是在 U-Net 的基础上改出来的名字里的 SC 我理解大概率是空间与通道注意力相关模块的缩写D 代表 Dense也就是引入了密集连接。再配合迁移学习解决滑坡样本少、标注贵的问题。这篇文章我就从模型结构、迁移学习方案、数据工程到训练调参完整复盘一遍这类滑坡测绘项目的落地逻辑给同样在做遥感分割、灾害识别方向的同学当个参考。1. 先把场景讲清楚滑坡测绘为什么需要专门的深度学习模型1.1 人工解译的瓶颈在哪传统滑坡测绘基本靠遥感影像目视解译。作业员拿高分影像对比灾前灾后图像靠纹理、色调、形态、阴影这些特征判断哪里发生过滑动。这个方法在点位少、范围小的时候是有效的但放到大范围应急场景里就有几个绕不开的问题。首先是效率。一个县的山地面积动辄上千平方公里即便只看重点区段人工筛查也要按天计算。其次是标准不统一不同解译员对“滑坡边界”的理解有差异同一幅影像不同人圈出来的范围可能差不少。再加上滑坡发生后边界区域往往被松散堆积物覆盖颜色跟周围裸土接近光靠肉眼很容易漏判。这时候深度学习语义分割模型的优势就很明显模型一旦训练好处理一幅影像的推理时间是以秒或者分钟计的而且输出结果稳定不会因为疲劳、状态导致标准漂移。这也是滑坡测绘逐渐从“人工解译为主”转向“模型初筛人工复核”的根本原因。1.2 滑坡语义分割的特殊难点滑坡识别和普通的地物分类、道路提取不太一样它有很强的“类内多样性”。同一个滑坡体上可能有裸露的土体、碎裂的岩块、倒伏的树木、堆积的碎石这些区域在影像里的颜色和纹理差异很大。而滑坡边界外又有大量和滑坡体相似的裸露地表比如农田翻耕地、施工开挖面、河滩冲积地模型很容易把这一类东西误判成滑坡。再加上高分辨率遥感影像里阴影、云雾遮挡、植被覆盖都会造成滑坡体部分不可见。即便一个滑坡确实发生了如果滑源区被植被盖住影像上能看到的可能只有中部的一条擦痕和坡脚的堆积体。这种“不完整目标”对分割模型非常不友好。还有一点经常被忽略滑坡样本在整幅影像里占比极小。一个 512×512 像素的切片滑坡区域可能只占几百到几千个像素其他都是背景。类别不平衡一严重模型训练出来就会偏向预测背景漏检率极高。这些问题决定了滑坡测绘不能直接套一个最基础的语义分割模型必须针对场景做一些结构上的定制。1.3 SCDUNet 在整体方案里扮演什么角色SCDUNet 解决的问题是“如何从高分辨率遥感影像里端到端地输出滑坡区域的像素级掩膜”。放在整个项目流程里它的位置非常靠前输入是经过预处理的遥感影像切片输出的是每个像素属于滑坡的概率图后续把概率图矢量化、叠加到 GIS 里做面积统计和风险评估那就是测绘和地灾业务环节了。所以说模型承担的是整个自动化流程中“眼睛”的部分。它识别得准不准、边界贴不贴、小目标漏不漏直接决定了后续业务环节的工作量。如果模型初筛能把绝大多数真实滑坡都框出来同时把误报控制在可接受范围内人工复核的工作量就会大幅下降。这也是为什么团队要把大量精力花在模型结构改造和迁移学习策略上而不是简单训一个现成的 U-Net 就完事。2. 从 U-Net 到 SCDUNet结构演进与设计逻辑2.1 U-Net 为什么是遥感分割的“地基”搞图像分割的人对 U-Net 再熟悉不过了。它的结构分两条路径左边是编码器通过卷积和池化逐步下采样把输入图像压缩成越来越抽象的特征图右边是解码器通过上采样把低分辨率的特征图逐步恢复到原始分辨率。关键是中间有一系列跳跃连接把编码器每层的高分辨率特征直接拼到解码器对应层这样解码器在恢复细节的时候可以直接利用浅层的边缘、纹理信息。这个设计非常契合遥感分割的痛点。滑坡边界细节多浅层特征重要语义判断需要看全局深层特征重要。U-Net 的跳跃连接相当于给解码器开了个“细节直通车”这也是它在医学影像分割被验证成功之后迅速被遥感领域大量采用的原因。2.2 U-Net 的改进嵌套连接与深度监督U-Net 本身已经很好用但它有个潜在问题跳跃连接只是简单地把编码器特征原样拼过来没有做任何融合处理。编码器和解码器特征图的语义层级如果差太多直接拼接反而会带来噪声。U-Net 的思路是在这个连接上做文章把原先的“直连”改成一系列嵌套的卷积节点用一个密集连接的子网络把编码器特征逐步提炼再送入解码器。同时 U-Net 引入了一个很有用的训练技巧——深度监督。意思是模型在解码器的不同层级都有输出分支每个分支都算损失训练时把多个层级的损失相加回传。好处是浅层的分支可以直接收到梯度相当于给网络加了多个“辅导老师”训练更稳收敛更快。在训练数据量不大的滑坡任务里这个特性很实用。2.3 SCDUNet我理解中的三个关键设计由于没有拿到论文原文的完整结构图这部分结合实际项目的常规命名习惯做一个合理还原正式定义以团队发表的论文为准。从名字拆解SCDUNet 至少包含三方面设计第一是密集连接Dense Connection。在 U-Net 的卷积节点内部把普通卷积串联改成 Dense Block 形式每层的输入是前面所有层的输出拼接。密集连接的好处是特征复用率极高梯度传导路径更短即使网络加深也不容易出现梯度消失。对小样本滑坡数据来说更强的梯度传导意味着模型能更充分地利用有限标注。第二是空间和通道注意力。这正是“SC”最常见的含义也就是 Spatial 和 Channel。通道注意力让模型学会“哪些特征通道重要”比如某个通道可能对应土体纹理那就给它更高权重空间注意力让模型学会“图像哪些位置重要”把注意力集中在坡体区域减少背景干扰。两者串在一起等于在特征提取的同时加了一个“打光”的过程让有用信息更有存在感。第三是在关键层级引入空洞卷积或者多尺度池化用来扩大感受野。滑坡体大小差异很大小到几十平方米的浅表层滑动大到几平方公里的深层滑坡体。如果模型感受野太小大滑坡只能看到局部纹理很难判断整体结构如果感受野过大小目标的细节又会丢失。通过多尺度特征融合模型可以在不同尺度上同时捕捉目标。2.4 计算量与感受野怎么平衡模型结构改得越复杂参数和计算量涨得越快。滑坡遥感常用的输入切片是 256×256 或 512×512一批次可能要同时塞 4 到 8 张图进 GPU。基础的 U-Net 在 512×512 输入下参数量大概在 9M 左右加入密集连接和注意力之后参数量大概会到 12M 到 15M 这个量级。对一张一块钱的消费级显卡来说还算可控但再往上加模块就要小心了尤其要留意显存占用和训练速度。我见过不少团队在这个环节翻车结构堆得很豪华结果数据量跟不上训练集只有几百张切片模型直接过拟合训练到后面验证集分数越走越低训练集分数逼近满分。所以在实际项目里模型结构的设计要和数据量匹配。SCDUNet 这类模型能跑通背后一定配套了迁移学习来补充先验知识否则单靠小样本从头训练结构越复杂死得越快。3. 迁移学习在滑坡测绘中的落地方式3.1 样本少的现实问题滑坡分割最卡的从来不是模型而是数据。做一个省级范围内的滑坡识别模型标注样本至少需要几千张包含滑坡的影像切片。每个滑坡区域需要专业人员人工圈定边界怎么画、堆积区算不算、裂缝带算不算都有讲究。一个熟练作业员一天能精细标注几十个滑坡点就算很快了。更麻烦的是有些影像里滑坡极其不明显需要结合 DEM、多时相数据才能确认这种样本的标注成本非常高。公开的滑坡分割数据集又少不同数据集的影像来源、分辨率、地貌类型、标注标准差异很大直接混在一起训练模型往往学不到统一的滑坡特征。这么一来就陷入一个死循环想训练好模型需要大量数据可数据又贵又少。迁移学习就是这个循环里最重要的“解扣”手段。3.2 归纳式和直推式到底该选哪个迁移学习在滑坡测绘里有两个应用层次很多人会混在一起说得理清楚。归纳式迁移学习是最常见的做法。思路是先在数据量大的源任务上训练模型让它学到通用的视觉特征然后在目标任务的小样本数据上微调。放到滑坡测绘里就是先在大型遥感影像数据集上做预训练再把权重迁移到滑坡分割模型在有限的滑坡标注数据上继续训练。这种做法简单实用是工程首选。直推式迁移学习更接近“域适应”的概念。它的特点是源域比如通用遥感数据集和目标域滑坡影像有相同的任务但目标域只有未标注样本或极少标注样本。训练时模型不仅要利用源域的已有标注还要通过目标域的未标注影像去对齐特征分布。举个例子通用遥感影像里有很多城市、农田滑坡影像里则是大量山区裸地两个域的影像风格差异很大。直推式方法会利用目标域无标注数据做统计特征对齐让模型在训练阶段就提前“适应”山区的视觉环境而不是等到推理时才面对分布差异。说到热词里的“直推式迁移学习”在滑坡这种标注极端匮乏的场景下确实很有价值。工程落地时可以先在通用遥感数据上预训练拿到一个基础模型然后拿大量无标注的滑坡区域影像做一致性训练比如对同一影像做不同增强要求模型输出保持一致再拿少量有标注样本做监督微调。这种半监督式的流程思路本质上就带着直推式迁移的味道。3.3 从哪个数据集预训练更靠谱很多做自然图像的人拿到问题第一反应是把 ImageNet 的预训练权重拿来微调。但遥感影像和 ImageNet 里的日常照片差异太大了。遥感影像是俯视视角目标尺度、纹理、光谱特征都不同直接迁移 ImageNet 权重虽然也能用但效果往往一般。更好的选择是用遥感领域的公开数据集做预训练比如 BigEarthNet、RESISC45、OpenEarthMap、FBP 这些。它们覆盖了不同传感器、不同分辨率的遥感影像模型在这些数据上能学到更贴近遥感任务的底层特征比如地物纹理、空间布局、尺度关系之后再迁移到滑坡任务起跑线就完全不一样了。还要注意一个波段问题。很多遥感影像是多光谱的除了 RGB 还有近红外等波段。如果预训练模型是在 RGB 三通道上训练的而目标数据有 4 个或更多波段最简单的做法是先用 RGB 三通道去匹配预训练权重把多光谱里的额外波段用随机初始化补齐然后训练时让模型自动学这些额外波段的信息。千万不要因为多光谱通道数不一致就放弃预训练权重那损失的信息远远大于补几个随机通道带来的影响。3.4 迁移加载的工程实现冻结、微调与学习率理论归理论落到代码上还是有不少细节。以 PyTorch 为例假设模型类叫 SCDUNetPlusPlus预训练权重只覆盖 encoder 部分加载的时候需要按 key 过滤不能让 strict 模式直接报错。import torch model SCDUNetPlusPlus(in_channels5, num_classes1) pretrained torch.load(./bigearthnet_resnet.pth, map_locationcpu) # 只保留 encoder 部分跳过 decoder 和 head new_state {k: v for k, v in pretrained.items() if k.startswith(encoder.)} missing, unexpected model.load_state_dict(new_state, strictFalse) print(缺失参数, missing) print(未匹配参数, unexpected)加载完成后最忌讳的做法就是直接整网开满学习率去训练。小样本场景下随机初始化的解码器会输出很大的梯度容易把已经训练好的编码器参数冲乱。实际项目中我建议分两步走# 第一步冻结编码器只训练解码器 for name, param in model.named_parameters(): if name.startswith(encoder.): param.requires_grad False # 等解码器loss明显下降后再解冻全部参数 for name, param in model.named_parameters(): param.requires_grad True解冻之后还有一个细节是学习率分层。编码器来自预训练学习率设小一点比如 1e-5 到 3e-5解码器是随机初始化的学习率可以设到 1e-4。如果用一个统一学习率容易出现编码器还没动解码器先抖起来的局面。分组设置学习率其实就几行代码的事但对训练稳定性帮助很大。4. 完整实操链路数据、训练与评估4.1 数据集怎么造才不容易翻车滑坡影像分割的数据集构建核心原则是切片加增强。原始遥感影像动辄几千乘几千像素不能整张图塞进模型必须切成小块。切片大小我一般选 512×512兼顾感受野和显存占用如果显存紧张256×256 也能跑只是大目标会需要更大的步幅重叠来保证覆盖。切片的时候要设置重叠区域重叠率通常 10% 到 25%。原因是滑坡边界可能恰好被切成两半如果一个目标被切到两张切片里都是残影模型很难学到完整特征。重叠切片加上推理时的拼接策略可以很大程度减少这类问题。数据增强在滑坡任务里要谨慎。常规的随机翻转、旋转 90 度、小角度旋转都建议加这相当于免费扩充训练样本。但光学变换要克制尤其是色相、饱和度、亮度的大范围抖动。滑坡识别的核心特征是土体颜色和纹理如果增强把灰褐色土体变成了绿色模型就会学到错误关联。再说一个很容易踩的坑训练验证集划分一定要按空间划分不能按切片随机划分。同一块滑坡区域生成的切片高度重叠如果一部分切片在训练集一部分在验证集验证结果会虚高因为模型在训练时已经见过同一块区域的绝大部分内容。正确做法是先按滑坡区域或地理坐标把影像分成块再按块划分数据保证训练和验证集在空间上互不重叠。4.2 标签数据处理的几个关键细节标签的质量比数量更重要这一点在滑坡分割里体现得最明显。矢量标注转栅格的环节经常出问题原始滑坡范围是 GIS 里的面要素转成栅格时一定要和影像保持相同的分辨率、投影和范围否则模型输入和标签错位训练出来边界会整体偏移一圈。实际数据里还有一种常见情况滑坡体边界不是一条清晰的线而是一个过渡带从完全滑动的土体渐变到未受影响的地表。这时候用硬标签一刀切会把过渡带里的像素强制归为前景或背景增加训练噪音。我的经验是标注时尽量把明确的滑坡主体、堆积体画进去边缘模糊带宁可不标也不要乱标。模型对模糊区域有争议是正常的强制统一标注只会让收敛变差。另外统计一下数据集中滑坡像素的占比非常有必要。如果所有切片里滑坡像素平均只占 1% 到 2%那训练时就要高度重视类别平衡问题。4.3 训练参数、损失函数与评价指标损失函数方面纯用交叉熵在滑坡场景下效果很一般因为背景像素占绝对大头交叉熵会让模型倾向把所有像素都预测成背景。常用方案是 Dice Loss 和 Focal Loss 的组合。Dice Loss 直接优化目标区域的重叠度DiceLoss 1 - (2 × |预测∩真实|) / (|预测| |真实|)它对前景区域的大小不敏感特别适合前景占比很小的任务。Focal Loss 的公式长这样FocalLoss -α × (1 - p)^γ × log(p)核心思想是降低易分样本的权重让模型把注意力放在难分样本上。实际项目中我会用 0.6 的 Dice Loss 加 0.4 的 BCE Loss或者 0.5 Dice 加 0.5 Focal两种组合都试过稳定性和精度都还不错。优化器推荐 AdamW初始学习率 1e-4配合余弦退火或者 ReduceLROnPlateau。批次大小根据显存来8 到 16 都可以如果显存只有 8G512×512 输入下批次 4 到 6 是常见选择。混合精度训练非常建议开能把训练速度提升 30% 以上同时显存占用降低不少。评估指标按遥感分割惯例看 IoU、F1、像素精度这几项。IoU 是对分割结果非常严格的度量IoU TP / (TP FP FN)滑坡区域小即便像素精度做到 99%IoU 也可能只有 40% 到 60%这个阶段不要慌因为目标小IoU 天然偏低。真正要看的是一对组合查准率预测出的滑坡中有多少是真的和查全率真实滑坡中有多少被找出来了。应急场景下查全率通常更重要漏掉一个滑坡比多报几个嫌疑点严重得多。调阈值或者调损失权重时思路就要往这个方向偏。4.4 推理时如何拼大图模型推理和训练是两回事。训练时是独立的切片推理时面对的是完整的大幅影像必须用滑动窗口遍历整幅图然后把所有窗口的预测结果拼回去。直接硬拼会出现明显的接缝效应——窗口边缘的预测不稳定造成边界处出现条带。解决办法是窗口重叠加上概率平均。比如窗口大小 512步幅设为 384这样每个位置会被多个窗口覆盖推理时取重叠区域的预测概率均值。这个操作能显著改善接缝问题代价是推理时间增加但对离线测绘任务来说完全可接受。如果有 GPU建议在推理时把多个窗口打包成批次一次算别一张一张送进模型速度能差好几倍。5. 训练与推理中的常见问题速查5.1 模型不收敛先别急着加数据训练早期如果 Loss 不降或者直接震荡发散第一件事是检查输入和标签的对应关系。遥感项目里影像波段顺序弄错、标签和影像分辨率不匹配、归一化参数用错都是常见问题。我见过有人把多光谱的 R、G、B 顺序搞混模型训练了两天 Loss 还在 0.7 附近晃一查是波段顺序和预训练权重不一致。如果输入输出确实没问题那就是学习率的问题。试一下更小的学习率比如 1e-5排除学习率过高的因素。训练初期可以选一张影像切片把预测结果可视化出来看一眼。如果模型一片空白大概率是损失函数里背景权重太大把预测整体压没了如果预测形状乱七八糟大概率是标签和输入错位。可视化调试是最高效的排查手段别只盯着 Loss 数字猜。5.2 迁移之后反而变差大概率是负迁移负迁移这个现象在小样本任务里特别容易出现。明明用了预训练权重效果反而不如从头训练这是为什么核心原因在于源域和目标域的分布差异太大。比如用 ImageNet 预训练权重迁移到多光谱滑坡影像上ImageNet 学到的是自然图像的纹理和物体形状而滑坡影像的核心特征是光谱反射和地形走向两者交集很少强行微调后模型可能被带偏。另一个原因是预训练权重来自多分类任务跟分割任务的任务头结构差别很大。如果简单粗暴地把全连接分类层的权重也迁移过来反而会引入无用信息。解决负迁移的办法有几种尽量选择遥感域预训练权重加载权重后先冻结编码器用目标域数据训练解码器给编码器一个“稳定期”还有一个是增大目标域数据增强让模型不至于被源域特征束缚死。如果这些手段都试过仍然没有缓解那就果断回退到从头训练用更轻量的模型结构配合更强增强效果也不会差。5.3 小滑坡漏检、边界不齐怎么调小目标漏检是滑坡分割最让人头疼的问题之一。一个只有二三十米宽的浅层滑坡在 512×512 切片里可能只占一个角上的小块区域。模型下采样四次之后这个小目标的特征可能已经在深层特征图里消失了。针对小目标漏检最直接的手段是减小切片尺寸让目标在切片里的相对尺寸变大。比如从 512×512 降到 320×320 或 256×256小目标的像素占比会成倍提高。代价是模型感受野变小对大型滑坡的整体把握会变差所以需要权衡或者做多尺度训练。另一个思路是提高输入影像分辨率如果有更高分辨率的影像源优先保证分辨率。边界不齐则更多是标签问题或者后处理不足。模型输出的是像素级概率如果直接按 0.5 阈值二值化边界会很细碎。后处理可以做简单的形态学开闭运算去掉零散噪点和补上细小空洞。如果边界还是参差不齐可以尝试在损失函数里加一个 boundary loss 相关的项或者把边缘检测任务整合成多任务学习让模型在解分割的同时显式学习边界。从实际效果看多任务学习对边界质量的提升非常明显。5.4 显存不够和推理太慢的工程解法训练时显存不够是最常见的工程瓶颈。除了降低批次大小、减小输入尺寸这些基本操作有几个更优雅的解法混合精度训练是最快见效的显存能省 30% 到 40%梯度累积可以让小批次在效果上模拟大批次虽然单步速度没变但稳定性提升明显如果结构允许把 BatchNorm 换成 GroupNorm能放宽对批次大小的依赖小批次训练时会更稳。推理太慢的问题核心思路是减少不必要的计算。模型推理前可以先用一个非常轻量的规则或分类模型筛掉明显不含滑坡的切片只有被初筛标记为“疑似”的切片才进入完整的分割模型。一套二阶段推理流程在滑坡这种目标稀疏的场景下能把总推理时间压缩 60% 以上。6. 往后还能怎么扩展6.1 多时相变化信息很重要目前多数滑坡分割模型用的是单时相影像也就是只看某一时刻的静态特征。可滑坡识别的本质是“变化”灾前和灾后影像的差异是判断滑坡发生的最强信号。未来的方向很自然是把模型从单帧分割扩展成双时相变化检测输入两期影像让模型自己比较差异再输出变化区域。这种思路对缓解误报会有显著帮助比如把施工开挖、耕地翻整这类本就存在的裸地区域通过“前后无变化”这个信号直接过滤掉。6.2 与InSAR、DEM等多模态数据融合光学影像再清晰看到的也只是地表。滑坡真正的滑动面、形变位移、地形起伏需要 DEM 和 InSAR 数据来补充。把 DEM、坡度、坡向作为额外通道和光学影像一起输入模型已经是很多滑坡项目的标准做法。更进一步的思路是在特征层面做多模态融合光学特征用来判断滑坡的表观特征地形特征用来约束滑坡的地形合理性两者互为补充能显著减少把河流阶地、堆土场误判为滑坡的情况。6.3 从区域模型走向通用基础模型滑坡分割目前还是一个相对垂直的场景训练出来的模型往往只能在特定区域、特定影像源上表现良好。换个卫星、换个地区的影像效果就明显下降。如果要做通用化核心还是回到迁移学习这条路上先在覆盖全球、多传感器、多地形的大型遥感数据上训练一个通用分割基础模型然后在滑坡这个细分任务上做微调。这条路对数据和算力的要求很高但确实是滑坡测绘从“单点项目”走向“规模化业务”的必经之路。我个人在实际项目中的体会是模型结构能带来的提升是有上限的真正决定项目生死的是数据和迁移策略。SCDUNet 的价值在于把 U-Net 在细节恢复上的优势和密集连接、注意力机制对特征的强化结合在了一起而在小样本条件下这套结构能不能发挥出来关键看迁移学习做得细不细。预训练数据集选对、加载方式合理、微调流程稳健模型的效果才有保障。如果你正在做类似方向的遥感分割项目我建议先把数据和时间域的分布差异理清楚再动手调结构。另外有个小技巧值得分享训练过程中每隔几个 epoch 保存一次 checkpoint回看每个 checkpoint 的验证 IoU很多时候模型在某个中间状态反而表现最好别一直拿着最后一个 epoch 的结果去评测。
返回列表