Deep3DBox 是一篇比较早的使用单目相机进行3D目标检测和姿态估计的方法。

Deep3DBox 先用 CNN 回归目标的方向和尺寸,因为这两类属性稳定性比较高。然后结合 2D BBOX 的几何约束求解平移量,以生成完整的 3D BBOX。

有些方法基于 PnP,通过 2D-3D 关键点对应关系求解姿态,需要人工标注关键点和 3D 模型。

论文中提到了一个数据集:PASCAL 3D+。这个数据集包含了 PASCAL VOC 中的12个类别,主要用于估计相机的拍摄视角和距离,而非用于 3D目标检测。

CNN 出现以后,很多方法采用 CNN 进行目标检测,然后将检测到的 2D BBOX 区域作为输入,传递给另一个 CNN,利用 PASCAL 3D+ 来训练并估计物体姿态。总的来说,这些方法都需要带有标注的关键点,和 Deep3DBox 并没有太大关系。

Deep3DBox 放弃直接回归 3D 姿态,而是使用 CNN 回归关键参数,再用几何约束求解剩余的参数。

3D BBOX估计的几何基础

论文先使用 2D 检测的结果得到 2D BBOX,且 2D BBOX 必须是 3D BBOX 经相机透视投影后的约束框,也就是 3D BBOX 的投影应该恰好贴合 2D BBOX 的4条边。

论文中 3D BBOX 定义如下,是后续求解的对象(9DoF):

  • 平移:中心点T=[tx,ty,tz]TT=[t_x, t_y, t_z]^T,分别为相机坐标系下的 X/Y/Z 轴坐标

  • 尺寸:D=[dx,dy,dz]TD=[d_x, d_y, d_z]^T

  • 朝向:R(θ,ϕ,α)R(\theta, \phi, \alpha),分别为方位角,俯仰角,滚转角

相机将目标坐标系 3D 点,投影到像素坐标系 2D 点的公式:

x=K[R  T]Xox=K \cdot [R\ \ T] \cdot X_o

其中各符号含义:

  • Xo=[X,Y,Z,1]TX_o=[X, Y, Z, 1]^T:目标坐标系下的 3D 齐次坐标,原点在 3D BBOX 中心

  • [R  T][R\ \ T]:位姿矩阵,实现目标坐标系到相机坐标系的刚体变换

  • KK:相机内参矩阵

  • x=[u,v,1]Tx=[u, v, 1]^T:像素坐标系下的2D齐次像素坐标

文中的目标坐标系是为每个 3D BBOX 单独建立的局部坐标系。检测出 N个目标,就应该有 N 个目标坐标系。

3D BBOX 的8个顶点坐标,可以直接推导得出:

X1=[dx/2,dy/2,dz/2]T,X2=[dx/2,dy/2,dz/2]T...X8=[dx/2,dy/2,dz/2]T(1)X_1=[d_x/2, d_y/2, d_z/2]^T, X_2=[-d_x/2, d_y/2, d_z/2]^T... X_8=[-d_x/2, -d_y/2, -d_z/2]^T \tag{1}

贴合约束的要求是:3D BBOX 的投影应该紧密的贴在 2D BBOX 上,2D 框的4条边,每条至少被一个 3D 框的顶点触碰。

举个例子,2D 框左边界xminx_{min} ,3D框顶点X0=[dx/2,dy/2,dz/2]TX_0=[d_x/2, -d_y/2, d_z/2]^T应该恰好触碰 xminx_{min},则满足:

xmin=(K[R  T][dx/2dy/2dz/21])x(2)x_{min} =\left( K \cdot [R\ \ T] \cdot \begin{bmatrix} d_x/2 \\ -d_y/2 \\ d_z/2 \\ 1 \end{bmatrix} \right)_x \tag{2}

其中(.)x(.)_x表示:取透视投影结果的 X 轴像素坐标。2D框其他3个顶点也对应一个几何约束方程,这样就得到了4个约束条件。3D 框是 9DoF,4个约束不够。

要注意,4个约束方程的来源是 2D BBOX 的4个边界,而非 3D BBOX 的8个顶点。约束实际来自于 2D BBOX。

论文在这9个 DoF 中,选择使用 CNN 来回归尺寸朝向,使用集合约束来求解平移

原因有二:

  1. 类内方差小:因为在交通场景下,同一类别的目标尺寸差异很小。拿人举例,姚明和我的身高差距很大,但也只是厘米级别的。除此之外,目标的尺寸不会随朝向产生变化。这说明这二者是比较稳定的属性,容易通过 CNN 从视觉特征中回归。

  2. 尺寸与目标外观存在强关联:不同类型的目标的视觉特征有显著差异,显著的视觉差异大多来自于目标的尺寸。但是平移TT没有这么强的关联。

回到 2D 框和 3D 框之间的约束问题。我们需要确定:2D 框的4条边和 3D 框的8个顶点的存在多少对应关系?2D 每1个边可以可能对应 3D 的8个点,枚举下来,[±dx/2,±dy/2,±dz/2][\pm d_x/2, \pm d_y/2, \pm d_z/2]就是 84=4096 种可能性,需要求解4096次公式2。下面是为了简化这个问题做的处理:

  1. 目标直立的假设:2D 框的上下边,应该分别对应3D框的上下顶点,左右暂时没有这个假设。基于此假设,组合总数变成 4x4x8x8=1024。

    • 2D 上边:对应 3D 框顶部 4 个顶点

    • 2D 下边:对应 3D 框底部 4 个顶点

    • 2D 左右边:仍然是分别对应 8 个顶点

  2. 投影面分离:组合总数变成 4x4x4x4=256。

    • 2D左右边:2D 框的xminx_{min}xmaxx_{max} 只能由 3D 框的 4 个垂直线决定。在局部坐标系中,这对应于坐标[±dx/2,,±dz/2][\pm d_x/2, \cdot, \pm d_z/2]。由于YY 坐标上下变化并不影响投影的左右极值点,因此左右边各有 4 种配置。

    • 2D 上下边:同理,yminy_{min}ymaxy_{max} 对应于 3D 框的水平边缘[,±dy/2,±dz/2][\cdot, \pm d_y/2, \pm d_z/2],各有 4 种配置。

  3. KITTI特殊先验:相机 Pitch&Roll = 0,目标无俯仰和翻滚,而且这时候模型推理得到了 Yaw 角。相机坐标系和地面是严格平行的。这导致3D框的“上”就是”上“,"下"就是"下"。组合总数变成4x4x2x2=64种。

    • 2D上边: yminy_{min} 只能来自于 3D 框顶面(局部坐标Y=dy/2Y = -d_y/2),排除底部平面(Y=+dy/2Y = +d_y/2)。对于上下边配置[,±dy/2,±dz/2][\cdot, \pm d_y/2, \pm d_z/2],代表高度的YY 符号被唯一固定为负(Y=dy/2Y = -d_y/2 )。变量只剩下前/后(±dz/2\pm d_z/2)。所以,顶边只剩下 2 种有效配置。

    • 2D下边:同理,2D 框的底边ymaxy_{max} 只能来自于 3D 框底部平面(即局部坐标Y=+dy/2Y = +d_y/2)。YY 的符号被唯一固定为正,变量同样只剩前/后(±dz/2\pm d_z/2 )。底边也只剩下 2 种有效配置。

Deep3DBBOX-PerspectiveProjection.webp

朝向的回归

这一部分解决俩问题,一是回归什么朝向,局部还是全局,二是损失函数设计。

朝向问题

论文用 MS-CNN 输出物体的 2D BBOX,仅使用 BBOX 内的像素和相机内参。所以 CNN 仅能看到框内的像素,无法获取 BBOX 在整张图像中的位置信息。而相机的射线方向(小孔成像那个物体到CMOS的射线)由像素位置决定,所以没办法直接估计物体的全局朝向。

顺手说一下全局和局部朝向:

  • 全局朝向:物体在相机坐标系中的绝对朝向,是最终需要的3D参数

  • 局部朝向:物体相对于 BBOX 中心的相机射线的相对朝向,可以由内参直接计算。网络训练的输出就是局部朝向。

从下图可以看出,尽管目标一直朝前开,绝对朝向θ\theta没变,但是射线方向θray\theta_{ray}和在BBOX内的相对朝向θl\theta_l是有变化的。

损失函数设计

然后对于多模态的回归问题,L2 损失不合适,因为 L2 损失会促使网络最小化所有模态的平均损失。

那用啥损失函数呢?作者提出了个 MultiBin 架构,核心是先分类,再回归。

分类是将局部朝向划分为多个 bin,bin 之间存在重叠,每个 bin 有一个中心角度

每个 bin 输出:

  • 置信度cic_i:局部朝向角落在第 i 个bin的概率

  • cos(Δθi)cos(\Delta\theta_i):第 i 个bin的中心角度到真实朝向角的残差的余弦

  • sin(Δθi)sin(\Delta\theta_i)

最终损失函数为:

Lθ=Lconf+w×LlocL_\theta=L_{conf}+w \times L_{loc}

LconfL_{conf}置信度损失:Softmax 交叉熵损失,本质是分类任务,判断朝向属于哪个 bin。

LlocL_{loc}定位损失:余弦的距离损失,让估计角度接近真实角度。

ww权重,用于平衡两个损失的贡献度。

网络设计

网络设计的比较简单,使用无 FC 的预训练的 VGG,仅保留 Conv 和 Pooling。

VGG 网络共享 Conv 特征,共享的目的是确保朝向和尺寸估计使用一套特征,避免特征冗余,同时模型还能学习到朝向和尺寸的关联特征。

有3个分支:

  1. 一组 FC(dim=256)接置信度分支,输出 n 个 bin 的置信度。

  2. 一组 FC 接 L2 归一化后,给出每个 bin 的三角函数值。

  3. 最后一组 FC 用来回归目标尺寸。

Deep3DBBOX-OrientationRegression.webp

尺寸的回归

尺寸回归直接使用 L2 损失计算,原因在开头说过了。

不过论文没有直接回归真实尺寸DD,而是回归了真实尺寸D相对于数据集中同类别目标平均尺寸D\overline {D} 的残差δ\delta

优势在于,数据集中同类别平均尺寸D\overline {D} 是固定值,是统计出来的,残差δ\delta 的数值远小于DD 本身。小数值的残差更容易收敛。

Ldim=1n(DDδ)L_{dim}=\cfrac{1}{n}\sum(D^*-D-\delta)

其中:

  • nn为尺寸dim=3。

  • DD^*为真实尺寸GT。

  • D\overline {D} 是类别平均尺寸。

  • δ\delta 是估计尺寸和目标平均尺寸的残差,也就是δ=D^D\delta = \hat{D}-\overline{D} ,D^\hat {D} 是模型估计出的尺寸。

最终模型总损失为

L=Lθ+α×LdmL = L_{\theta} + \alpha \times L_{dm}

参考文章

[1] [1612.00496] 3D Bounding Box Estimation Using Deep Learning and Geometry

[2] PASCAL 3D+ 数据集概述 - 知乎