第一次接触语义分割时,最让我头疼的就是选择合适的数据集。记得当时为了一个室内场景分割项目,我花了整整两周时间在各种数据集之间反复横跳。今天我就来聊聊三个最常用的语义分割数据集:ADE20K、Cityscapes和VOC12_AUG,帮你避开我踩过的那些坑。
语义分割简单来说就是给图像中的每个像素打标签,就像小朋友玩的填色游戏,只不过是用代码自动完成。这三个数据集各有特色:ADE20K适合室内外通用场景,Cityscapes专攻城市街道,VOC12_AUG则是经典物体识别增强版。选择时主要看你的应用场景、需要的类别精细度,还有...说实话,显卡配置(后面会解释为什么)。
ADE20K是我用得最顺手的一个数据集,它就像个"全能型选手"。20210张训练图片+200张验证图片,覆盖150个类别,从卧室的床到户外的树应有尽有。实际使用时我发现它的室内场景特别丰富,比如这张厨房图片,连微波炉上的按钮都能分得清清楚楚。
但要注意它的标注有个特点:存在"0类别"的漏标区域。刚开始我以为这是标注质量问题,后来发现设计就是如此——这些区域不计入loss计算。训练时建议用这个mask过滤掉背景:
python复制# 加载ADE20K标注时处理背景
mask = (label != 0) # 过滤背景类
loss = criterion(output[mask], label[mask])
在智能家居项目中,我用ADE20K训练了一个室内物品识别模型。最实用的是它的细粒度分类,比如"床"下面还有"双层床"、"婴儿床"等子类。不过要注意三个坑:
建议数据增强时重点做色彩变换,因为室内光照条件差异大。我常用的配置:
python复制transform = Compose([
RandomResizedCrop(512),
RandomHorizontalFlip(),
ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4),
Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
Cityscapes是城市街道场景的黄金标准,5000张精细标注+20000张粗糙标注,采集自50个城市不同季节。它的标注原则很有意思——"看得见的背景也算前景"。比如车窗里的景色会被归为"车"类,树叶间的天空算作"树"类。
这个数据集最惊艳的是标注质量。我拿放大镜看过,连交通标志上的小字边缘都清晰可见。标注格式比较特殊,是用32位彩色图像存储的,读取时需要特殊处理:
python复制def decode_cityscapes_label(label_img):
# 将RGB标注图转换为trainId
label = np.zeros(label_img.shape[:2], dtype=np.uint8)
for cls in classes:
label[np.all(label_img == cls.color, axis=-1)] = cls.trainId
return label
在车道线检测项目中,Cityscapes的"road"、"sidewalk"等类别划分特别实用。但要注意它的30个类别中有7个是评估时忽略的(如"ego vehicle")。训练时建议这样处理:
| 类别名称 | trainId | 是否忽略 | 处理建议 |
|---|---|---|---|
| road | 0 | 否 | 重点优化 |
| sidewalk | 1 | 否 | 重点优化 |
| parking | 255 | 是 | 直接忽略 |
实测发现,使用DeepLabV3+时加上CRF后处理能提升1.2%的mIoU,特别是对薄型物体(如电线杆)效果明显。
VOC12_AUG是PASCAL VOC的增强版,10582张训练图片+1449张验证图片,只有20个类别。虽然看起来简单,但在某些场景下反而更实用。比如做快速原型开发时,用ResNet50+FPN在VOC12上训练,我的1080Ti显卡1小时就能跑完一个epoch,而ADE20K需要3小时。
它的标注风格比较"粗放",一张图通常只有几个主要物体。这对于通用物体识别其实是优势——模型不会过度关注背景细节。数据增强建议侧重几何变换:
python复制# VOC12_AUG的典型增强策略
train_transform = Compose([
RandomScale(0.5, 2.0),
RandomCrop(513),
RandomHorizontalFlip(),
Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
这三个数据集的选择其实很有讲究,我总结了个快速决策表:
| 考量维度 | ADE20K | Cityscapes | VOC12_AUG |
|---|---|---|---|
| 场景多样性 | 高(室内外) | 中(街道) | 低(通用物体) |
| 类别精细度 | 150类 | 30类 | 20类 |
| 标注质量 | 良(有漏标) | 优 | 中 |
| 训练速度 | 慢 | 中 | 快 |
| 最佳应用领域 | 室内导航 | 自动驾驶 | 物体识别 |
去年做智能零售货架项目时,我先用VOC12_AUG快速验证算法可行性,再用ADE20K微调细节,省了40%的开发时间。
这三个数据集其实可以配合使用。我的常用套路是:
特别是当训练数据不足时,这种分阶段迁移效果惊人。有个小技巧:Cityscapes和ADE20K都有的类别(如"person"),可以先用Cityscapes训练,因为它的标注更精确。
最大的坑是类别定义不一致。比如"wall"在:
解决方案是建立映射表:
python复制class_mapping = {
'ADE20K': {'wall': 3},
'Cityscapes': {'wall': 12},
'VOC12': {} # 无对应类别
}
经过五个商业项目验证,我的选择策略是:
最近发现一个取巧的方法:用ADE20K训练通用模型,遇到特定场景(如自动驾驶)时,只需重训练最后几层,效果往往比从头训练Cityscapes更好。