4. 数据集与标注规范
可行驶区域与道路语义分割模型的性能上限,很大程度上由数据集决定。工程中常见的问题不是“模型不够新”,而是“标注口径不一致”:同一类道路边界,不同标注员给出的像素范围可能相差几十厘米;同一段路沿,有人标为 curb,有人标为 sidewalk。因此,理解主流数据集的设计目标、类别体系与标注规范,并建立可执行的质量控制流程,是分割工程落地的基础环节。
一、三大主流数据集定位与差异
Cityscapes、BDD100K、ApolloScape 分别代表了城市精细标注、大规模多样驾驶场景、高精度三维与全景语义三个方向。它们不是互相替代关系,而是互补关系。
| 数据集 | 规模与场景 | 标注特点 | 典型用途 |
|---|---|---|---|
| Cityscapes | 50 城、5000 精标 + 20000 粗标,1024×2048 | 30 类,像素级多边形,含 instance 与 ego-vehicle 标注 | 城市场景语义分割基准、类别体系参考 |
| BDD100K | 10 万段视频、1 亿帧,多天气多时段 | 10 万关键帧精标,40+ 类,含可行驶区域与车道线 | 大规模预训练、域适应、时序一致性研究 |
| ApolloScape | 高分辨率图像 + 点云,多城市采集 | 像素级 + 3D 点云语义,25+ 类,含路面材质 | 3D 语义、路面属性、复杂遮挡场景 |
Cityscapes 的类别体系最常被借鉴,其将道路相关类别细分为 road、sidewalk、curb、parking、rail track 等,并区分 ego-vehicle 与普通车辆。BDD100K 更强调场景多样性,标注中“可行驶区域”通常以多边形覆盖,允许一定程度的边界模糊。ApolloScape 则提供点云级语义,适合研究路面材质与三维几何约束。
二、标注规范的核心口径
无论使用哪个数据集,自建标注前必须冻结一份《标注规范》。规范中至少要明确以下四类口径:
- 边界归属:道路与路沿交界处,像素归 road 还是 curb?通常以“可行驶轮胎接触面”为 road 边界,路沿立面归 curb。
- 遮挡处理:被车辆、行人遮挡的道路区域,是否根据上下文补全?Cityscapes 要求补全,BDD100K 允许留空。
- 最小标注单元:小于多少像素的物体忽略?常见阈值为 100 像素或 0.1% 图像面积。
- 类别互斥:同一像素只能属于一个类别,禁止重叠多边形;若重叠,按优先级裁剪。
三、标注质量控制流程
质量控制不是最后抽检,而是贯穿采集、预标注、标注、审核、验收的全流程。下图展示了从原始数据到合格标注集的闭环流程,其中预标注与一致性校验是提升效率的关键节点。
四、实操:一致性校验与返工判定
一致性校验通常以双人独立标注结果为输入,计算像素级 IoU 与边界距离。以下脚本展示了如何对两张标注掩码进行快速比对,并输出需要返工的类别清单。
import numpy as np
def consistency_check(mask_a, mask_b, num_classes=19, iou_thr=0.92):
"""双人标注一致性校验,返回不达标类别"""
report = {}
for c in range(num_classes):
a = (mask_a == c)
b = (mask_b == c)
inter = np.logical_and(a, b).sum()
union = np.logical_or(a, b).sum()
if union == 0:
continue
iou = inter / union
report[c] = round(iou, 4)
bad = {c: v for c, v in report.items() if v < iou_thr}
return report, bad
# 示例输出
# {0: 0.981, 1: 0.954, 8: 0.873, 11: 0.901}
# 返工类别: {8: 0.873, 11: 0.901}
当某类别 IoU 低于阈值时,不应直接全量返工,而应先定位分歧区域:是边界定义模糊,还是标注员理解偏差。若分歧集中在路沿与道路交界处,应回到规范中补充边界案例;若分歧分散,则需对标注员进行再培训。
五、复盘:数据集选择的工程建议
实际项目中,很少只用一个数据集。推荐策略是:以 Cityscapes 的类别体系为基准,用 BDD100K 做大规模预训练以提升泛化,再用 ApolloScape 的点云语义补充三维几何约束。自建数据时,先冻结规范、跑通一致性校验闭环,再逐步扩大标注规模。数据集的质量不取决于标注了多少帧,而取决于每一帧的边界口径是否可复现、可仲裁、可追溯。