数据标注基础:标注类型与质量管控

说到数据标注,我刚开始做自动驾驶时,其实挺不以为然的。总觉得算法才是核心,标注嘛,不就是画框框?后来被现实狠狠教育了一顿——模型效果上不去,查来查去,问题出在标注质量上。嗯,从那以后我再也不敢小看标注了。

标注类型:2D框与3D框

先聊聊最常见的2D框。说白了,就是在图像上画个矩形,把目标框出来。比如行人、车辆、交通标志,每个框带一个类别标签。

2D框标注有几个关键参数:

  • 左上角坐标 (x_min, y_min)
  • 右下角坐标 (x_max, y_max)
  • 类别标签 (car, pedestrian, cyclist...)
  • 遮挡程度 (0-1之间的浮点数)

但2D框有个硬伤——它不知道目标的深度信息。你想想看,一辆大卡车和一辆小轿车在图像上可能都是同样大小的框,但实际距离差远了。所以自动驾驶系统更依赖3D框。

3D框标注就复杂多了。除了2D框的信息,还需要:

  • 中心点坐标 (x, y, z) 在三维空间中
  • 长宽高 (length, width, height)
  • 朝向角 (yaw angle)
  • 速度 (vx, vy, vz) 如果是追踪任务

我踩过的坑: 3D框的朝向角标注特别容易出错。我曾经有个项目,标注员把车头朝向标反了,结果模型预测的轨迹全是反的。后来我强制要求标注时参考点云数据,才把这个问题解决掉。

语义分割:像素级的理解

语义分割比目标检测更细。它不是画框,而是给每个像素分配一个类别。比如图像里每个像素要么是「道路」,要么是「车辆」,要么是「天空」。

语义分割的标注格式通常是:

# 每个像素对应一个类别ID
# 0: 背景, 1: 道路, 2: 车辆, 3: 行人, 4: 建筑...

# 标注结果是一个二维数组
segmentation_map = [
    [0, 0, 0, 0, 0],
    [0, 1, 1, 1, 0],
    [0, 1, 2, 1, 0],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0]
]

语义分割的难点在于边界处理。我记得有一次,标注员把路沿和道路的边界标得模模糊糊,模型训练出来在路沿处总是出现锯齿。后来我们加了一条规则:边界处必须用「硬边」标注,不能有渐变。

我的建议: 语义分割标注时,优先保证类别边界的清晰度。宁可牺牲一点内部区域的精度,也要把边界标准。因为自动驾驶系统对边界特别敏感,尤其是车道线和路沿。

追踪标注:跨帧的一致性

追踪标注是给每个目标分配一个唯一的ID,然后在连续帧中保持这个ID不变。比如一辆车从第1帧开到第100帧,它的ID始终是「car_001」。

追踪标注的核心要求:

  • ID唯一性:同一场景中不能有重复ID
  • ID连续性:目标消失再出现时,ID不能变
  • 遮挡处理:目标被遮挡时,ID要保留

追踪标注的格式示例:

{
  "frame_id": 1,
  "objects": [
    {"id": "car_001", "bbox": [100, 200, 150, 250], "class": "car"},
    {"id": "ped_002", "bbox": [300, 400, 320, 450], "class": "pedestrian"}
  ]
}

{
  "frame_id": 2,
  "objects": [
    {"id": "car_001", "bbox": [105, 198, 155, 248], "class": "car"},
    {"id": "ped_002", "bbox": [305, 398, 325, 448], "class": "pedestrian"}
  ]
}

追踪标注最头疼的是遮挡场景。我曾经遇到一个案例:一辆车被大卡车完全遮挡了5帧,标注员以为这辆车消失了,重新给了个新ID。结果模型学到的逻辑是「车被挡住就会变成另一辆车」——这显然不对。

注意: 追踪标注时,遮挡帧的ID必须保留。标注工具应该支持「目标消失后自动保留ID」的功能。如果工具不支持,那就需要标注员手动记录。

标注工具的选择

市面上标注工具不少,我简单列几个常用的:

工具名称 支持类型 特点
LabelImg 2D框 轻量级,适合小项目
CVAT 2D框、语义分割、追踪 开源,支持多人协作
Supervisely 2D/3D框、语义分割、追踪 功能全面,但收费
Scale AI 全类型 企业级,质量管控强

我个人习惯用CVAT。为什么?因为它开源,可以自己部署,而且支持自动标注的插件。你想想看,如果每帧都手动标,1000帧的数据得标到猴年马月去。

质量管控:数据标注的生命线

标注质量怎么管?我总结了几条经验:

  1. 标注规范文档:每个项目开始前,必须写一份详细的标注规范。比如「车辆框必须包含车轮」、「行人框必须包含头顶和脚底」。
  2. 预标注测试:让标注员先标100张图,我来审核。通过率低于80%的,重新培训。
  3. 抽检机制:每天抽检10%的标注结果。发现问题及时反馈,不要等全标完了再返工。
  4. 一致性检查:同一个场景让两个标注员分别标,对比差异。差异超过5%的,说明规范有问题。

我曾经踩过的坑: 有个项目赶进度,跳过了预标注测试。结果标注员把「摩托车」和「电动车」混为一谈,标了5000张图才发现。返工成本高得吓人。从那以后,预标注测试成了我的铁律。

质量管控的指标也很重要。我常用的几个:

指标 定义 合格标准
标注准确率 正确标注的目标数 / 总目标数 ≥ 95%
漏标率 漏标的目标数 / 应标目标数 ≤ 3%
边界误差 标注框与真实框的IoU ≥ 0.7
ID切换率 追踪中ID错误的帧数 / 总帧数 ≤ 2%

嗯,数据标注这块内容其实挺多的。但核心就三点:类型要选对、工具要用好、质量要把牢。你想想看,如果标注数据都是错的,再牛的算法也白搭。所以别小看标注,它可是自动驾驶系统的地基。