3、数据采集与标注:数据采集规范、标注格式(如nuScenes、KITTI)、长尾场景挖掘

数据,说白了就是BEV感知的「燃料」。没有高质量的数据,模型再花哨也是白搭。我见过太多团队,算法调得飞起,一上路就翻车,最后发现是数据采集和标注的坑没填平。这一节,咱们就聊聊这些「地基」问题。

3.1 数据采集规范:别让传感器「带病上岗」

数据采集不是把车开出去转一圈就完事了。你得先想清楚几个问题:

  • 传感器标定:相机、激光雷达、IMU之间的外参必须精确。我遇到过项目,标定误差大了0.1度,结果BEV空间里的目标位置直接偏了半米。嗯,这可不是闹着玩的。
  • 时间同步:所有传感器的数据必须对齐到同一个时间戳。你想想看,如果相机和激光雷达的时间差了几毫秒,高速运动的目标在BEV视角下就会出现「重影」。
  • 光照与天气:别只挑大晴天采集。雨天、夜晚、逆光、隧道出入口——这些场景才是真正的「试金石」。我个人习惯,至少保证20%的数据来自恶劣天气。
避坑指南:我曾经因为偷懒,连续一周在同一个时间段(下午2-4点)采集数据。结果模型在黄昏和清晨的表现一塌糊涂。后来我强制要求采集车必须覆盖全天24小时的不同时段,问题才解决。

3.2 标注格式:选对「语言」很重要

标注格式决定了你的数据怎么被模型理解。目前主流的有两种:nuScenes格式和KITTI格式。我简单对比一下:

特性 nuScenes格式 KITTI格式
坐标系 全局坐标系 + 传感器坐标系 相机坐标系为主
标注内容 3D BBox + 属性(速度、转向灯等) 3D BBox + 截断/遮挡
时间戳 精确到微秒 相对时间
适用场景 多传感器融合、时序预测 单帧检测、跟踪

我个人更推荐nuScenes格式,尤其是做BEV感知。为什么?因为它天然支持多模态数据对齐,而且属性标注更丰富。比如,你可以在标注里直接带上「车辆是否正在变道」这样的信息,这对下游预测任务帮助巨大。

核心要点:标注格式的选择要「向前看」。别只考虑当前检测任务,还要想想后续的跟踪、预测、规划是否需要这些信息。否则,后期返工标注的成本会让你哭出来。

3.3 长尾场景挖掘:找到那些「要命」的case

长尾场景,就是那些发生概率低、但一旦出现就可能导致事故的场景。比如:

  • 行人突然从路边停着的卡车后面窜出来
  • 夜间逆光下,一辆黑色电动车横穿马路
  • 施工区域,锥桶摆放得乱七八糟

怎么挖掘这些场景?我分享三个实战方法:

  1. 影子模式挖掘:让量产车在行驶过程中,实时对比模型输出和实际驾驶员操作。一旦出现「模型认为安全、但驾驶员踩了刹车」的情况,就把这段数据上传。这是最直接的长尾发现方式。
  2. 仿真注入:在仿真环境中,人为制造极端情况。比如,让一个行人以10m/s的速度横穿马路,或者让前方车辆突然急刹。然后看模型是否失效。失效的case,就是你需要补充标注的。
  3. 聚类分析:对已有的失败case进行特征聚类。你会发现,很多失败场景其实有共同点——比如「目标被遮挡超过50%」或者「目标与背景颜色相近」。针对这些聚类结果,定向采集数据。

小技巧:我习惯在标注工具里加一个「难度标签」。标注员可以给每个目标打上「简单/中等/困难」的标记。这样训练时,我可以对困难样本进行过采样,效果立竿见影。

3.4 标注质量管控:别让「脏数据」毁了模型

标注质量是另一个大坑。你以为标注员会认真框每一个目标?太天真了。我见过标注员把远处的行人框成电线杆,也见过把路边的垃圾桶框成车辆。

我的做法是:

  • 交叉验证:每个场景至少由两个标注员独立标注,然后对比差异。差异超过阈值的,退回重标。
  • 自动质检:写一个脚本,检查标注框是否超出图像边界、尺寸是否合理、类别是否匹配。比如,一辆「car」的3D框长宽高不可能超过10米,如果出现这种异常,直接标记为无效。
  • 抽检机制:每周随机抽取5%的标注数据,由资深工程师人工复核。我每周五下午都会亲自看一遍抽检结果,发现问题及时反馈给标注团队。
避坑指南:我曾经因为赶项目进度,放松了标注质量管控。结果模型训练到一半,loss死活降不下去。排查了三天,最后发现是标注数据里混入了大量「负样本」(即没有目标的空场景),但标注员却给这些空场景打了「背景」标签。白白浪费了三天算力。

3.5 数据版本管理:别让「数据漂移」搞崩你

数据不是一成不变的。今天你加了1000个夜间场景,明天又删了500个重复数据。如果不做版本管理,你会发现模型效果忽好忽坏,根本没法复现。

我推荐使用类似DVC(Data Version Control)的工具。每次数据变更,都打一个tag。比如:

# 初始化数据仓库
dvc init

# 添加数据目录
dvc add data/raw

# 打版本标签
git tag v1.0.0 -m "初始数据集,包含10000帧"
git tag v1.1.0 -m "新增2000帧夜间场景"
git tag v1.2.0 -m "修复标注错误,删除500帧重复数据"

这样,你随时可以回退到任意一个数据版本,配合对应的模型权重,完美复现实验结果。

好了,数据采集与标注这块,核心就是这些。记住一句话:数据质量决定模型上限,算法只是逼近这个上限的手段。下一节,咱们聊聊模型训练中的那些「玄学」问题。