单目3D目标检测

单目相机只能获取平面图像,如何能进行3D目标检测呢?在vSLAM领域,我们可以根据单目相机的运动模型对周围环境进行3D重建,但这需要相机运动时,周围物体保持静止或缓慢移动状态,才能正确完成3D重建,且重建必须建立在多帧连续图像的基础上。而在目标检测领域,往往要求实时检测,且相机和物体直接可能存在高速运动并且运动速度未知。因此,采用与vSLAM类似的几何方法来确定物体的3D边框并不可行。

另一方面,目标检测任务并不需要重构物体完整的3D形状,仅仅确定3D边框即可。因此,单目3D目标检测任务可以转化为通过2D图像估计3D边框的一系列关键点的问题,关键点的回归显然可以通过构造一个深度网络模型来实现,同时,我们也可以通过一些先验条件进行约束,来减小误差。(同类型物体往往具有相近的大小)

2017年,一篇名为《3DBBox Estimation Using Deep Learning and Geometry》的文章,为基于单目图像进行3D 目标检测和姿态估计奠定了基础。该方法主要创新点在于:

(1)采用一种discrete-continuous CNN架构,称为MultiBin回归,来估计物体的方向

(2)回归物体的大小和尺寸

通过以上两条回归,再结合物体的2D检测框,可以通过投影几何提供的约束来解算出相应的3D边框。模型框图如下所示:


上图中,共享卷积特征可以用任何经典的网络作为back bone,由于需要2D检测框参与解算,我们可以和2D检测模型共用一个back bone 做特征提取,百度Apollo就基于yolov2改造了一个yolo-3D模型。

3d box的长宽高回归

尺寸的回归并不直接回归长宽高,而是回归其残差。以 KITTI 数据集为例,车,货车,卡车 和 公交车都是不同的类,并且不同类的区分方差很小且单峰。例如,车和自行车的尺寸方差在厘米的数量级上。因此,我们直接使用 L2损失, 作为一个标准,在训练的数据集上对于每一个尺寸我们计算相对于平均值的残差,尺寸的估计损失通过以下的公式计算: 

                     

其中是 box 的真实尺寸, 是一个特定类的物体平均尺寸,是网络预测相对于平均值估计的残差。

角度回归

文章提出了MultiBin 结构用来方向估计。首先离散方向角并分为n 个overlapping bins。对于每一个bin,CNN网络估计输出的角度在第i个bin 的置信度 和 每个bin 为了获得输出角所需要的(residual rotation correction ) 旋转残差修正。

旋转残差用两个数字表示,用角度的sine 和 cosine值,所有每个bin i的3个输出是:(,,). 有效的cosine 和 sine 值利用一个归一化层在二维输入的顶部获得。MultiBin 方向的全部损失用一下公式表示:

置信损失等于每个bin 的softmax loss 的置信。 是用于最小化估计的角度和真实的角度,所有和真实角度有重叠的bins 会用来估计正确的角度。定位损失尝试最小化真实数据和所有余弦值最大的bins的误差。 定位误差 一下方式计算:

其中是和真实角度有覆盖的  的bins 的个数。是bin i的中心角度, 是bin i的中心需要的变化量。

根据推论,会选择具有最大置信度的bin,最后的结果会利用bin Δθ的中心来估计。 MultiBin 模块有两个分支。一个是计算置信度  另外一个是计算 Δθ 的 sine 和 cosine 值。 最后3n 个参数用来估计 n 个 bin。

3D box的计算

(1) 3D Bounding Box 估计(下面简化为3Dbb)

为了在3Dbb中利用已有的成熟的2D object detection 的工作,这里我们构建两者的关系, 3Dbb 投影到2Dbb (是不是跟SLAM的里面的3D-to-2D很像,没错,后面就是用PnP 算的)。3Dbb 的中心为 , 尺寸D=[dx,dy,dz]  以及方向角R(θ,ϕ,α), 这里用方位角,海拨,(roll)转动角来表示(正常开车没有pitch 和 yaw)。物体相对相机坐标的位姿(R,T)∈SE(3)(R,T)∈SE(3),相机的内参 矩阵K,投影的3D点为 ,在物体图像坐标为

                    (1)

假设原始图像中物体的坐标中心就是3Dbb 的中心,(这个假设是个比较强的假设)同时尺寸DD 也已知,候选的3Dbb 坐标可以表示成 ,  ,…..,  。 3Dbb 和 2Dbb 能够匹配形成约束,需要3Dbb的每一角能投映射到2Dbb至少一个边上。

例如和2Dbb左边的最小的链接,点到带你的对应约束可以如下方程:

    (2)

其中(.)x(.)x 表示相对于 x 坐标系,剩余 2Dbb 得的  也可以得到相似的方程,也就是可以得到四个与3Dbb的约束。但是这个用来获取degrees of freedom(DoF) (three for translation, three fro rotation, and three for box dimensions) 是不够的,另外还有一些几何约束可以通过box 的visual appearance 获取,这个主要的标准就是这些约束和visual appearance 紧密相关,同时可以用来加强3Dbb的约束。

2 选择回归参数

(θ,ϕ,α) 对3Dbb 具有很大的影响,其次文章选择回归box 的尺寸,而不是平移矩阵T ,因为尺寸估计的方差比较小(先验所有的车具有相同的大小) 也不会因为物体的方向角变化而变化。具体的实现细节在后面的章节中。

3 相应的约束

根据方程2, 通过CNN获取的 3Dbb 的方向角和尺寸以及 2Dbb 的约束,最小重投影误差就可以得到平移矩阵 T.

2D detection box 可以对应到 3Dbb 8个角点 中的任意一个,这样可能性就有  种, 很多情况下我们假设物体是朝上的。2Dbb 上面和下面的只对应3D box 的上部和下部,可能性就降为 1024种, 另外当物体的roll 为0 的时候,2D box 的边坐标  就是可以对应3Dbb 的边。相似的, 只对应水平3D box 的点。因此, 每个2D detection box的垂直边 对应

每个2D detection box的水平边 对应 因此得到的  种。 在KITTI 数据库中,物体 pitch 和 roll  的角度都是零,所以随后得到 64 种的映射关系。

以上是论文对2D-3D越是关系的解释,个人觉得论述的还不是很清楚。下面给出我自己的说明。首先我们得先搞清楚空间中得某个点在坐标系旋转过后对应得点。

以正前方为X轴,以左手坐标系建立O_XYZ坐标系。Yaw、Pitch、Roll建立坐标系,从基准正前方出发,相机以向上和向右旋转为正。


由于求取旋转矩阵是,坐标轴之间的旋转都是以逆时针进行的,所以实际角度有如下关系:


旋转矩阵表示:


在具体到行车场景下,无论人还是车都是立于地面的,所以只有在yaw方向得偏转,roll和pitch均为0。也就是说,均为0。把代入上式得到

\begin{bmatrix}
x\\ 
y\\
z 

\end{bmatrix}= \begin{bmatrix}
cos\theta cos\psi  & -cos\phi sin\psi +sin\phi sin\theta cos\psi  & 0\\ 
cos\theta sin\psi & cos\phi cos\psi +sin\phi sin\theta sin\psi & 0\\ 
 0&  0& cos\phi cos\theta 
\end{bmatrix}\begin{bmatrix}
X\\ 
Y\\ 
Z
\end{bmatrix}

上式中,第一行第三列和第二行第三列均为0,对应的Z()可以忽略,2*2=4,总可能性除以4等于256种。第三行的第一、二列为0,对应的X()和Y()可以忽略,同样2*2=4,总可能性再除以4等于64种。

改进

基于图像的三维检测方法将3DBBox到2DBBox的几何约束当作其重要的组件,然而四条边仅能提供四个几何约束,这使得2DBBox有微小误差时也会造成3D检测性能的急剧下降。

针对以上问题,2020年1月的 一篇文章《RTM3D: Real-time Monocular 3D Detection from Object Keypoints for Autonomous Driving》提出单过程单目3D检测,并且没有利用2D 检测器处理3D检测,如图1所示,分为两部分:

首先对3D box进行参数估计,其中8个顶点,1个中心点,这9个点为3D box提供了18个几何约束。受CenterNet启发,对8个顶点和中心点进行建模来解决关键点建群、顶点顺序问题。SIFT,SUFT以及其他传统方法进行关键点检测,并计算图像金字塔来解决尺度不一致问题。CenterNet使用了相似的策略进行后处理操作,增加准确性,但处理速度变慢。注意,2D目标检测中的特征金字塔网络(FPN)不适用于关键点检测网络,因为在小尺度预测的情况下,相邻的关键点可能会重叠。我们提出多尺度金字塔关键点检测方法来产生尺度空间响应。通过soft-weighted金字塔的方法,可以得到最终的关键点激活图。

当给定9个投影点时,下一步就是最小化由物体的位置、尺寸、方向参数化的3D点的透视图上的重投影误差。重投影误差由SE3空间的多元公式表示。对维度、方向、距离的先验信息对基于特征点的方法影响进行讨论。获得此信息的前提是不增加计算量,以免影响检测速度。 我们对这些先验模型进行建模,并将重投影和先验误差项建立整体能量函数,以进一步改善3D估计。

然后,我们通过使用透视投影的几何约束将3D边界框的估计重新构造为使能量函数最小化的问题。

主要贡献

我们将单目三维检测作为关键点检测问题,并结合几何约束来更有效、准确地生成三维物体的属性。

我们提出了一种新颖的单阶段多尺度网络用于三维关键点检测,为多尺度目标提供精确的投影点。

我们提出一个整体的能量函数,可以联合优化先验和三维目标信息。

在KITTI基准上的评估,我们是第一个只使用图像的实时三维检测方法,在相同的运行时间下,在与其他竞争对手的比较中,我们也能获得更好的准确性。

方法

 特征点监测网络

关键点检测网络仅将RGB图像作为输入,并从3D bounding box的顶点和中心生成透视点。如下图所示,包含三个主要部分:主干网络、特征点金字塔网络和检测头。主要结构采用单步策略,与anchor-free 2D目标检测器采用相似分布,从而进行快速检测。

关键点检测结构:它仅以RGB图像为输入,并输出主要中心heatmap,顶点heatmap和顶点坐标作为基本模块来估计3D边界框。 它还可以预测其他先验,以进一步提高3D检测的性能。

主干网络:

    在权衡速度和精度时,选用了ResNet18 和DLA-34 结构。两模块都是将单张RGB作为输入,并且进行S=4的下采样。ResNet18 和DLA-34是用作图像分类的网络,其最大下采样因子为×32。

  我们通过三个双线性插值和1×1卷积层对bottleneck三次进行上采样。 在上采样层之前,我们连接了相应的低级特征图,同时添加了一个1×1卷积层以减小通道维度。 经过三个上采样层后,通道分别为256、128、64。

关键点特征金字塔:

图像中的关键点在大小上没有差异。 因此,关键点检测不适合使用特征金字塔网络(FPN),因为FPN网络只适合于检测不同金字塔层中的多尺度2Dbox框,而框是有大小的。 我们提出了关键点特征金字塔网络(KFPN),以检测点向空间中尺度不变的关键点,如下图所示。


假设我们有F尺度的特征图,我们先将每个尺度f,1

https://github.com/kaixinbear/rtm/blob/master/src/lib/models/networks/resnet_FP.py

检测头:

由三个基本组件和六个可选组件组成,可以选择组合来提高3D检测准确性。 受CenterNet [47]的启发,我们选一个关键点作为连接所有特征的主要中心。 由于截断情况下对象的3D投影点可能会超出图像边界,因此将更适当地选择2D框中心点。

Heatmap定义为,其中C是目标种类的数量,另一部分是由顶点和中心点投影出的9个透视点,

对于一个目标的关键点整合,我们还对从maincenter的局部偏移进行回归作为标志,将距离坐标最近的V的关键点作为一个对象的集合。

尽管9个关键点的18个的约束能够恢复物体的3D信息,但是越多的先验条件能够增加更多的约束,中心偏移,顶点偏移是heatmap中对每个关键点的离散误差。

3D目标的维度D 方差较小很容易预测,对象的旋转R(θ)只有在自主驾驶场景对方向θ(偏航)进行参数化。我们引用基于Multi-Bin [28]方法对局部方向进行回归。将局部角度的余弦偏移和正弦偏移概率在1个bin中进行分类,并使用2个bin生成方向特征图。(这个看上去和上一篇论文的方法有点类似)。

我们还对3D box的中心深度进行回归,用来初始化3D bounding box估计的值,并进行加速。

heatmap

所谓heatmap就是GT中每个object的中心坐标加入Gaussian。

heatmap中的heat就是probability的"热度",所以heatmap就是描述bounding box的corner (cornernet)/center (centernet)点的distribution。probability高的地方就是bounding box的预测位置,然后把这些peaks全部拿出来构型就是结果了。这种方法跟经典的直接回归坐标点(或者坐标点跟anchor的offset)不同的地方在于需要在ground truth坐标位置加上2d的Gaussian生成heatmap,输出predicted heatmap,然后让predicted和ground truth差越来越小进行训练。

其实这种方法是从human pose检测得到的灵感,这种gaussian probability map会让训练更robust,收敛更快,因为它不局限于一个坐标点定的hard define。它还有一个好处在于直接用全卷积,就像是图像分割FCN的思路加上bounding box尺寸单独进行回归。

训练:

关键点的所有heatmap按照[47].[19]进行训练,使用focal loss 解决了正反例的不平衡,其中K是不同关键点的通道数,在maincenter K=C,在计算顶点K=9. N是一张图像的maincenter或顶点数,α 和 β为减少损失权重的超参数,Pxy可以由高斯核定义并以真正的关键点为中心。对于σ,我们找到了训练数据中的2D box的最大最小区域Amax,Amin,并设置两个超参数σmax,σmin 然后定义大小为A的目标 ,为了对维度和距离进行回归,定义残差部分为:

                         

                        

我们设置,其中为训练数据的平均和标准差维度,代表maincenter是否出现在位置x,y,maincenter,顶点由L1损失进行训练:


                        

                        

其中为maincenter和顶点在原始图像的位置,使用L1损失的顶点回归坐标为:


                        

最后为关键点检测的多任务损失进行定义:

 

上式中,前两项在论文中有定义。应为,是物体中心到相机中心的距离,应为物体中心到相机中心的方位。

3D bounding box估计

考虑一张图像,有一组 i = 1...N的目标,由9个关键点和其他先验知识表达,由我们的关键点检测网络给出。我们将关键点定义为,其中,为维度方向为,距离为。相应的3D bounding box 由它的旋转,,以及维度定义。位置,以及维度定义。

我们的目标是找出3D box,找出哪一个box的中心点和顶点投影与2D 关键点  最匹配。这能够最小化3D 关键点和2D 关键点的投影损失,并将它和其他先验损失定义为一个非线性最小二乘优化问题:

                \begin{aligned}
R^{*}, T^{*}, D^{*}=\underset{\{R, T, D\}}{\arg \max } \sum_{R_{i}, T_{i}, D_{i}}\left\|e_{c p}\left(R_{i}, T_{i}, D_{i}, \widehat{k p}_{i}\right)\right\|_{\Sigma_{i}}^{2} \\
+\omega_{d}\left\|e_{d}\left(D_{i}, \widehat{D}_{i}\right)\right\|_{2}^{2}+\omega_{r}\left\|e_{r}\left(R_{i}, \hat{\theta}_{i}\right)\right\|_{2}^{2}
\end{aligned}

 其中 是相机点、维度先验、方向先验的损失。

是关键点投影误差的协方差矩阵。它是从对应于关键点的heatmap中提取的置信度:

Camera-Point:

按照[10],我们定义了8顶点和中心点的齐次坐标:

C o r=\left[\begin{array}{ccccccccc}
0 & 0 & 0 & 0 & -1 & -1 & -1 & -1 & -1 / 2 \\
1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 0 \\
1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 0 \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1
\end{array}\right]

给定内参矩阵K,我们将3D点投影到图像坐标为:

\begin{aligned}
k p_{i} &=\frac{1}{s_{i}} K\left[\begin{array}{cc}
R & T \\
0^{T} & 1
\end{array}\right] \operatorname{diag}\left(D_{i}\right) C o r \\
&=\frac{1}{s_{i}} K \exp \left(\xi^{\wedge}\right) \operatorname{diag}\left(D_{i}\right) C o r
\end{aligned}

其中,使用exp将se3转换到SE3空间,投影坐标应与检测网络检测到的二维关键点紧密配合。因此,相机点误差定义为:

最小化相机点误差需要se3空间的雅可比矩阵

\frac{\partial e_{c p}}{\partial \delta \xi}=-\left[\begin{array}{ccc}
\frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\
0 & \frac{f_{y}}{Z^{\prime}} 0 & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}
\end{array}\right] \cdot\left[I, \quad-P^{\prime \wedge}\right]

\frac{\partial e_{c p}}{\partial D_{i}}=-\frac{1}{9} \sum_{c o l=1}^{9}\left[\begin{array}{ccc}
\frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\
0 & \frac{f_{y}}{Z^{\prime}} 0 & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}
\end{array}\right] \cdot R \cdot \text { Cor }_{c o l}

其中,

维度先验:

Ed被定义如下:

旋转先验:

我们在SE3空间定义Er,并使用log将error映射到切向量空间:

这些多元方程可以通过g2o库[18]中的Gaussnewton或Levenberg-Marquardt算法求解。我们采用由关键点检测网络产生的先验信息作为初始值,这对提高检测速度非常重要。

你可能感兴趣的:(单目3D目标检测)