3、数据采集与预处理:数据采集规范、数据清洗、数据增强、标注格式与工具(COCO、KITTI、NuScenes)、数据质量评估
数据,说白了就是自动驾驶感知系统的「燃料」。没有高质量的数据,再牛的算法也是白搭。我见过太多团队,模型结构抄得飞起,结果数据一塌糊涂,最后联调时各种翻车。今天咱们就来聊聊,怎么把这锅「饭」煮好。
3.1 数据采集规范:别让源头就歪了
数据采集不是拿着相机出去随便拍。我刚开始做感知时,就犯过这个错——采集的数据全是晴天、白天、城市道路。结果模型一到雨天、隧道就「失明」。嗯,这里要注意,采集规范必须覆盖全场景。
3.1.1 场景覆盖矩阵
我个人习惯,先画一个场景覆盖矩阵。把天气、光照、道路类型、交通密度这些维度列出来,确保每个格子都有数据。
| 维度 | 典型值 | 最低要求 |
|---|---|---|
| 天气 | 晴天、阴天、雨天、雪天、雾天 | 至少包含3种 |
| 光照 | 白天、黄昏、夜晚、隧道 | 白天+夜晚必须覆盖 |
| 道路类型 | 高速、城市、乡村、停车场 | 高速+城市必须覆盖 |
| 交通密度 | 稀疏、中等、拥堵 | 中等+拥堵必须覆盖 |
3.1.2 传感器标定与同步
数据采集前,传感器标定是必须的。相机和激光雷达的外参、内参,都得校准。我记得有一次,团队急着采集,没仔细检查标定文件,结果发现相机和LiDAR的投影偏差了5个像素。嗯,这直接导致后续的融合模型精度掉了10个点。
同步问题也很关键。你想想看,如果相机和LiDAR的时间戳对不上,那融合出来的点云投影就是「鬼影」。我建议用硬件触发同步,或者至少用PTP协议做时间同步。
3.2 数据清洗:把垃圾倒掉
采集回来的数据,不可能每一帧都是好的。数据清洗,说白了就是「去伪存真」。我见过有人直接拿原始数据训练,结果模型学了一堆噪声。
3.2.1 常见脏数据类型
- 模糊帧:运动模糊、对焦不准。直接删掉。
- 遮挡帧:镜头被泥巴、树叶挡住。这种数据留着只会误导模型。
- 重复帧:车辆静止时采集的连续帧,几乎一模一样。需要做去重。
- 异常值:LiDAR点云中出现飞点(比如突然出现一个100米外的孤立点)。用统计滤波干掉。
3.2.2 清洗流程
我个人习惯用三步走:
- 粗筛:用规则过滤(比如图像亮度、对比度、点云密度)。
- 精筛:用预训练模型做质量打分,低于阈值的剔除。
- 人工抽检:随机抽5%的数据,人工确认清洗效果。
3.3 数据增强:别让模型「死记硬背」
数据增强,说白了就是「无中生有」。但要注意,不是所有增强都适合自动驾驶。我见过有人给图像加高斯噪声,结果模型在真实场景中反而变差了。
3.3.1 几何增强
- 随机翻转:水平翻转(注意:不要垂直翻转,否则车会「飞」起来)。
- 随机裁剪:模拟不同视角。
- 旋转:±15度以内,太大就失真了。
3.3.2 颜色增强
- 亮度调整:模拟不同光照。
- 对比度调整:模拟雾天或逆光。
- 色彩抖动:轻微改变色调,模拟不同相机参数。
3.3.3 点云增强
对于LiDAR点云,常用的增强有:
- 随机旋转:绕Z轴旋转。
- 随机缩放:模拟不同距离。
- 随机丢弃:模拟遮挡或传感器噪声。
3.4 标注格式与工具:COCO、KITTI、NuScenes
标注格式,是数据与模型之间的「桥梁」。选错了格式,后面转换起来会非常痛苦。我建议一开始就定好标准。
3.4.1 三大主流格式对比
| 格式 | 适用场景 | 核心特点 | 缺点 |
|---|---|---|---|
| COCO | 2D目标检测、实例分割 | JSON格式,支持多边形标注 | 不支持3D信息 |
| KITTI | 3D目标检测、跟踪 | 文本格式,包含3D框参数 | 标注规范较老,扩展性差 |
| NuScenes | 多模态融合、预测 | JSON格式,支持多传感器 | 文件结构复杂 |
我个人习惯,如果是纯视觉项目,用COCO格式就够了。如果涉及LiDAR和融合,NuScenes格式更灵活。KITTI格式虽然老,但很多开源代码都支持,兼容性好。
3.4.2 标注工具推荐
- LabelImg:轻量级,适合2D框标注。
- CVAT:功能强大,支持视频标注和自动追踪。
- Supervisely:云端平台,适合团队协作。
- Point Cloud Annotation Tool:专门用于3D点云标注。
3.5 数据质量评估:别等训练完才发现问题
数据质量评估,是很多人容易忽略的一步。你想想看,如果数据质量不行,模型训练得再好也是「垃圾进,垃圾出」。
3.5.1 评估指标
- 标注一致性:同一张图,不同标注员的结果是否一致?用IoU来评估。
- 类别分布:各类别样本数量是否均衡?不均衡的话,模型会偏向多数类。
- 难度分布:简单样本和困难样本的比例是否合理?全是简单样本,模型泛化能力差。
3.5.2 自动化评估工具
我写了一个简单的质量评估脚本,会输出以下报告:
# 伪代码示例
def quality_report(dataset):
report = {}
report['total_images'] = len(dataset)
report['avg_bbox_per_image'] = ...
report['class_distribution'] = ...
report['annotation_iou'] = ...
return report
3.6 知识体系总览
下面这张图,是我自己总结的数据采集与预处理知识体系。你可以把它当作一个「检查清单」,每次做数据时对照着来。
数据这块,说白了就是「细节决定成败」。从采集到清洗,从增强到标注,每一步都马虎不得。我见过太多项目,算法调得再好,最后死在数据上。希望今天的内容,能帮你少走一些弯路。