3、数据采集与标注:数据采集规范、标注格式(如nuScenes、KITTI)、长尾场景挖掘
数据,说白了就是BEV感知的「燃料」。没有高质量的数据,模型再花哨也是白搭。我见过太多团队,算法调得飞起,一上路就翻车,最后发现是数据采集和标注的坑没填平。这一节,咱们就聊聊这些「地基」问题。
3.1 数据采集规范:别让传感器「带病上岗」
数据采集不是把车开出去转一圈就完事了。你得先想清楚几个问题:
- 传感器标定:相机、激光雷达、IMU之间的外参必须精确。我遇到过项目,标定误差大了0.1度,结果BEV空间里的目标位置直接偏了半米。嗯,这可不是闹着玩的。
- 时间同步:所有传感器的数据必须对齐到同一个时间戳。你想想看,如果相机和激光雷达的时间差了几毫秒,高速运动的目标在BEV视角下就会出现「重影」。
- 光照与天气:别只挑大晴天采集。雨天、夜晚、逆光、隧道出入口——这些场景才是真正的「试金石」。我个人习惯,至少保证20%的数据来自恶劣天气。
3.2 标注格式:选对「语言」很重要
标注格式决定了你的数据怎么被模型理解。目前主流的有两种:nuScenes格式和KITTI格式。我简单对比一下:
| 特性 | nuScenes格式 | KITTI格式 |
|---|---|---|
| 坐标系 | 全局坐标系 + 传感器坐标系 | 相机坐标系为主 |
| 标注内容 | 3D BBox + 属性(速度、转向灯等) | 3D BBox + 截断/遮挡 |
| 时间戳 | 精确到微秒 | 相对时间 |
| 适用场景 | 多传感器融合、时序预测 | 单帧检测、跟踪 |
我个人更推荐nuScenes格式,尤其是做BEV感知。为什么?因为它天然支持多模态数据对齐,而且属性标注更丰富。比如,你可以在标注里直接带上「车辆是否正在变道」这样的信息,这对下游预测任务帮助巨大。
核心要点:标注格式的选择要「向前看」。别只考虑当前检测任务,还要想想后续的跟踪、预测、规划是否需要这些信息。否则,后期返工标注的成本会让你哭出来。
3.3 长尾场景挖掘:找到那些「要命」的case
长尾场景,就是那些发生概率低、但一旦出现就可能导致事故的场景。比如:
- 行人突然从路边停着的卡车后面窜出来
- 夜间逆光下,一辆黑色电动车横穿马路
- 施工区域,锥桶摆放得乱七八糟
怎么挖掘这些场景?我分享三个实战方法:
- 影子模式挖掘:让量产车在行驶过程中,实时对比模型输出和实际驾驶员操作。一旦出现「模型认为安全、但驾驶员踩了刹车」的情况,就把这段数据上传。这是最直接的长尾发现方式。
- 仿真注入:在仿真环境中,人为制造极端情况。比如,让一个行人以10m/s的速度横穿马路,或者让前方车辆突然急刹。然后看模型是否失效。失效的case,就是你需要补充标注的。
- 聚类分析:对已有的失败case进行特征聚类。你会发现,很多失败场景其实有共同点——比如「目标被遮挡超过50%」或者「目标与背景颜色相近」。针对这些聚类结果,定向采集数据。
小技巧:我习惯在标注工具里加一个「难度标签」。标注员可以给每个目标打上「简单/中等/困难」的标记。这样训练时,我可以对困难样本进行过采样,效果立竿见影。
3.4 标注质量管控:别让「脏数据」毁了模型
标注质量是另一个大坑。你以为标注员会认真框每一个目标?太天真了。我见过标注员把远处的行人框成电线杆,也见过把路边的垃圾桶框成车辆。
我的做法是:
- 交叉验证:每个场景至少由两个标注员独立标注,然后对比差异。差异超过阈值的,退回重标。
- 自动质检:写一个脚本,检查标注框是否超出图像边界、尺寸是否合理、类别是否匹配。比如,一辆「car」的3D框长宽高不可能超过10米,如果出现这种异常,直接标记为无效。
- 抽检机制:每周随机抽取5%的标注数据,由资深工程师人工复核。我每周五下午都会亲自看一遍抽检结果,发现问题及时反馈给标注团队。
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帧重复数据"
这样,你随时可以回退到任意一个数据版本,配合对应的模型权重,完美复现实验结果。
好了,数据采集与标注这块,核心就是这些。记住一句话:数据质量决定模型上限,算法只是逼近这个上限的手段。下一节,咱们聊聊模型训练中的那些「玄学」问题。