遥感语义分割数据集构建实战:从Sentinel-2影像到像素级耕地标注全流程
简介荷兰耕地语义分割遥感影像数据集是一份面向GIS、农业遥感和深度学习研究者的高质量标注数据可用于耕地提取、土地覆盖分类及语义分割模型训练。压缩包内共2000个xml标注文件整体大小约786.99MB这些文件配合原始遥感影像可转换为像素级标签数据适合作为CNN等分割模型的训练与验证集。数据集已完成逐像素类别标注覆盖耕地、水体、建筑等典型地物并包含与影像对应的空间坐标和属性信息可直接用于农作物长势监测、耕地变化分析、非法占地检测等场景。资源结构清晰便于按影像编号与标注文件快速匹配置入实验流程。对于需要自动化识别农田边界的项目该数据集既能减少人工标注成本也能帮助模型更好地泛化到不同地块形态。目前已有1596人学习下载兼具科研与工程应用价值适合需要标准耕地语义标签的算法工程师、遥感专业学生及相关领域研究人员。 做遥感语义分割的同行应该都有体会真正值钱的不是模型结构而是手里那份靠谱的数据集。最近我刚好完成了一套荷兰耕地场景的遥感影像语义分割数据集覆盖荷兰主要大田作物类型所有地块都做了像素级标注前前后后投入了约三个月时间。这篇文章就把从数据源选择、标注方案、质量控制到训练验证的完整过程拆开讲一遍想自建遥感数据集、或者正被标注任务折磨的团队应该能从中找到可以直接抄走的经验。整个项目的核心投入在“标得准”和“标得一致”这两件事上。遥感影像语义分割数据集和普通自然图像数据集不太一样它的类别体系、坐标精度、时相选择都会直接影响模型效果环节比想象中多。下面按准备、标注、训练、问题排查四个阶段来展开。1. 项目背景与数据集设计思路1.1 为什么选荷兰耕地作为切入点选荷兰不是偶然。荷兰农业高度集约化地块平整作物类型相对固定主要大田作物就是马铃薯、甜菜、冬小麦、青贮玉米、洋葱这几类这对于语义分割任务来说是近乎理想的“试验田”。地块边界清晰作物成行成垄影像上的纹理和光谱特征都比较稳定标注歧义少模型也容易学。更实际的一点是荷兰有公开的地块注册体系欧盟共同农业政策下的地块识别系统LPIS在荷兰落地为农用地块注册数据每块田的边界都有矢量记录。虽然这些边界不能直接当语义掩膜用但作为标注底图能省掉大量“从零勾勒地块”的工作量标注员只需要把精力放在作物类别判定和边缘修正上。这对任何想快速建立私有数据集的团队都是一个启发先找官方或行业现成的矢量边界再叠加影像做精修效率会高很多。从应用角度看荷兰耕地场景代表的是典型的温带集约化农业区模型训练出来后对类似气候和种植结构的地区有比较好的迁移潜力。无论是农情监测、农业保险定损还是精准农业中的变量作业这套数据都有直接的参考价值。1.2 数据源与预处理方案主数据源我选的是Sentinel-2 L2A表面反射率产品空间分辨率10米。之所以不用更高分辨率的商业影像一方面是因为Sentinel-2免费且覆盖完整另一方面是10米分辨率对耕地尺度的语义分割已经够用单块田少说也有几公顷边界不会糊到不可用。波段选择上不能只拿RGB三通道否则有些作物根本分不开。我保留了B2蓝、B3绿、B4红、B8近红外这4个10米波段再把红边B5、B6、B7、窄近红外B8A、短波红外B11、B12这6个20米波段重采样到10米最后组成10通道输入。红边波段对植被种类识别价值极高短波红外对土壤含水量和残茬敏感少了这些波段甜菜和马铃薯在生长中期的区分度会明显下降。重采样用GDAL的gdalwarp方法选双线性同时注意避免在重采样时引入异常混合像元。时间窗覆盖4到9月的生长季每个月挑云量最低的一景一般选云覆盖小于10%的影像。Sentinel-2 L2A自带场景分类图层可以直接用来做云掩膜。我额外用s2cloudless做了交叉验证把部分残留薄云也去掉。单时相影像很难同时分辨所有作物比如6月份马铃薯和甜菜的冠层结构很像但到7月下旬甜菜封行后光谱差异就出来了所以多时相是必要的。所有影像统一投影到EPSG:32631也就是UTM 43N对应区域的标准参考系。这个步骤不能省原始数据里坐标系统五花八门不统一定会导致后续影像和掩膜错位。1.3 类别体系设计从地块语义到训练标签类别设计是数据集最核心的决策我踩过不少坑才定下最终方案。原则是“耕地内部尽量细分非耕地适当粗分”因为项目目标聚焦在作物识别但农业场景里道路、建筑、林地这些背景类也不能扔模型需要知道“什么是耕地”。类别ID类别名称说明0背景非目标区域包括建筑、工业区等1马铃薯大田马铃薯2甜菜糖用甜菜3冬小麦冬季播种的谷物4青贮玉米饲料玉米5洋葱大田洋葱含黄洋葱和红洋葱6其他作物面积小或零星出现的作物合并处理7草地人工或天然牧场8裸土/休耕地无作物覆盖或休耕状态9水体沟渠、池塘、河道10道路及其他不透水面柏油路、水泥地、田埂硬化面11林地/树篱树木、灌木、防风林带最开始我试过把每种小作物都单独列出来比如亚麻、油菜、豌豆、花卉球茎结果标注成本瞬间爆炸而且部分作物样本量太少模型根本学不动。后来统一合并成“其他作物”这一类整体效果反而稳定很多。这是一个重要经验类别体系设计要跟样本量和标注成本匹配不要贪多。草地和休耕地虽然容易混淆但农业应用里这两类必须分开因为休耕地往往意味着政策补贴或轮作计划所以保留了细分。2. 标注流程详解从地块到像素级掩膜2.1 标注工具选型与配置工具选型上我试了LabelMe、QGIS、CVAT和x-anylabeling最后实际用的是“QGIS CVAT”的组合方案x-anylabeling只留在本地做快速验证。LabelMe的问题是多人协作太弱项目一大人就乱QGIS适合做矢量标注直接编辑地块边界很快但它做像素级标注和类别属性管理很别扭无法高效做任务分配CVAT支持多人Web协作、任务分配、标签体系管理而且能接入Segment Anything模型做预标注这是效率提升的关键。x-anylabeling更适合加载自己已训练好的模型做半自动标注但团队协作和任务管理功能不够完善所以没作为主线。实际操作中我的流程是先在QGIS里加载LPIS地块边界数据基于影像把感兴趣区域的矢量地块整理出来导出GeoJSON然后把GeoJSON导入CVAT在CVAT里完成像素级边界修正和类别属性标注。CVAT里可以给不同类别设置不同颜色标注时一眼就能看出类别分布。坐标系统在导入前统一到EPSG:32631同时保留一份EPSG:28992字段备查避免以后做本地化应用时还得重新投影。输出格式上CVAT可以导出COCO格式或单通道mask。对遥感大影像我建议导出单通道PNG格式每个像素存类别索引而不是直接灌COCO因为遥感影像尺寸动辄几千像素COCO的json序列化会十分臃肿后续训练也不方便。2.2 标注规范与质量控制办法这个阶段最大的坑不是标注本身而是“标注员之间认知不一致”。同一块田有人把边缘田埂划进耕地有人划到背景有人把休耕长草的地块标成草地有人标成休耕地。这些歧义如果不解决模型训练时就等于在学一个自相矛盾的目标。我们的规范里明确了几个硬性约定田埂和地头的机械掉头区一律算背景沟渠水体算水体类别宽度小于2米的树木线归林地单块面积小于500平方米的孤立地物直接并入背景。这些规则看起来琐碎但写清楚之后标注速度反而更快因为减少了纠结时间。质量控制用双层机制。每个地块由两人独立标注如果两者IoU低于0.9就进入第三方仲裁。同一张影像的两次标注结果一致性本身就是一个很好的质量信号如果某个标注员的IoU系统性偏低需要单独沟通对齐规范。每周抽检5%已完成的任务统计抽检通过率。通过率低于95%时当周全部任务需要返工检查这一步虽然耗时但能避免大量低质量数据悄悄混进最终数据集。工时方面在接入SAM预标注后一个熟练标注员加一个校验员每天大概能完成1.2平方公里农田的精细化标注。如果纯手工勾勒边界效率会降到每天0.5平方公里左右。这个数据可以作为团队排期的参考。2.3 多时相影像的协同标注策略单看一景影像时不同作物的区分难度完全不同。6月的影像里马铃薯和甜菜长得非常像都是绿色的成行作物不做其他时相对比标注员很容易标混。我们的解决方案是先把多时相影像按时间顺序排列在NDVI时间序列上先“定类别”再回单时相上去“修边界”。具体做法是这样的。在QGIS里先计算出每个地块在整个生长季的NDVI曲线统计出每条曲线的高峰时间、峰值和衰退速度。甜菜的NDVI峰值出现在7月中旬之后冬小麦在6月中旬就进入黄熟期NDVI明显下降洋葱的NDVI全程偏低马铃薯的NDVI则在中后期出现摆动。这批曲线信息做成标准参考图标注员在给某一景影像标注前先看一遍这些物候参考再决定地块属于哪一类。CVAT里可以把多张影像同时加载为不同图层标注时切换对比边界修起来很直观。这个方法极大减少了标注歧义尤其是小麦和玉米这类物候差异明显的作物。纯靠标注员看图猜分类准确率顶多85%加了物候参考后能稳定在95%以上。3. 训练验证全流程与关键参数3.1 数据集划分方案划分数据集时有一个特别容易忽略的坑不能用像素随机划分必须按地块来分。遥感影像存在严重的空间自相关性同一块田里的像素高度相似如果把一块田的像素同时分到训练集和测试集模型相当于开卷考试测试指标会虚高一大截。我们的划分方式是先把所有地块按地理范围聚类保证同一地块的所有像素落在同一个集合里然后按70%训练、15%验证、15%测试的比例分配。切块时设置64像素的重叠区减少切片边缘信息丢失。最终生成train.txt、val.txt、test.txt三个清单文件每行对应一张切片影像和掩膜的路径。掩膜用单通道PNG保存值域是0到11的类别索引文件名与影像保持一致。同时维护一个class_mapping.json记录类别ID到类别名称的映射并标注每个类别的像素占比。这个文件在训练前做类别权重计算时用得上也是未来分享数据集时的重要元数据。3.2 训练配置与超参数参考模型部分第一版用U-Net加ResNet50编码器做基线后续对比了DeepLabV3和SegFormer-B2。U-Net在耕地这类边界清晰但细节多的任务上表现不错SegFormer的优势是长距离依赖建模更好但对小目标作物不一定有明显提升。实际以基线模型为正式版本因为训练和推理都更省资源。输入尺寸设512×512多光谱输入为10通道。batch size设为8在单张24G显存的卡上勉强能跑如果显存不够就降到4或换用混合精度。优化器用AdamW初始学习率1e-4采用poly学习率调度power设为0.9总训练轮次120轮。Loss是损失函数组合交叉熵0.4权重Dice Loss 0.3权重Focal Loss 0.3权重。交叉熵保证整体收敛稳定Dice Loss缓解类别不平衡Focal Loss让模型更加关注难分的边界区域和小类别地块。单独用交叉熵在小类别上很容易崩溃洋葱这类面积较小的类别需要Focal来兜底。增强方面用了随机翻转、90度旋转、随机缩放0.8到1.2、轻微色彩抖动。增强力度不能太大尤其不能对多光谱波段做大幅颜色偏移否则会破坏作物光谱判别性。这个细节很多教程不会提但对遥感任务非常重要。多光谱输入适配ImageNet预训练权重时前3个通道直接复用RGB预训练权重其余通道用对应波段均值初始化。更理想的做法是一个简单的自监督预训练但受限于成本没有采用最终效果依然在可接受范围。参数项设置值备注输入尺寸512×512可微调输入通道数10B2/B3/B4/B8 6个20米波段batch size824G显存可跑优化器AdamWlr1e-4学习率调度polypower0.9Loss权重CE 0.4 Dice 0.3 Focal 0.3缓解类别不平衡训练轮次120早停patience153.3 指标解读最终验证集上整体mIoU在0.79左右总体精度OA约90%结果符合预期。具体到类别差异很大。类别IoU参考值背景0.87马铃薯0.81甜菜0.78冬小麦0.84青贮玉米0.82洋葱0.71其他作物0.64草地0.76裸土/休耕地0.72水体0.86道路及其他不透水面0.83林地/树篱0.85混淆主要集中在三组草地和休耕地马铃薯和甜菜道路与裸土。草地和休耕地在影像上确实很像尤其是刚翻耕的休耕地和退化草地很难区分马铃薯和甜菜在特定生育期光谱重叠严重道路和裸土在干燥环境下色调接近。如果后续想优化需要引入更多时相或更高质量的高分影像作为补充。4. 常见问题排查与后期扩展4.1 踩坑实录与解决方案数据标注和训练过程中我遇到了一批典型问题单独列出来供参考。问题现象可能原因解决方案模型几乎不预测洋葱类小类别样本不足被当噪声忽略Focal Loss加权、过采样小块、类别加权采样地块边界出现锯齿状分割标注时像素级手工勾边导致边界噪声后处理用CRF或形态学平滑根本解法是标注时保留矢量边界6月效果好但9月效果骤降训练集时相单一物候变化未覆盖训练输入混入多时相样本或做时相归一化草地/休耕地标注混乱标注员理解不一致规范中加入前后影像对照判定增加考核图影像与掩膜错位几个像素投影系统未统一或切块偏移统一EPSG后再切块切块后用同名文件做像素级校验训练loss不下降且mIoU≈0.1类别索引与调色板不对应检查mask是否被CVAT或存储工具自动量化统一用无损PNG自然图像模型迁移效果差直接套ImageNet归一化统计量用数据集自身的均值和标准差重新归一化第一个坑类别不平衡是最典型的。耕作区里洋葱这类经济作物种植面积远小于马铃薯和玉米像素占比可能不到1%模型在交叉熵优化下直接忽视它们。我们最后用了组合Loss搭配过采样才算把小类别拉起来。实际落地时建议专门统计一下每类像素占比然后按逆频率设计采样权重这一步比调模型结构更重要。第二个坑边界问题是遥感语义分割独有的。自然图像里物体边界相对柔和耕地地块边界却极其锐利标注员手工逐像素抠边必然产生锯齿。后来我们把标注精度要求改成“边界误差不超过1个像素”同时后处理里加了CRF边界的规则感好了很多。坐标错位的问题也出现过一次。一个实习生单独负责的切块任务里影像从EPSG:28992转到EPSG:32631时用了错误的转换参数导致一批mask整体偏移了约10米相当于整整1个像素。这批数据最后全部重做了。教训是任何投影转换都要用参考点和地物轮廓做像素级验证不能只看坐标数字对。4.2 数据集后续可扩展的方向做完整套流程后这套数据的价值远不止当前这批mask。最简单的扩展是把保存下来的地块级矢量直接转成实例分割或目标检测数据集因为地块自带边界转成多边形很自然之后再训练作物检测模型几乎不需要额外标注成本。主动学习也是一个非常值得走的方向。训练好的模型会对置信度低的区域给出提示把这些区域挑出来优先补标实际上是在用一个迭代闭环持续降低维护成本。新一年度的影像进来后模型可以自动识别新地块、标注大概率类别人工只需要审核和修正局部标注量能再降一半。多模态融合也具备潜力。荷兰类似地区的无人机影像、高分辨率航空影像、甚至3D点云都可以用当前数据集做种子数据迁移学习到一个细粒度更高的场景分析模型。这套数据集是“第一桶金”后续扩展全都从这次沉淀的标注规范和工具链路里受益。做这个数据集让我最大的感受是标注规范比标注量更重要。你定的每个类别定义会被标注员和模型同时继承边界歧义最终都会变成模型误差。如果你想做类似的数据集强烈建议先花两三天把类别定义和标注协议写清楚再放开量去标。另一个实用建议是标注时顺手把地块级矢量单独存一份以后要做实例分割或目标检测直接复用矢量等于白赚一套数据。本文还有配套的精品资源点击获取
