简介:面向遥感城市图像语义分割任务,这份数据集约含1000张已处理好的影像与对应标签,覆盖8个类别(0背景、1建筑等,类别含义见classes.txt),无需额外标注和预处理,可直接用于U-Net、SwinUnet等模型的训练与对比实验。数据已经划分好训练集和验证集:训练集约有800张图片及其掩膜,验证集约300张图片及其掩膜,images与masks目录一一对应,目录结构清晰,便于按批加载和评估。压缩包内共2000个文件,以png标签图像和jpg原始影像为主,另附类别说明txt与可视化脚本py,整包约42MB,体积适中,下载和部署都很方便。附带的Python脚本可随机抽取一张图像,将原始图片、真实标签掩膜以及标签叠加在原图上的效果一并展示并保存到当前目录,适合快速核查标注质量与分割结果。目前已有131人学习下载,适合遥感分割方向初学者熟悉数据组织方式,也适合在已有改进网络基础上做进一步实验。
1. 遥感城市图像语义分割数据集:拿到手的第一件事不是训练,是验货
做遥感图像语义分割的人,多半都经历过这种尴尬:算法模型选好了,训练环境配好了,结果数据预处理耗掉三周,标签错得离谱又得返工两周。所以当一个号称“约1000张数据和标签、已处理完可以直接训练、8类别图像分割”的遥感城市图像数据集摆在面前时,大部分人的第一反应是怀疑——这世上哪有这么好的事。
这份数据集的定位很明确:它不是那种几十万张的学术 benchmark,也不是某个特定城市的定制标注,而是一个中等规模、类别固定、预处理到位的落地产物。适合的场景是:组里要跑遥感分割基线、做算法选型对比、带学生快速入门、或者验证一个新网络结构在遥感场景下的效果。8个类别覆盖了城市地表最常见的几类地物——建筑、道路、水体、植被、裸地之类——够用但不臃肿。约1000张的量级意味着单卡训练几个小时就能看到结果,迭代速度快,踩坑成本低。
本文不聊虚的,直接拆解这份数据集从结构到使用的完整链路,包括标签编码怎么设计、训练脚本怎么写、第一次训练会撞见哪些坑、模型训完怎么评估,以及怎么判断这份数据集到底值不值得继续投精力。
2. 拆解“已处理完”的含义:目录结构、标签编码与坐标系统
2.1 一个能直接训练的数据集,目录应该长什么样
“已处理完可以直接训练”这句话在工程上是有明确含义的。拿到数据集后第一步不是急着跑模型,而是先把这个数据集的物理结构摸清楚。一个规范的、可直接喂给训练脚本的数据集,目录应该是这样的:
remote_sensing_seg/ ├── images/ # 原始影像,约1000张 │ ├── img_0001.tif │ ├── img_0002.tif │ └── ... ├── labels/ # 标签图,与images一一对应 │ ├── img_0001.png │ ├── img_0002.png │ └── ... ├── train.txt # 训练集清单,每行一个文件名(不含后缀) ├── val.txt # 验证集清单 ├── test.txt # 测试集清单 ├── class_names.txt # 类别名称,每行一个 └── config.yaml # 推荐训练参数检查这份数据集的完整程度,只需在终端落下三行命令:
# 输出images和labels的文件数,应该一致 ls images/ | wc -l ls labels/ | wc -l # 对比文件名是否一一对应(去除扩展名后比对) ls images/ | sed 's/\.[^.]*$//' > img_names.txt ls labels/ | sed 's/\.[^.]*$//' > lbl_names.txt diff img_names.txt lbl_names.txt # 查看类别清单 cat class_names.txt这三行命令解决三个关键问题:数量是否匹配、文件名是否对齐、类别定义是否清楚。如果 diff 的输出为空,说明文件级对齐没问题。我这里不提供具体的文件数量承诺,因为约1000张是个约数,但文件名的对应关系一定是严格的——这是“已处理完”的底线,连文件名都对不上,直接退给数据提供方,别浪费时间修补。
2.2 标签编码方式:8类别分割的两种主流路线
分割任务的标签编码有两条路线,这两条路线的选择直接决定后面所有代码怎么写。
第一种是单通道灰度图编码,也叫 semantic label map。每张标签图只有一个通道,像素值 0 到 7,分别对应 8 个类别。比如 0 是背景、1 是建筑、2 是道路、3 是水体……训练时直接用交叉熵损失,这是最省事的方案,也是绝大多数分割框架默认支持的格式——MMSegmentation、SegFormer、Mask2Former 的默认配置都是走这条路线。
第二种是 RGB 编码,即用特定颜色代表特定类别。常见的配色方案是:建筑用红色 (255,0,0),道路用灰色 (128,128,128),水体用蓝色 (0,0,255)。这种格式方便人眼可视化,但训练时必须做一次颜色到类别索引的映射,多一层转换就多一个出错点。
这份数据集用的是哪种格式,从文件名后缀就能判断。PNG 后缀基本可以确定是单通道编码——因为 RGB 编码的标签几乎都是三通道 PNG——但严谨起见还是要自己验证一下:
from PIL import Image import numpy as np # 读取一张标签图 label = np.array(Image.open("labels/img_0001.png")) # 检查维度:单通道还是三通道 print("标签图形状:", label.shape) print("标签图数值范围:", label.min(), "-", label.max()) # 如果是三通道,检查是否真的是RGB编码 if len(label.shape) == 3: # 检查通道数,RGB编码是三通道,灰度编码是两维或第三维为1 print("通道数:", label.shape[2]) print("唯一颜色数:", len(np.unique(label.reshape(-1, 3), axis=0)))这段代码的输出非常直白:形状是 (H, W) 就是单通道,是 (H, W, 3) 就是三通道。数值范围 0 到 7 说明是类别索引,范围 0 到 255 说明是 RGB 编码。8 类别数据集的标签通道数怎么看都很直观——就看这一处,判断结果基本不会出错。
2.3 坐标系统和投影信息:遥感分割最容易忽略的坑
遥感影像和自然图像最大的区别在于它自带地理属性。每张影像都有像素分辨率(比如 0.5 米/像素)、坐标系(WGS84 / UTM / GCJ02 之类)和投影信息。这些信息一般存在 TIF 文件的元数据里,用 GDAL 一行命令就能读出来:
gdalinfo images/img_0001.tif | head -20输出里会看到几个关键字段:Size 是宽高像素数,Pixel Size 是每个像素代表的地面尺寸,Coordinate System 是坐标系定义。这些信息决定了两个问题:第一,影像之间的空间分辨率是否一致——如果不一致,训练时模型会混淆地物的尺度特征,比如一个 20 层建筑在不同分辨率影像里的纹理完全不同;第二,多张影像拼接或叠加时是否能对齐——如果坐标系不统一,拼接处会出现肉眼可见的错位。
“已处理完”的数据集应该做到所有影像的空间分辨率一致,至少同一分辨率分组存放。检查方式也不复杂:
# 批量读取所有影像的像素尺寸和分辨率 for f in images/*.tif; do gdalinfo "$f" | grep -E "Size is|Pixel Size" | tr '\n' ' ' echo " <- $f" done如果输出显示出两三组不同的分辨率,那就需要按分辨率分组,分别训练或统一重采样到同一尺度。这种情况在遥感数据集中很常见,尤其是混合了多源卫星影像的数据,比如高分二号和 Sentinel-2 的分辨率差好几倍。如果这份数据集已经统一了分辨率,那省掉的预处理工作量是真的可观——别小看这一层,至少省出一周的清洗时间。
3. 从数据集到训练脚本:先划分、再跑通最小配置
3.1 数据集划分:不是按比例随机抽就完事
很多人在数据集划分上栽过跟头:直接random.shuffle按 8:1:1 划分训练集、验证集、测试集,结果训练出来的模型在测试集上很好看,一到真实场景就拉胯。原因在于遥感影像有空间自相关性——同一地区相邻地块的影像特征极其相似,如果划分时没有考虑空间分布,训练集和验证集会高度重叠,验证集就失去了评估意义。
正确的做法是按影像来源或地理区域划分。如果这份数据集的约1000张影像来自多个城市或区域,划分时尽量保证同一区域的影像全部落在同一个集合里。但既然标题声称“已处理完”,数据提供方大概率已经按合理方式划分好了。train.txt、val.txt、test.txt 这三个文件自己就是划分结果。需要做的只是验证一下划分比例和是否有重叠:
# 检查三个集合是否有文件名重叠 sort train.txt > t_sorted.txt sort val.txt > v_sorted.txt comm -12 t_sorted.txt v_sorted.txt | head -20 # 统计划分比例 wc -l train.txt val.txt test.txtcomm 命令输出为空,说明无重叠。划分比例如果是 8:1:1 左右就比较合理——约1000张影像对应 800 张训练、各 100 张左右验证和测试,单卡训练的速度和验证的代表性都能兼顾。
3.2 最小可训练配置:MMSegmentation 还是自写训练循环
对于这份 8 类别、约1000张的数据集,我的建议是先用现成框架跑通基线,不要一上来就自己写训练循环。MMSegmentation 是当前遥感分割领域最常用的开源框架之一,生态完整、配置化程度高,把数据集路径填进去就能训练。但要知道一个前提:MMSegmentation 原生支持的是 Cityscapes 这类自然图像格式,接入遥感数据集需要把类别名和调色板改一下。
MMSegmentation 的配置写法:
# configs/_base_/datasets/remote_sensing_8class.py dataset_type = 'RemoteSensingDataset' data_root = 'data/remote_sensing_seg/' img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations'), dict(type='Resize', img_scale=(512, 512), ratio_range=(0.5, 2.0)), dict(type='RandomCrop', crop_size=(512, 512)), dict(type='RandomFlip', prob=0.5), dict(type='Normalize', **img_norm_cfg), dict(type='DefaultFormatBundle'), dict(type='Collect', keys=['img', 'gt_semantic_seg']), ] val_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations'), dict(type='Resize', img_scale=(512, 512)), dict(type='Normalize', **img_norm_cfg), dict(type='DefaultFormatBundle'), dict(type='Collect', keys=['img', 'gt_semantic_seg']), ] data = dict( train=dict( type=dataset_type, data_root=data_root, img_dir='images', ann_dir='labels', split='train.txt', pipeline=train_pipeline), val=dict( type=dataset_type, data_root=data_root, img_dir='images', ann_dir='labels', split='val.txt', pipeline=val_pipeline), test=dict( type=dataset_type, data_root=data_root, img_dir='images', ann_dir='labels', split='test.txt', pipeline=val_pipeline))但这里有一个前置条件:MMSegmentation 的标准数据接口默认标签图是单通道索引格式,且类别索引从 0 开始连续编号。如果这份数据集的标签确实是单通道 0-7 编码,这一步就能无缝对接。如果标签是 RGB 编码,就无法直接训练,需要先写一个转换脚本,把 RGB 像素值映射到类别索引。具体转换逻辑见下文 4.2 节。
3.3 训练超参数怎么定:1000张数据集不用照搬大模型配置
约1000张影像的数据集属于小规模数据,训练超参数和 ImageNet 级别的大规模预训练完全不同。以下几个参数必须人工干预:
第一是 batch size。单卡 16GB 显存时,batch size 设为 8 到 16 比较合适。遥感影像的尺寸通常是 512×512 到 1024×1024,再大就会 OOM。第二是学习率。分割模型微调时,初始学习率建议 0.01(SGD)或 0.0001(AdamW),配合 poly 学习率衰减策略。第三是迭代轮数。1000 张级别的数据集,80 到 160 个 epoch 足够,跑多了反而过拟合——验证集 loss 开始回升的那一刻就该停。
命令行训练方式:
# 单卡训练,模型用 SegFormer-B0,8类分割 python tools/train.py configs/segformer/segformer_b0_512x512_160k_remote_8class.py \ --work-dir work_dirs/segformer_b0_rs8class \ --seed 42 \ --deterministic # 多卡训练(4卡) bash tools/dist_train.sh configs/segformer/segformer_b0_512x512_160k_remote_8class.py 4 \ --work-dir work_dirs/segformer_b0_rs8class这里我推荐先跑 SegFormer-B0 这类轻量级模型,而不是直接上 Mask2Former 或 SegFormer-B5。原因很简单:数据集只有约1000张影像,参数量过大的模型在小数据上极其容易过拟合。轻量模型半小时到一小时就能完成一个 epoch 的训练,模型迭代验证的速度快,在数据验证阶段的工程效率远高于大模型。先把轻量模型跑通、把数据链路验证干净,再上大模型才有意义。
另外,如果框架支持,建议把每个 epoch 保存一次 checkpoint:
# config 里的 checkpoint 设置 checkpoint_config = dict(interval=1, by_epoch=True, save_optimizer=False)每轮都存一次权重,能在训练中途翻车时快速回退到之前的稳定状态。磁盘充裕就别省这一步——这是我最深的血泪经验,训练到第80轮发现数据有错,如果没有中间权重,就得从头再来,白白烧掉几十个小时。
4. 训练拿到手后的第一轮产物:模型评估与常见落地场景
4.1 第一个训练跑完要看什么指标
训练完成后,很多人只盯着 mIoU 一个指标。这对 8 类别的分割任务来说是不够的。约1000张数据集的验证集通常只有 100 张左右,单张影像的预测质量波动对 mIoU 影响极大。细致的评估至少要看三类指标:
第一类是 mIoU 和各类别的 IoU。mIoU 是所有类别 IoU 的均值,但均值会掩盖个别类别的严重退化——比如道路 IoU 只有 30%,但其他 7 个类别都是 80%,mIoU 照样能到 73% 以上。在遥感场景中,道路这类细长地物本来就是分割难点,单独看道路的 IoU 才能暴露真实问题。
第二类是边界质量。遥感分割的典型失败模式是地物边界锯齿化、建筑物边缘丢失细节。用 Boundary IoU 或者直接在验证集上做可视化对比,比看数值指标更直观。
第三类是推理速度。如果目标是实际落地,单张影像的推理耗时和显存占用必须提前量好。语义分割模型部署时,速度和精度互为代价,1000 张的训练集训练出来的模型,精度天花板有限,选模型时更应从速度出发,而不是盲目追求精度。
4.2 标签是 RGB 编码的转换方案与隐患
如果前面检查发现标签图是三通道的 RGB 编码,就必须先写转换脚本。这种情况在遥感数据集中占的比例不低,RGB 编码方便标注工具展示,但训练框架不认。转换逻辑本质是建立一个颜色到类别索引的查找表:
from PIL import Image import numpy as np import os # 8类别的颜色映射表,顺序和class_names.txt保持一致 # 这里用常见配色示例,实际以数据集标注说明为准 color_to_class = { (0, 0, 0): 0, # 背景/未标注 (255, 0, 0): 1, # 建筑 (128, 128, 128): 2, # 道路 (0, 0, 255): 3, # 水体 (0, 255, 0): 4, # 植被 (255, 255, 0): 5, # 裸地 (0, 255, 255): 6, # 其他1 (255, 0, 255): 7, # 其他2 } label_dir = "labels_rgb" out_dir = "labels_idx" os.makedirs(out_dir, exist_ok=True) for fname in os.listdir(label_dir): if not fname.endswith(".png"): continue img = np.array(Image.open(os.path.join(label_dir, fname))).astype(np.uint8) h, w, c = img.shape idx_map = np.zeros((h, w), dtype=np.uint8) # 逐像素做颜色到类别的映射 for rgb, cls in color_to_class.items(): mask = (img[:, :, 0] == rgb[0]) & (img[:, :, 1] == rgb[1]) & (img[:, :, 2] == rgb[2]) idx_map[mask] = cls # 保存为单通道PNG Image.fromarray(idx_map, mode="P").save(os.path.join(out_dir, fname)) print("转换完成,输出目录:", out_dir)这段代码有几个关键坑。第一个是颜色查找的顺序——必须从背景色开始匹配,因为背景色是 (0,0,0),如果其他类别配色中也出现了纯黑像素,就会先被背景抢走,导致前景类别像素丢失。第二个是抗锯齿边缘问题——标注工具导出的 RGB 标签在物体边缘通常有抗锯齿过渡色,这些颜色不在颜色表里,转换时会默认变成 0(背景),造成边缘一圈像素误判。解决方法是对过渡色做最近邻匹配,或先对标签图做一次 3x3 众数滤波,把过渡色吃掉。第三个是未知颜色的检查——建议转换后统计一下每个类别的像素占比,如果发现某张图的背景占比异常高,大概率是没匹配上的颜色被吞了。
我不重复列出第3章的代码,只给一句总结:RGB 转索引的脚本谁都能写,但边缘过渡色和未知颜色这两个坑,才是转换后训练精度上不去的真正凶手。
4.3 训完的模型能用在哪些场景:从选型到部署的路线图
8类别的遥感城市图像分割,覆盖了城市感知的几个基础需求。实际落地时通常不会直接拿这个模型做最终决策,而是把它当作底层特征提取器或中间层手段。
第一个常见场景是城市违章建筑筛查。建筑类别单独抽取出来,叠加 GIS 图层做比对,能自动标出“规划里没有但影像里存在”的建筑轮廓。模型精度不用 99%,80% 的召回率就能把人工复核的工作量砍掉一大半。这里面的价值逻辑是:模型负责初筛,人工负责确认,从“全量人工看”变成“看十分之一”的效率提升。
第二个场景是生态红线监测。水体、植被类别抽取出来,做成时间序列对比,监控城市湖泊面积变化、绿地覆盖率变化。8 类别中包含水体和植被,这个方向可以直接用。
第三个场景是遥感底图的自动更新。把分割结果转成矢量多边形,导入 GIS 系统做变化检测——对比不同年份的影像分割结果,重叠率低的区域标记为变化区域,驱动人工核查。这里要意识到一个技术前提:分割结果是像素级的栅格,直接转矢量会有锯齿,通常需要做多边形平滑简化。
上述场景的共性要求是:模型训练好后,推理阶段的操作只不过是对单张影像做前向传播,输出类别概率图,再按场景阈值筛选目标类别的像素。部署层面,mmsegmentation 训练出的模型可以导出为 ONNX 再用 TensorRT 加速,单张 512×512 影像在 GPU 上的推理耗时能压到 20ms 以下,满足准实时处理的需求。
5. 避坑指南:这份数据集最常见的5个翻车点
5.1 现象:训练 loss 正常下降,但验证集 mIoU 在某个类别上长期为 0
这是遥感分割最让人崩溃的问题之一:总体指标看着在涨,但某一张可视化图里某个类别全部预测成了另一类。原因通常不是模型,而是类别间像素数量极度不均衡。8 类别的城市影像里,植被和道路的像素占比可能各有 30%,但“栅栏”“电线杆”这类小地物可能只有 1% 甚至不到。如果数据集的类别分布是这种长尾形态,交叉熵损失会被大类别主导,小类别永远学不出来。
解决方式有两步。第一步:统计训练集每张标签图里 8 个类别的像素直方图,确认不均衡的程度:
import numpy as np from PIL import Image import glob class_counts = np.zeros(8, dtype=np.int64) for label_path in glob.glob("labels/*.png"): label = np.array(Image.open(label_path)) for c in range(8): class_counts[c] += (label == c).sum() total = class_counts.sum() for i, cnt in enumerate(class_counts): print(f"类别 {i}: {cnt} 像素, 占比 {cnt/total*100:.2f}%")第二步:如果确认不均衡,在损失函数里加类别权重,权重和像素占比成反比。MMSegmentation 的 CrossEntropyLoss 支持class_weight参数,把统计出来的占比取倒数再归一化填入即可。
5.2 现象:训练正常,但模型在验证集的完整大图上表现崩坏
很多人会用滑动窗口推理来跑大尺寸遥感影像——把一张 4000×4000 的影像切成 512×512 的块,逐块预测再拼回整图。切块推理时,物体的边缘被切断,跨块的目标(比如一栋横跨多个窗口的建筑)会被不同窗口分别预测,拼回后边界错位、类别不连贯。这不是模型的问题,是推理策略的问题。
解决方式:推理时使用带重叠的滑动窗口,窗口重叠 64 到 128 个像素,预测时只取每块的中心区域作为有效输出,边缘预测结果丢弃。重叠区的预测可以用平均或投票的方式融合。如果切块时物体被切断,重叠窗口能保证物体至少在一个窗口内完整出现。
另外一个更隐蔽的问题:训练时做了归一化(mean/std 标准化),推理大图时也用同样的归一化参数,但如果训练影像和推理影像的色调分布不一致——比如训练集主要来自晴天影像、推理集是阴天影像——精度会显著下降。这不是数据集的问题,是遥感影像跨时相应用中的固有限制。此时要做的不是调模型,而是对推理影像做直方图匹配,把色调拉到训练集的分布范围内。
5.3 现象:小类别(如水体)在训练时 loss 很高但指标始终上不去
训练曲线显示类别的 loss 在下降,但对应类别的 IoU 始终在 20% 以下。排除类别不均衡后,最常见的原因是标签边缘不精确。遥感影像的标注质量受限于影像分辨率和标注工具的人机交互精度,水体边缘尤其严重——河道和岸边的像素在影像上本身就有混合光谱,标注员也很难画准。如果标签本身存在大量边缘噪声,模型学的是“边缘噪声的模式”,而不是水体的光谱特征。
检查方式是在验证集上做可视化对比,把预测结果和真实标签叠在一起,看误差集中在边缘还是内部。如果集中在边缘,接受这个精度上限即可,因为再训练也突破不了标签噪声的天花板。如果误差在内部,说明是特征学习问题,考虑修改网络结构或损失函数。
5.4 现象:训练时换了解码头,精度反而下降
有些人在拿到“已处理完”的数据集后,会忍不住魔改——把 FCN 头换成 PPM 头,或者把 ResNet 换成 Swin Transformer。但小数据集扛不住大改动。约1000张影像的训练集,换成参数更多的主干网络后,训练收敛变慢、过拟合加剧、精度不升反降,这是大概率事件。
解决方式:基于这份数据集的量级,先固定一套最优配置跑全流程——轻量主干(ResNet-18/50 或 MiT-B0)、简单解码头(FCN 或 PSPNet)、标准增强策略。等数据链路完全验证通过,再逐步替换组件,每次只替换一个模块,对比指标变化。切忌同时换主干又换解码头又换损失函数,一次改三个变量,翻车了都不知道是哪一步导致的,而且翻车后排查的代价极高。
5.5 现象:多个类别在预测结果中发生混淆,尤其是光谱特征相近的类别
遥感分割中,裸地和低矮植被、道路和建筑阴影、水体和深色屋顶,光谱特征非常接近。8 类别的设置本身已经比较粗粒度,但混淆仍难以避免。如果混淆发生在某一对固定类别上(比如建筑和道路),先检查数据集的类别定义是否清晰——有些数据集标注规范里“建筑”和“道路”的定义存在重叠区域,比如建筑物旁的硬化地面到底算哪类,标注员的理解不统一就会产生大量不一致标签。
解决方式:看类别定义文档。如果定义不清晰,只能接受模型在边界区域的表现不稳定;如果定义清晰但模型仍混淆,尝试在训练数据增强中增加颜色抖动、对比度变化,让模型学习到更鲁棒的结构特征而非纯颜色特征。遥感影像的光谱信息是优势也是陷阱,过拟合颜色特征的模型,一换传感器数据就废。
6. 验证这份数据集值不值得再投入:三分钟精度测试法
判断一份小型数据集值不值得继续投入,不需要跑完全部 epoch。有一个快速验证套路,可以在拿到数据后一个小时内判断精度天花板。这个方法是很多做遥感分割的组里默认的做法,我把它完整地写在这里:
第一步:从 val.txt 里抽出 20 张代表性影像——包含每个类别的影像、大物体和小物体都有的影像、不同光照条件的影像。第二步:用预训练权重(比如在 Cityscapes 上预训练的模型)直接在遥感分割数据集上做零样本推理。Cityscapes 和遥感城市影像都包含道路、建筑、植被等类别,虽然领域有差异,但底层特征仍有迁移价值。看预训练模型在这 20 张影像上的表现,就能快速判断这个数据集的影像质量和标注质量:如果预训练模型能把建筑和水体大差不差地猜出来,说明影像质量过硬、语义清晰;如果预训练模型预测结果全是噪声,可能影像色调怪异或标注存在系统性问题。
第三步:做 5 个 epoch 的快速微调训练,观察 loss 下降速度和验证集 mIoU 的变化趋势。如果 5 个 epoch 内 mIoU 能从零升到 20% 以上,说明数据特征可以被模型有效提取——这个数据集值得继续投入;如果 5 个 epoch 后 mIoU 还在 10% 以下,就要回头检查数据链路,大概率不是模型的问题。
# 5 epoch 快速验证训练 python tools/train.py configs/segformer/segformer_b0_512x512_5ep_remote_8class.py \ --work-dir work_dirs/quick_probe \ --cfg-options total_iters=2000 runner.max_epochs=5 \ evaluation.interval=1 checkpoint_config.interval=1训练完成后,重点看 val mIoU 和 val aAcc 两项指标。mIoU 低于 15%,要么数据标签系统性问题,要么训练参数不匹配;mIoU 在 15% 到 35%,基线水平正常,继续训练会更高;mIoU 超过 35%,这份数据集的标注质量相当干净,值得做完整训练。
这个三分钟精度测试的意义在于及时止损。我曾经拿到过一份号称“已处理完”的遥感数据集,2000 张影像,类别 10 类,结果快速测试发现所有指标都在 5% 以下——后来排查发现是标签图整体偏移了 50 个像素,所有标签和影像对不上。如果不是先做了快速验证而是直接投入长训练,至少白烧三天的电费。这个习惯我保留到现在:任何数据集到手,先花一小时验货,再决定是否投入完整训练。这个习惯也建议你保留,1000 张级别的数据集,验证成本极低但回报极高。希望帮到你。
本文还有配套的精品资源,点击获取