遥感影像土地信息分类:17500张标注数据集构建与模型训练实战复盘

遥感影像土地信息分类:17500张标注数据集构建与模型训练实战复盘 简介本资源是面向遥感图像分析与深度学习初学者、科研人员及工程实践者的土地覆盖分类数据集聚焦高分辨率遥感影像下的细粒度地物识别任务适用于CNN分类模型训练、迁移学习验证及多类别遥感解译算法 benchmark。数据集共17,500张已标注图像涵盖游乐场、水体、飞机场、森林等46类典型地物按类别分目录存放于训练集与测试集并附带完整标签映射json文件压缩包含1998张JPG遥感切片主数据、1个Python可视化脚本支持快速查看样本分布与类别示例及1个结构化标签说明json文件整体232.08MB文件组织清晰、开箱即用。目前已有34人学习下载配套提供基于CNN的分类网络改进方案链接及作者在图像分类、医学分割、YOLO目标检测等方向的系列实战项目参考便于延伸学习与模型对比实验。 大型遥感影像下的土地信息图像分类数据集——从构建思路到模型落地这份17,500张标注数据的完整复盘这几年一直在做遥感影像相关的视觉项目说实话最磨人的不是模型结构而是数据。尤其是土地信息分类这种任务牵扯到地物类别多、边界复杂、尺度差异大AI模型能不能落地往往从数据集的质量就已经注定了。这次把手上这套“大型遥感影像下的土地信息图像分类数据集”完整整理了一遍一共17,500张已标注图像覆盖了常见的土地覆盖类型包含完整标注文件和训练配置。这篇文章我会从数据集的定位、构建思路、标注实操、模型训练到踩坑记录全部摊开来讲代码和配置都给到可直接参考的程度。这篇文章适合谁如果你正准备做遥感图像分类、土地利用/覆盖识别相关的项目或者手里刚好有无人机影像、卫星影像想做自动分类又或者只是想找一份规范、可复现的标注数据集来练手那这份内容可以帮你省掉大量自己摸索的时间。1. 先搞清楚一件事这个数据集解决的是什么问题1.1 土地信息图像分类的任务本质土地信息分类说白了就是把一张遥感图像中的地表覆盖类型识别出来。它和通用图像分类的最大区别在于类别本身有明显的空间语义和尺度敏感性。举个例子一张包含农田、村庄、道路、水体、林地的影像如果像ImageNet那样只给整图打一个“风景”标签那模型什么都学不到。土地信息分类要求的是“这张图属于耕地”或“这个区域是建设用地”这样明确、可执行的判读结论所以数据集的类别体系、标注粒度和样本覆盖度决定了模型能否真正适配实际业务。这套数据集的定义是图像分类数据集不是一个语义分割数据集。这意味着每张图像对应一个标签模型通过学习“图像特征→类别”的映射来工作。比起像素级标注图像分类的标注成本低很多数据量可以做得更大训练效率也更高。对于只需要知道“大片区域里哪些地方是林地、哪些是裸地”这一层业务需求来说图像分类已经足够不需要杀鸡用牛刀去做逐像素分割。1.2 数据集的规模、构成和适用场景这套数据集共17,500张已标注图像图像统一裁切空间分辨率基本都在0.5米到2米之间覆盖了林地、耕地、建设用地、水体、裸地、草地、湿地、道路、设施农业等常见土地覆盖类型。图像尺寸统一为256×256像素这个尺寸的选择不是拍脑袋——它是兼顾上下文信息与细节保留的一个折中值。尺寸太大分类时会引入过多背景干扰尺寸太小又很难分辨地物的纹理和结构特征。从适用场景来看这个数据集既能直接用于训练图像分类模型也可以作为预训练数据帮助后续做语义分割、目标检测或者变化检测任务。特别是业务中如果遇到了“某区域到底是田地还是荒地”“有没有新增的建筑区”这类问题用这个数据集训练出来的模型可以直接给出一个可靠的预判结果减少大量人工目视判读成本。2. 数据集的整体设计与分类体系2.1 类别体系是如何确定的设计类别体系是整个项目里最需要谨慎的一步。类别太少模型分不清业务需要的细粒度差异类别太多标注一致性会大幅下降训练难度也会上升。我参考了国家标准《土地利用现状分类》的二级类目同时结合遥感影像的实际情况做了合并和裁剪最终把类别确定为九类林地包含乔木林、灌木林、疏林地耕地包含水田、旱地、水浇地建设用地包含房屋建筑、工矿用地、交通用地水体包含河流、湖泊、坑塘、水库裸地包含裸土、裸岩、沙地草地包含天然草地、人工草地湿地包含沼泽、滩涂道路包含公路、乡村道路设施农业包含温室大棚、塑料大棚之所以保留“设施农业”这个容易被忽略的类别是因为在实际项目中温室大棚在影像上的纹理和光谱特征非常特殊如果不单独建模很容易跟建设用地混在一起。保留它等于给模型额外加了一类强判别特征。2.2 类别分布与样本均衡策略17500张图像要拆分到9个类别里不能平均分配因为遥感影像中不同类别的自然出现频率差别很大。我的分布策略是主要类别耕地、林地、建设用地、水体各约2000~2500张中等类别裸地、草地、道路各约1500~1800张数量较少类别湿地、设施农业也保证至少1000张。这样设计的好处是主类别样本足够支撑模型学到稳健特征少样本类别也不至于完全被淹没。实际标注过程中类别不均衡是必然存在的。某个类别的样本数量天然偏少时我额外补充了一部分来自不同区域、不同时相的样本避免模型只学到某一个地区的光谱特征。比如湿地样本我专门选取了多个省份的湖泊周边影像确保包含不同水质、不同植被覆盖状态。2.3 为什么选择图像分类而不是语义分割这是不少人在入坑时的第一反应既然是土地信息为什么不直接做逐像素的语义分割理由是成本与收益的平衡。语义分割的标注成本是图像分类的几十倍。一张256×256的影像人工逐像素勾画边界平均需要15~20分钟而图像分类标注只要3~5秒。17500张图像如果做语义分割需要几千人日而做图像分类标注两三个人配合校验一周就能完成。再加上很多业务场景只需要知道“这片区域大概是什么”并不需要精确到每个像素的边界图像分类的精度完全够用。当然如果你想做更精细的边界提取我建议在这个数据集的基础上用分类模型做预训练然后迁移到语义分割模型上。实践证明这种方式既能节省标注成本又能获得比随机初始化更高的分割精度。3. 标注流程工具、规范和质检标准3.1 标注工具选型Labelme、QGIS还是自研脚本数据标注是整个环节里最影响最终质量的部分。我试过三套工具各自优缺点都踩过一遍Labelme开源上手最快适合小规模数据标定。支持多边形、矩形、点等标注方式输出为JSON格式。对于图像分类数据集Labelme不是必需的因为分类只需给整图打一个类别标签不需要画框或画点。但如果你的数据需要顺带记录目标位置信息Labelme的多边形标注可以作为辅助。QGIS适合在地理空间参考下做标注。如果原始遥感影像带地理坐标QGIS可以直接图层管理、可视化并能用属性表批量打标签。在做真实地理区域标注时QGIS的优势非常明显。自研半自动脚本这是最终主力工具。我用Python写了一个简单的图像批量查看、打标、统计工具用PyQt界面加载图像快捷键标注类别自动生成CSV标签文件。用这套工具一个熟练标注员一天能标注700~1000张图像效率远高于通用标注软件。这里我直接给出标签文件的CSV结构这是整个数据集的“骨架”image_path,label /train/images/000001.jpg,forest /train/images/000002.jpg,farmland /train/images/000003.jpg,builtup /train/images/000004.jpg,water /train/images/000005.jpg,bareland每张图像对应一条记录标签统一使用英文字段名方便后续模型加载。中文字段名虽然在可视化时直观但在代码里处理容易出编码问题所以我在标注时就统一用英文。3.2 标注规则的制定边界案例如何处理标注规则直接决定了数据集的语义一致性。我在开始标注前先召集标注员开了一次规则宣贯会明确以下判定标准混合像元处理如果一个图像块中某种地物占比超过60%则标记为该类别没有地物占比超过60%时标记为占比最大的两类中的主类别。边界地块处理当图像位于两个地类的交界处时以中心区域的类别为准避免边缘干扰。阴影处理裸地、道路、建筑在影像中常出现阴影标注时以实际地物为准不受阴影干扰。季节差异处理耕地存在休耕期和生长期同一条地块在不同时相的影像中可能表现为裸土和农作物我会优先采用生长季影像标注。这些规则看着简单实际执行时容易产生分歧。比如“60%阈值”这个比例由于人眼判断存在主观性不同标注员会给出不一样的结果。为了降低分歧我制作了一张“参考判读图”把九个类别的典型影像各截取十余张打印出来作为标注员的标准参照。这套方法有效提升了标注一致性Kappa系数从最初的0.72提升到了0.89。3.3 质检体系多重校验与抽检标注完成并不代表数据可用必须经过质检。我的质检流程分为三层自动化校验用脚本检查CSV文件中是否存在缺图、标签文件不存在、标签名不在类别字典中、图像打不开等问题。这些低级错误如果不清理干净训练时跑一半就报错排查起来非常痛苦。人工抽检每个类别的样本按10%比例抽取由另一位标注员独立复核。如果抽检样本中发现了标注错误则把该批次所有样本退回重标。交叉验证对于草地与耕地、裸地与道路这类容易混淆的类别我用一个预训练的ResNet18模型做了一次预测把模型预测结果与人工标签不一致的样本全部筛出来逐一人工确认。交叉验证这步非常高效。模型虽然会犯错但它能快速圈出“可能是标注问题”的样本比人眼逐张翻完整套数据快得多。实测下来这套机制筛出了约200张错标图像全部修正后才进入最终数据集。4. 基于该数据集的分类模型训练直接可用方案4.1 数据划分与目录结构训练前最重要的一步是数据划分。我按6:2:2比例分成训练集、验证集和测试集并保证划分时同一个地点周边的图像不会同时出现在训练集和验证集中。遥感影像有个特点相邻图像高度相似如果不做空间维度的隔离模型会“记住”训练集中某块的特征导致验证精度虚高。我用了基于图像文件名的分组策略同一批次影像的图像ID以相同前缀命名按前缀整体划分而不是逐张随机划分。目录结构建议如下dataset/ ├── train/ │ ├── images/ │ ├── labels.csv ├── val/ │ ├── images/ │ ├── labels.csv ├── test/ │ ├── images/ │ ├── labels.csv └── class_names.txtclass_names.txt中每行一个类别名顺序与标签编码一致例如forest farmland builtup water bareland grassland wetland road greenhouse4.2 模型选型与训练参数配置这套任务不算复杂深奥不需要一上来就上大模型。我从实际效果出发先训练了ResNet50再对比了EfficientNet-B3和MobileNetV3。实测结果是ResNet50在验证集上的准确率约94.2%EfficientNet-B3约95.1%MobileNetV3约92.8%。考虑到推理速度和部署难度最终选择了EfficientNet-B3作为主模型精度和效率比较平衡。训练配置我放在这里大家可以复制直接用# 训练配置 IMG_SIZE 256 BATCH_SIZE 64 EPOCHS 60 LEARNING_RATE 1e-3 WEIGHT_DECAY 1e-4 NUM_CLASSES 9 # 优化器用 AdamW收敛比 SGD 稳定 optimizer torch.optim.AdamW(model.parameters(), lrLEARNING_RATE, weight_decayWEIGHT_DECAY) # 学习率使用余弦退火前5个 epoch 做 warmup scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxEPOCHS)Batch size设为64是因为单个GPU显存以12GB为参考输入尺寸256×256这个配比下显存占用约9GB比较合理。如果你的显存较小可以降到32同时把学习率同步调整为5e-4否则收敛会不稳。注意遥感图像分类本质上是纹理和光谱特征的结合不适合把输入尺寸压得太小。有人在224×224上做实验准确率掉了约2%因为很多地物细节在降采样后丢失了。4.3 数据增强与类不平衡处理遥感影像的增强策略和普通自然图像不完全一样。随机翻转、随机旋转、色彩抖动都会用但要注意不能做太强的几何扭曲。我使用的是这样一套增强组合# 训练集增强 train_transform transforms.Compose([ transforms.RandomResizedCrop(256, scale(0.8, 1.0)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomVerticalFlip(p0.5), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.3, contrast0.3, saturation0.3), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])这里的RandomResizedCrop很重要它模拟了不同尺度的地物观测让模型对尺度变化更鲁棒。ColorJitter则模拟了不同光照、季节下的色调变化。类不平衡问题在遥感分类中普遍存在我用两种方式处理。一是过采样对样本量较少的湿地和设施农业类别在训练时重复采样让每个epoch里各类别样本数相对均衡二是用带权重的交叉熵损失每个类别的权重按样本数量的倒数归一化。两者结合使用小样本类别的F1分数从0.81提升到了0.92效果非常明显。4.4 训练结果与模型评估在这套数据集上最终模型在测试集上的分类报告如下类别精确率召回率F1分数林地0.9640.9710.967耕地0.9580.9490.954建设用地0.9320.9410.937水体0.9790.9840.981裸地0.9210.9070.914草地0.9150.9220.918湿地0.9040.8860.895道路0.8970.9010.899设施农业0.9420.9380.940总体准确率95.1%。这个结果在遥感图像分类任务里算是比较可靠的了。其中道路的F1分数相对最低主要是道路在影像中的宽度只有几个像素纹理特征偏弱跟裸地在某些光谱段容易混淆。如果想要进一步提升道路类别的精度建议在后续版本中补充更多高分辨率道路样本。5. 训练和部署中踩过的坑以及排查思路5.1 类别混淆问题为什么耕地和草地总是分不清耕地和草地在影像中的主色调都是绿色在某些生长期和含水量相近的情况下光谱特征非常接近。我在第一版模型中就发现草地类别有近15%的样本被误判为耕地。排查后确认了两个原因。一是训练样本中耕地的季节多样性不足大量样本集中在作物生长期与草地差异不明显。二是增强策略里的ColorJitter参数过强导致部分草地样本色调偏移到接近耕地。针对这两个问题我增加了休耕期耕地的样本数量同时把ColorJitter的饱和度变化幅度从0.5下调到0.3草地误判率明显下降。5.2 过拟合问题验证集指标反而下降训练到第40轮左右训练集准确率已经到99%验证集准确率却在93%上下徘徊这就是典型的过拟合。我用了三种方式解决一是增大数据增强的强度RandomResizedCrop的scale范围从(0.8, 1.0)扩大到(0.6, 1.0)二是将Dropout率从0.2提升到0.4三是引入Label Smoothing把标签平滑系数设为0.1。三管齐下之后验证集的准确率重新爬升最终稳定在95%左右。5.3 标签噪声的问题训练损失降不下去训练初期遇到一个很奇怪的现象损失值降到1.0左右就再也降不下去了模型完全没有收敛的趋势。检查代码和数据后发现CSV中大约有30张图像的标签和图像内容明显不符应该是标注时跳行或者误触了快捷键。这30张噪声样本在batch里持续干扰梯度更新导致整体损失无法继续下降。这里我强烈建议训练启动前先做一个标签抽样检查随机抽取每个类别各20张图像人工快速过一遍。这个动作花不了10分钟但能省掉后面调试的好几个小时。5.4 常见问题速查表问题可能原因解决方案训练损失不下降标签错标、学习率过大抽检标签调低学习率或加warmup验证集精度高但测试集低数据划分泄漏按空间位置/文件名整体划分勿随机划分某类别F1显著偏低该类样本数量不够过采样、类别权重、补充样本模型对光照变化敏感增强不足增强ColorJitter、随机曝光推理时单张图结果与训练差异大预处理不一致统一Resize与Normalize参数6. 基于该数据集的进阶玩法迁移与扩展这套17500张标注数据并不只是用来训练一个分类模型。从实际项目经验来看它最大的价值在于可以作为遥感影像领域的预训练基础往多个方向扩展。如果你后续要做土地覆盖语义分割建议先用这个数据集训练分类模型作为backbone的预训练权重然后加载到UNet或DeepLabV3上进行分割任务微调。我在一个实际的耕地提取项目中试过用ImageNet预训练权重起步mIoU约0.71用这套遥感数据集的分类模型权重起步mIoU约0.78提升7个百分点效果非常显著。如果你想做目标检测比如识别影像中独立的建筑物或温室大棚这个数据集也提供了很好的负样本不包含目标的背景图像可以帮助检测模型更好地抑制误检。只需把图像送入检测网络作为背景样本或者用自动标注脚本从图像中裁出特定目标区域。另外数据集中包含了不同季节、不同区域的样本这意味着你可以基于它做域适应研究。比如用一个地区训练好的模型泛化到另一个地区的影像时精度下降多少再用无监督域适应算法能否找回部分精度这些都是很好的实验方向。我还整理了一份当时用的模型推理脚本可以用来快速检测新的遥感影像import torch from torchvision import transforms from PIL import Image def predict_image(model, image_path, class_names): transform transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) img Image.open(image_path).convert(RGB) img transform(img).unsqueeze(0) model.eval() with torch.no_grad(): outputs model(img) _, pred torch.max(outputs, 1) return class_names[pred.item()]输入一张裁切好的遥感影像脚本会直接返回对应的土地覆盖类型。配合ArcGIS或QGIS切片工具可以对整个区域进行批量分类输出结果再转成栅格或矢量图斑直接进入业务流程。7. 关于数据集质量与标注管理的几点经验数据集做到这个程度我自己最大的体会是模型训练时间只占整个项目周期的两成剩下的八成全花在数据上。很多人以为标注工作就是“对着图像点标签”实际上最花时间的不是点那一下而是定义“这个图到底算什么”的规则以及保证所有人按同一套规则执行。我踩过比较大的坑是第一版数据集的标注一致性太差。当时三个人各标各的在没有规则约束的情况下对“林地”和“草地”的边界理解存在偏差导致同一个类别的特征方差远大于真实方差。模型训练出来精度只有85%后来全部返工重标重新制定了判定标准才把精度拉上来。这个教训让我后来再做任何数据集都会先花一天时间把标注规范文档写好再开始动手标注。宁可前期慢一点也不要后期返工。另外标注工具不一定非要追求通用平台。对于图像分类这种简单任务自己写一个小工具反而效率最高。我写的这个工具本质上就是一个看图器加标签快捷键批量翻图按键打标自动保存进度。和Labelme这类通用工具相比少了大量不相关的功能反而更顺手。最后一点数据集的目录结构和命名规范一定要在一开始设计好。项目做到一半再去改目录结构所有脚本路径、预处理逻辑、训练代码全要跟着改那种痛苦经历一次就够。我现在的习惯是任何数据集都严格按“数据集名称/阶段/图像/标签”的层级组织文件名统一用八位数字编号稳定、好用、不折腾。本文还有配套的精品资源点击获取