ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

卫星图像分割实战:从数据到模型部署的深度学习完整指南

卫星图像分割实战:从数据到模型部署的深度学习完整指南 简介面向卫星图像分割入门与实战的 Python 代码包适合遥感、计算机视觉方向的学生和开发者也适合刚接触遥感影像处理的初学者可应用于土地利用分析、建筑物提取、灾害监测等常见场景。压缩包内共 3 个 py 文件整体仅 3KB结构简明三个脚本分别承担数据准备、主流程控制和屋顶检测专项演示方便对照理解图像预处理、特征提取、阈值分割及深度学习模型调用等关键环节。目前已有 250 人学习使用。这份资源的最大价值是用最小代码量串联起卫星图像分割的完整链路读者既能快速跑通现有流程也能在此基础上替换自己的遥感影像做验证对于希望学习 GDAL、OpenCV、Scikit-image 等库的初步集成或进一步尝试 U-Net、SegNet 等深度学习模型的人来说是一份轻量而直接的参考无论是课程设计、课题研究还是工程预研都能从中获得直观的启发。1. 卫星图像分割到底在做什么从一张卫片到一张地物映射图很多人做惯了常规图像分割项目第一次接触卫星图像分割时会有点懵。同样都是语义分割输入同样是一张图、输出同样是一张逐像素标签图但换到遥感场景后原本跑得挺好的模型要么精度上不去要么推理时直接爆显存。这不是模型出了问题而是你把任务定义错了。卫星图像分割的本质是把一张覆盖大面积地表的高分辨率遥感影像映射成一张逐像素语义标注的地物分布图。每个像素被归类到对应的语义类别比如建筑物、道路、水体、耕地、林地、裸地等。这里的关键词是大范围小目标多类别光照与尺度变化剧烈这也是它和自动驾驶街景分割、医学图像分割最大的不同目标尺度从几米的车辆、道路标线到数百米的农田连片地块动态范围极宽而裁剪出来的一个切片里不同类别像素占比往往极度不均衡。在民用领域最常见的落地任务大概有四类第一类是土地覆盖与土地利用分类服务于自然资源调查和城市规划像区分耕地、林地、草地、建设用地、水体这是最经典的任务第二类是目标物提取比如建筑物轮廓提取、道路网提取、水体边界提取这类任务要求边界准确度高小目标的召回率非常关键往往直接对接GIS入库第三类是农业遥感应用例如对农田地块进行分割并推算种植面积支撑长势监测、产量估测第四类是变化检测用两期影像分割后对比或者直接对两期影像做联合分割提取新增建筑、塌方、水体变化等这在灾害评估里用得非常多。想做好卫星图像分割先得接受一个现实你面对的不是一张照片而是一片经过传感器辐射校正、几何校正后的地表观测数据。同一个类别的像素在不同季节、不同角度、不同天气下光谱表现可能差异很大。比如水体在不同泥沙含量下颜色完全不同沥青停车场和深色屋顶在RGB空间里几乎无法区分农田地块在播种期和收割期形态差异巨大。因此卫星图像分割拼的不只是网络结构更多是数据预处理、样本设计和对地物光谱特性的理解。2. 数据这关过不去模型再先进也白搭2.1 公开数据集怎么选刚开始做遥感分割的人最喜欢问用什么数据集我的建议是先明确任务尺度再选数据集。如果你想快速跑通pipeline、对比模型结构推荐两个经典Benchmark一个是ISPRS Vaihingen与Potsdam数据集这是航空影像分辨率在5到9厘米类别包括不透水面、建筑、低植被、树木、汽车标签质量高但类别较少适合做模型验证另一个是DeepGlobe Land Cover数据集来自卫星影像标签分为城市、农业、牧场、森林、水体、裸地六类覆盖印度等地图像尺寸2448x2448切片后直接训练非常顺手。如果目标是大规模建筑物提取Massachusetts Buildings Dataset和Inria Aerial Image Labeling Dataset是绕不开的选择。前者是波士顿等地区的航空影像标签就是二进制建筑掩膜后者覆盖城市和乡村场景图像尺寸5000x5000像素分辨率30厘米对显存和训练策略是很好的压力测试。做卫星图像分割还有一个绕不开的五星数据集Sen12MS或BigEarthNet这类基于Sentinel影像的数据集包含多光谱波段适合做大范围土地覆盖与多光谱分类实验。但要注意的是这些公开数据集和你的实际业务场景往往存在分布差异模型在国内高密度城中村场景、南方丘陵农田场景上表现会明显下降。实际项目中公开数据通常只用来预训练和验证真正要上线还得靠自建样本。2.2 波段选择别一上来就丢RGB卫星影像不只是RGB三波段Sentinel-2有13个波段Landsat有11个波段。很多新手拿到数据后直接取前三个波段存成JPG开始训练这是很大的浪费。多光谱波段对地物识别的增益是实实在在的尤其是近红外波段对植被、水体、土壤含水量的区分能力极强。一个明显的例子水体在近红外波段几乎完全吸收与陆地反差极大很多做水体提取的模型只用近红外加红光再加一个绿光波段精度就比RGB高出一大截。我的建议是先针对任务做波段相关性分析再决定输入波段数。如果做植被相关任务NDVI归一化植被指数这类光谱指数可以直接作为额外通道输入网络做水体提取时可以把NDWI归一化差异水体指数拼进输入。这样做比单纯堆通道数更有效因为指数通道本身就是光谱知识的高度浓缩。另外注意输入通道与预训练权重的匹配问题如果你用ImageNet预训练的ResNet或EfficientNet第一层卷积权重是按3通道设计好的增加通道后需要特殊初始化常见做法是先保留RGB三通道的预训练权重新加通道用零均值高斯初始化然后全网络微调别直接随机初始化从头训收敛速度和精度都会差很多。2.3 标注质量比标注量更值钱在这个任务里标注噪声带来的精度损失被很多人低估。遥感地物的边界本身存在大量过渡区与模棱两可的情况比如一棵树的树冠边缘延伸到草地上一片耕地边缘在影像上只有一个混合像元标注人员往往凭感觉画线。如果标注边界普遍不齐模型训练时会学到边界模糊,推理出的结果也带着毛边mIoU卡在某个值上不去。高分辨率卫星影像的地物分割标注通常用的是LabelMe、QGIS配合手动矢量勾绘效率低且容易疲劳。批量标注时可以用半自动方式先用预训练模型对一批未标注影像做预测把预测结果作为初始掩膜导入标注工具标注人员只需要修正错分区域和边界效率提升很大。这块要在项目排期里留够时间一边训模型一边补样本是常态。务必统计每个类别的样本像素占比对占比极低但重要性高的类别如小水体、独立建筑要有针对性地补充样本与调整损失权重。3. 模型选型与训练细节Unet为什么还是那个最稳的基线3.1 主干网络到底怎么选卫星图像分割任务里Unet系列依然是目前实践中的最佳基线。原因说白了就两条第一U型结构中的跳跃连接把编码器的高分辨率空间细节和编码器高层的语义信息逐级融合对小目标需要细节、大目标需要语义的遥感影像特别契合第二Unet在公开数据集上已有大量开源权重和成熟配置踩坑成本低。相比之下DeepLabV3依靠空洞卷积拿到了更大的感受野在类别内部一致性上表现好但对小目标的边界细节容易抹平SegFormer、Swin Transformer这类基于Transformer的结构在大分辨率影像上由于Attention计算量巨大切块训练后性能收益常常被上下文缺失抵消对硬件要求也更高。我在实践中通常的做法是用ResNet34或者EfficientNet-B3作为Unet的编码器加上一个轻量的解码器。这里有个重要的训练细节编码器加载ImageNet预训练权重时需要把输入从224x224的尺度切换到实际训练尺度BatchNorm统计量会有一段时间不稳定建议在训练前几个epoch用较小的学习率做warm up或者在加载权重后先在验证集上forward一遍让BN统计量重新适应。另一个细节是输入分辨率卫星影像里建筑物、道路这类目标的尺度非常依赖于图像分辨率一般在训练时保持640到1024的输入尺寸推理时再按原图的切片大小处理。3.2 损失函数CrossEntropy之外的组合拳大多数遥感分割项目只靠CrossEntropy Loss训练是打不出好结果的。原因主要有两个类别极其不均衡、边界极其重要。一个典型的例子是城市建筑物提取整张图里建筑物像素顶多占20%到30%背景占大头直接用CrossEntropy模型很容易偏向把边缘判错、把背景误判为建筑。推荐组合拳是Dice Loss Focal Loss Boundary Loss的加权组合。Dice Loss直接优化类别区域的重叠度对类别不平衡非常友好但对小目标波动大训练初期容易震荡Focal Loss通过调节难易样本权重让模型关注那些容易混淆的像素训练早期用Focal Loss可以稳定收敛Boundary Loss则是在边界附近放大权重让模型把精力放到轮廓上适合建筑物、道路这类边界导向的任务。我在实际项目中常用权重是0.4 Dice 0.4 Focal 0.2 Boundary各组数据略有差异建议按验证集mIoU调一下比例。还有一个很容易被忽略的改进是把OHEM在线困难样本挖掘的思想加进去对每张训练切片把预测概率最高的那部分错误像素拿出来在反向传播时额外加权。遥感影像一个切片里往往大量区域是容易判对的均匀农田、平原困难样本集中在城市边缘、阴影区域、遮挡区域OHEM能有效提升这些位置的精度。3.3 训练超参数与增强策略实测卫星图像分割的训练增强有其特殊性。常规的随机裁剪、水平翻转、垂直翻转、旋转90度这种几何变换是标配但有两件事需要特别注意一是色度抖动要谨慎使用遥感影像的光谱值对地物判别非常重要过度改变色调会导致模型学到错误的光谱映射二是要对多尺度特别敏感遥感地物尺寸跨度大建议在线随机缩放0.75到1.5倍再裁剪或者把多尺度设为固定训练策略这样模型对目标尺度变化会更鲁棒。学习率和优化器没有太多花活AdamW配Cosine Annealing初始学习率2e-4warm up 3个epochbatch size根据显存尽量开到8以上。混精度训练用AMP即可遥感大图训练时显存省下来可以切更大的输入分辨率收益比模型复杂度更直接。训练到中后期如果mIoU迟迟不涨先回去检查数据不要盲目堆训练轮数。4. 卫星图像特有的大图推理问题切块、重叠与拼接4.1 为什么不能把整张影像直接送进模型卫星影像动不动就是几千乘几千像素直接把整张图送进GPU几乎必然爆显存哪怕是4090也扛不住。更重要的是很多分割网络的下采样倍数达到32倍如果输入尺寸不是32的整数倍特征图尺寸对齐会出现偏差导致输出标签图尺寸对不上。正常做法是推理时也保持和训练一致的切片尺寸用滑动窗口的方式逐块预测。4.2 切片策略重叠率、多尺度切片滑窗切片有两个关键参数窗口大小和重叠率。窗口大小通常和训练时的输入尺寸一致常见选择是512x512、768x768或1024x1024。重叠率一般取1/8到1/4这是为了消除相邻切片的拼接痕迹位于切片边缘的像素由于截断导致上下文信息不足预测结果往往不可靠重叠区域可以多次预测后取平均。我这里推荐一种更稳妥的方案推理时做多尺度预测将同一块切片分别缩放到0.75倍、1.0倍、1.5倍输入模型把三份概率图插值回原尺寸后取平均。多尺度对地物大小不均匀的遥感场景效果显著尤其是小目标和地物边缘实测能带来2到4个点的mIoU提升。缺点是推理时间大约是单尺度的3倍如果项目对速度敏感可以只在验证集上开多尺度线上推理只用单尺度加重叠拼接。4.3 拼接后处理边缘伪影与概率融合拼接后最常见的问题是切片边界出现明显的马赛克感——相邻切片在同一地物上的预测不一致接缝处形成规则网格线。解决思路有两个方向一是让模型对边缘预测更自信做法是在训练时对每个切片做边缘填充把切片上下左右各扩出一圈上下文再训练推理时再裁掉这部分二是在推理时对重叠区域的概率图做加权融合中心区域的置信度高于边缘区域权重函数可以用余弦窗或高斯窗。另外一个较大的坑是切块位置对结果的影响同一地物如果被切在不同的切片位置上预测结果可能不同。为了消除这种不确定性除了重叠也可以做两次推理第二次把原图平移半个窗口后重新切块最终把两次预测概率平均。这个方法在多尺度基础上还能再榨出一点精度尤其适合准备提交精度评测的场景。5. 迁移到自己的场景从训练到部署的完整闭环5.1 自建数据集与迁移学习的正确姿势自己业务里的地物类别和公开数据集几乎不可能完全一致所以迁移学习不是从零开始而是分阶段迁移先在较大的遥感公开数据集如DeepGlobe、Inria上预训练一个分割模型学习通用的遥感特征表示再加载这个权重在自建数据集上微调。这么做能明显缩短训练时间续航少走弯路。微调时要注意把分类头上的类别数改成自己的类别数最后一层卷积随机初始化学习率设为新层较大、主干层较小也就是分层学习率衰减。自建数据集的标注规范在动手前一定要讨论清楚。特别是不可见地物和阴影的归属问题比如树冠下方的人行道算道路还是算植被屋顶在邻栋建筑阴影里的部分算建筑还是算背景这些细节不统一标注员各自发挥最后数据集内部一致性会很差模型学出来的边界也乱七八糟。我的建议是把地物类别严格按投影可见的地表覆盖类别来定义阴影统一归给其下的真实地表类别标注规范里配上示例图这种投资回报率极高。5.2 评估指标别只盯着mIoU卫星图像分割里mIoU是大家最常说的指标但它有个被忽视的缺陷对极小类别的变化不敏感。比如道路只占全图的5%道路IoU从20%涨到40%整体mIoU可能只涨零点几个点看起来模型没提升实际对业务来说这是重大提升。报告结果时我建议把每类IoU列出来重点关注最小类别的IoU。另外Kappa系数在遥感分割中也常用它是对分类一致性的整体评价在地物类别分布极不均衡时比Overall Accuracy可靠得多。评估方式还要注意空间依赖问题很多公开数据集的标签存在空间自相关相邻像素类别高度相关如果只用随机分出的验证集评估分数会虚高。正确做法是按图切分。测试集和训练集不能来自同一幅图的重叠区域最好以图幅为单位划分用几整套影像做测试这才是真实泛化能力的反映。5.3 部署时的速度与显存取舍模型训练好后落地部署主要的痛点是推理速度。遥感大图推理时滑窗重叠和多尺度预测叠加起来单张大图的推理耗时会非常可观。我做过一个统计1024x1024输入尺寸的Unet对一张5000x5000影像无重叠单尺度推理耗时约3到5秒加了重叠和双尺度后能到20秒以上如果业务要求分钟级出结果必须做取舍。实际部署中常用三板斧第一把推理分辨率对齐到训练分辨率的一半或更低例如训练用1024推理用768或640遥感任务对分辨率降低的容忍度比检测任务高一些第二用TensorRT或ONNX Runtime做INT8量化熟悉分割网络的话量化对mIoU的损伤通常可以控制在1到2个点之内第三把概率图输出改成只输出argmax的颜色标签图避免大块概率张量的传输。对边缘设备部署可以考虑使用轻量级分割模型例如把Unet的编码器换成MobileNetV3解码器换成轻量化ASPP精度损失约3到5个点但推理速度能快一倍以上。6. 我自己踩过的一些坑提前帮你排掉做卫星图像分割项目这两年半我踩过不少坑分享几个比较典型的省得后来的人再走一遍。第一个坑是数据集的影像来源不一致训练集用了一部分无人机低空影像一部分卫星影像分辨率差距很大模型学得混乱后来专门给不同来源的样本加了来源标签用域自适应方法修正才算稳住。更合理的做法是开始就控制影像来源不同传感器数据要么分开模型训练要么做分辨率归一化后再混用。第二个坑是训练时忘了做负样本处理。卫星影像里有很多完全无用的区域比如大片云层、整幅的深色水体模型在这些区域学不到语义却会干扰BatchNorm的统计量导致训练不稳定。建议在dataloader里先做云掩膜过滤、低信息量过滤把无效区域样本比例压到10%以内。第三个坑是验证集和训练集划分不当导致的严重过拟合假象。早期我用的验证集和训练集来自同一张大幅面影像的随机切片模型在验证集上mIoU很高换到一幅新影像后掉得让人怀疑人生。后来统一按图幅切分做评估验证集完全来自独立影像评估数字才算真实可靠。凡是涉及遥感影像分割的项目这项原则一定要早点定下来。最后一个建议不要追求模型结构的新奇把时间和精力多花在数据质量和推理工程上。卫星图像分割是一个典型的数据天花板问题把标注规范、样本平衡、推理拼接这些功夫做到了一个经典的Unet也能得到相当能打的效果。先把标准化流程跑通再考虑引入Transformer结构或者更多光谱通道这个顺序是最稳妥的。本文还有配套的精品资源点击获取
返回列表