三维包围盒检测:从引擎真值到 KITTI / COCO
概述
训练自动驾驶感知模型需要三维包围盒标注——不仅要知道「画面中哪里有车」,还需要物体在空间中的尺寸、距离与朝向。获取此类真值是仿真采集的核心价值之一:在真实世界中逐帧人工标注三维框成本极高且精度受限,而在引擎中所有几何信息天然可得。
IADataSDG 的检测管线直接从场景几何中提取方向包围盒(OBB),经相机投影产生精确的 2D / 3D 标注,并提供到 KITTI 与 COCO 等标准格式的离线转换。本文说明这条管线的设计思路、输出格式,以及两种标准格式各自的能力边界。
检测真值的来源:几何,非检测器
与“先跑一个检测器,再把结果当标签”不同,仿真里的检测真值更像是从场景里直接把答案拿出来。
用户只需要先说明哪些物体需要被检测、它们属于什么类别。接下来,系统会在每一帧里直接读取这些物体的几何信息,再把它们按当前相机的视角投到图像上。这里最关键的一点是,它用的是真正参与这一帧渲染的视图信息,而不是在别的线程里临时猜一个近似视角。这样做的意义,不只是“更精确”,更是为了尽量减少那种看起来只差一点、实际会在训练里不断累积的错位。
由于几何来自引擎本身、投影矩阵又与实际渲染帧对齐,这条路线能显著减少由游戏线程重建视图、轴对齐包围体或错帧引起的系统误差;但几何真值仍应通过重投影与可视化持续验证,而不能仅凭文件格式通过就认定“完全正确”。
格式通过不代表几何正确
三维框最容易出现一种“看上去一切正常”的错误:文件格式对了、字段也全了,但框就是和 RGB 里的目标对不上。原因通常不在某一个字段,而在于 2D 框、3D 尺寸、相机参数可能来自不同阶段,最后被硬拼成了一份表面合法的标注。
因此,IADataSDG 把Box3D JSON当作原生格式,而把 KITTI / COCO 看作兼容层。前者保留了更多适合核对几何的内容,后者则更适合接入已有工具链。更稳妥的做法,不是只看文件能不能被读进去,而是把下面两类检查放进日常验证里:
- 将 3D 框重投影回 RGB,做叠加目检。
- 对失败样本做 reprojection IoU 或等效几何一致性抽查,而不是只看校验器是否通过。
主输出:Box3D JSON
每帧、每相机生成一份 JSON 文件({camera}/labels/frame_*.json),这是精度最高且信息最完整的输出格式。
根级字段:
| 字段 | 含义 |
|---|---|
frame | 帧编号 |
camera | 相机名 |
resolution | [width, height] |
objects | 目标数组 |
每个目标:
| 字段 | 含义 |
|---|---|
type | 类别名(来自IA.Type.*标签) |
distance_m | 目标到相机的距离(米) |
truncated | 截断率 [0, 1],视口边缘裁剪程度 |
occluded | 遮挡等级(当前占位,固定 0) |
bbox2d | 2D 包围框[left, top, right, bottom](像素) |
dimensions_m | 三维尺寸[x, y, z](米) |
edges_2d | 3D 框各条边的 2D 投影,每条为[x1, y1, x2, y2] |
pivot_2d | 目标参考点(pivot)的 2D 投影[px, py] |
edges_2d是区别于传统 2D BBox 标注的核心:它提供了投影后的完整三维框轮廓,可直接叠加在图像上做可视化,也可被训练管线直接消费。
KITTI 格式转换与限制
通过convert_labels.py --kitti可将 Box3D JSON 转为标准 KITTI 15 列格式:
type truncated occluded alpha left top right bottom h w l x y z rotation_y
转换过程中存在不可避免的信息损失:
| 项目 | Box3D JSON | KITTI 15 列 | 说明 |
|---|---|---|---|
| 2D 框 | bbox2d直接可用 | 直接映射 | 无损 |
| 3D 尺寸 | dimensions_m | h, w, l | 无损 |
| 3D 位置 | 无世界坐标导出 | x, y, z由 pivot + 深度 + 内参推算 | 近似值;无法恢复真实世界坐标 |
| 朝向 | 无旋转导出 | rotation_y固定为 0 | 占位;当前序列化器不导出世界系旋转角 |
| 观测角 | 无 | alpha由atan2(x, z)推导 | 取决于位置近似质量 |
| 遮挡 | occluded= 0(占位) | 透传 | 均为占位 |
| 3D 边投影 | edges_2d(完整线段) | 不存在 | 丢失——KITTI 没有此字段 |
核心限制:KITTI 格式要求相机坐标系下的精确 3D 位置与旋转角,而 Box3D 管线当前不导出世界系的location/rotation。KITTI 的x, y, z是由 2D pivot、距离与内参逆投影近似得到的,rotation_y为 0——这意味着KITTI 输出适合 2D 检测评估,但不适合直接用于 3D 位姿回归任务。
COCO 格式转换与限制
通过convert_labels.py --coco生成标准 COCO Detection JSON:
{
"images": [...],
"annotations": [{"bbox": [x, y, w, h], "area": ..., "category_id": ...}],
"categories": [...]
}
COCO 转换的限制更为直接:
| 项目 | 状态 |
|---|---|
| 2D BBox | 从bbox2d转为 COCO[x, y, w, h]格式 |
| 类别映射 | 自动从type建立 category ID |
| 3D 信息 | 全部丢失——COCO 标准不含 3D |
| 分割掩码 | 无——COCO 的segmentation字段为空 |
| 截断 / 遮挡 | 丢失——COCO 无对应字段 |
COCO 输出仅适合2D 目标检测评估(AP / AR 指标),不包含三维信息或实例分割掩码。
格式选择建议
┌──────────────────┐
│ Box3D JSON │ ← 精度最高、信息最全
│ edges_2d + 3D │
└───────┬──────────┘
┌─────┴─────┐
▼ ▼
┌───────────┐ ┌──────────┐
│ KITTI │ │ COCO │
│ 15 列 TXT │ │ JSON │
└───────────┘ └──────────┘
3D 近似、旋转占位 仅 2D BBox
- 如果训练管线可消费自定义 JSON:直接使用 Box3D JSON,可获得完整的 3D 框投影与尺寸信息。
- 如果需要与 KITTI 基准对齐:使用 KITTI 转换,但需知晓 3D 位置为近似值、旋转角为占位。适合 2D 检测指标。
- 如果需要与 COCO 工具链对接:使用 COCO 转换,但仅包含 2D 框信息。
与其他 SDG 工具对比
| 能力 | IADataSDG | Isaac Sim | CARLA |
|---|---|---|---|
| 3D BBox 精度 | 引擎几何 OBB,渲染线程 VP 对齐 | 引擎几何,相似精度 | 引擎几何 |
投影线段 (edges_2d) | 支持,含近平面裁剪 | 不输出投影线段 | 不输出 |
| KITTI 导出 | 离线转换(15 列,位置近似) | 内置,但同样受格式限制 | 内置 |
| COCO 导出 | 离线转换 | 内置 | 不内置 |
| 多相机一致性 | 同帧共享 bounds 快照 | 支持 | 有限 |
| 编辑器标注工具 | Detection Tag Tool(批量、可撤销) | GUI 标注 | 无专用工具 |
| 遮挡分级 | 占位(未实现真实遮挡计算) | 部分支持 | 部分支持 |
在 AI 模型训练中的价值
- 单目 3D 检测:FCOS3D、PGD、MonoDETR 等方法依赖带精确 3D 尺寸与距离的标注;人工在 2D 图像上回归 3D 框误差大,仿真几何真值可提供训练所需的无噪声监督。Box3D JSON 中的
edges_2d还可训练基于投影线段的 3D 框回归网络,不受 KITTI 格式约束。 - 多模态融合检测:BEVFusion、TransFusion 等将相机与 LiDAR 特征在 BEV 空间对齐;训练需要跨传感器的一致 3D 标注。仿真中所有传感器共享同一帧的 bounds 快照,确保融合真值无时间偏移。
- 预训练与微调:合成 3D 标注量大且无标注成本,可用于检测模型的大规模预训练;在 nuScenes / Waymo 等真实数据上微调后,已有工作表明预训练阶段引入仿真数据可提升收敛速度与长尾类别精度。
- 数据不平衡缓解:真实数据集中稀有类别(施工车辆、动物、轮椅等)样本极少;仿真可按需放置并自动标注,定向补充尾部类别的训练样本。
- 标注质量基准:合成框精度为像素级,可作为标注工具校验或众包标注一致性评估的参照。
小结
IADataSDG 的 3D BBox 管线以引擎精确几何为真值来源,提供信息丰富的 Box3D JSON 作为原生输出,并支持到 KITTI 与 COCO 的离线转换。核心要点:
- Box3D JSON 是推荐的首选格式,包含 3D 框投影线段、精确尺寸与距离。
- KITTI 转换为有损近似:3D 位置由逆投影推导、旋转角为占位,适合 2D 评估而非 3D 位姿回归。
- COCO 转换仅保留 2D BBox,不含三维信息或分割掩码。
- 如需完整三维信息,建议直接消费 Box3D JSON 或等待后续对世界坐标导出的支持。
参考文献
[1] A. Geiger et al., "Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite,"CVPR, 2012.
[2] T.-Y. Lin et al., "Microsoft COCO: Common Objects in Context,"ECCV, 2014.
[3] T. Wang et al., "FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection,"ICCVW, 2021.
[4] T. Wang et al., "Probabilistic and Geometric Depth: Detecting Objects in Perspective,"CoRL, 2021.
[5] Z. Zhang et al., "MonoDETR: Depth-guided Transformer for Monocular 3D Object Detection,"ICCV, 2023.
[6] Z. Liu et al., "BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird's-Eye View Representation,"ICRA, 2023.
[7] X. Bai et al., "TransFusion: Robust LiDAR-Camera Fusion for 3D Object Detection with Transformers,"CVPR, 2022.
[8] H. Caesar et al., "nuScenes: A multimodal dataset for autonomous driving,"CVPR, 2020.