3D Object Detection
3D 目标检测会为每个物体标出一个 3D 框,给出物体以米为单位的位置、尺寸和朝向。本文介绍传感器、方法、基准测试和框示例。
3D 目标检测会在场景中查找目标,并为每个目标确定一个 3D 边界框,也称长方体,以表示其真实世界单位下的位置、尺寸和朝向。标准 2D 目标检测以图像像素为单位报告边界框。3D 检测器会报告汽车的距离(米)、长宽,以及车头朝向;这些信息是自动驾驶汽车、配送机器人和仓库机械臂规划运动、避免碰撞所必需的。
3D 边界框的表示方式#
大多数 3D 检测器会为每个目标输出七个数值,以及一个类别和置信度分数:边界框中心坐标 (x, y, z)、长宽高,以及绕垂直轴的朝向或偏航角。由于汽车、行人和大多数室内物体都直立放置,滚转角和俯仰角通常设为零;nuScenes 等自动驾驶基准还会要求提供每个目标的速度。将这七个数值转换为八个角点,是在图像上绘制边界框或计算其与另一个边界框重叠程度的第一步。
import numpy as np
# 一个 3D 边界框:中心位置(米)、尺寸(米),以及绕垂直 z 轴的朝向(弧度)
center = np.array([12.0, -3.0, 0.9])
length, width, height = 4.5, 1.9, 1.6
yaw = np.pi / 6
# 旋转前相对于中心的边界框八个角点
signs = np.array([[sx, sy, sz] for sx in (1, -1) for sy in (1, -1) for sz in (1, -1)])
corners = signs * [length / 2, width / 2, height / 2]
# 按朝向旋转,然后将边界框平移至中心位置
c, s = np.cos(yaw), np.sin(yaw)
rotation = np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]])
corners = corners @ rotation.T + center
print(corners.round(2))输出的八行是一个汽车大小边界框的角点:该边界框沿 x 轴居中于 12 米处,并旋转了 30 度;其中四个角点的 z = 1.7 m,表示车顶,另外四个角点的 z = 0.1 m,表示地面。
传感器与方法#
3D 检测需要深度,系统可从三种输入中获取深度。激光雷达扫描仪使用激光脉冲直接测量距离,并生成场景的点云。激光雷达检测器会将空间划分为 3D 体素,将点分组成垂直柱体(如 PointPillars所做的那样),然后将其作为鸟瞰图像使用快速的 2D 卷积进行处理,也可以直接处理原始点。
基于摄像头的方法会从图像推断深度。单个摄像头无法明确判断深度,因为近处的小物体和远处的大物体看起来可能相同,因此单目检测器会根据物体大小和场景上下文学习深度。像 BEVFormer 这样的多摄像头系统会将多个周边视角中的特征投射到一个共享的鸟瞰网格中。摄像头流程还可以结合 YOLO26 的 2D 边界框和 YOLO26 深度模型,后者会根据一张 RGB 图像预测以米为单位的逐像素深度图,从而估算每个检测目标的距离。
传感器融合会结合激光雷达的精准几何信息与摄像头图像的颜色和纹理。BEVFusion 会在共享的鸟瞰空间中融合两种传感器的特征。
3D 检测与相关任务的比较#
- 深度估计:为每个像素预测距离,但不会将场景划分为不同目标或类别。
- 有向边界框:位于图像平面内的旋转 2D 边界框,常用于航拍图像,其形状类似于 3D 边界框的俯视轮廓。
- 3D 重建:重建场景的完整几何结构,例如网格或点云,但不会标注单个目标。
应用与挑战#
自动驾驶汽车使用 3D 检测来定位周围的汽车、行人和骑行者并预测其行进路线;仓储和物流机器人则用它在抓取箱子前确定箱子的位置和朝向。难点包括距离较远的小目标(这类目标获得的激光雷达点较少)、部分被遮挡的目标、会随距离增加而扩大的单目深度误差,以及标注成本,因为每个训练用长方体都必须由标注人员在 3D 空间中拟合。
3D 检测器的评估#
评估会将交并比 (IoU)和平均精度均值 (mAP)扩展到三维空间。KITTI 的 3D 基准要求汽车的 3D 边界框 IoU 达到 0.7,行人和骑行者达到 0.5;自 2019 年起,它会在 40 个召回率位置计算平均精度,而不是 11 个。nuScenes 基准会根据预测结果与标签在地平面上的中心距离进行匹配,并计算 0.5、1、2 和 4 米阈值下的 AP 平均值。其 nuScenes 检测分数 (NDS) 将 mAP(权重为 5)与另外五项分数组合,这五项分数分别根据平移、尺度、朝向、速度和属性误差计算,权重均为 1。










