前提
需要先了解下CenterNet
【目标检测】Objects as Points
概述
本文是基于单目图像的3D目标检测方法。
【2020】【SMOKE】
研究背景:
以往的3D目标检测方法中都会有一个子网络,通过2D目标检测产生2D候选框,然后通过2D候选框去学习3D信息或者得到伪点云送入基于点云的网络中。而这种基于2D目标检测的方法会存在一些问题,如
- 冗余。因为3D信息+内参矩阵可以直接拿到2D信息。
- 引入噪声。 添加了2D目标检测子网络之后,整个流程就分阶段了,前一阶段会引入持续的噪声,导致后一阶段学习3D特征变得困难。而为了解决这个问题,又有了很多的研究,但不管怎么说,多阶段的方法都会导致性能的降低。
研究的问题:
- 如何在3D目标检测中去除2D目标检测的子网络
- 如何更加有效的编码航向角
- 3D参数回归如何更加有效
提出的方法:
- 将CenterNet拓展到3D目标检测中,通过关键点检测+3D参数回归,一步到位实现边界框的预测。
- 一种精细化的航向角回归方法
- 一种分组参数回归的方法
细节
网络结构
网络结构很简单,就是特征提取网络+检测头(关键点检测+3D参数回归)
特征提取网络
本文用的特征提取网络和CenerNet中的基本相同,都是DLA-34,但也有一些改变,比如使用可变性卷积替换了标准卷积,使用GN替换了BN。
因为GN对batch-size不敏感,并且对于训练噪声更加鲁棒。并且实验发现,虽然准确率没有提高,但是训练的时间大大缩短了。
检测头1:关键点检测
这边和CenterNet中的定义差不多,图像下采样四倍之后得到的特征图上进行关键点预测。区别就是本文的关键点指的是3D边界框的中心点在图像坐标系上的投影。
标签制作:
将3D边界框的中心投影到相机坐标系下,然后下采样得到特征图上的位置,然后使用高斯核处理分布。
检测头2:3D参数回归
回归的8个参数是 [ δ z , δ x c , δ y c , δ h , δ w , δ l , sin α , cos α ] [\delta_z,\delta_{x_c},\delta _{y_c},\delta_h,\delta_w,\delta_l,\sin \alpha,\cos \alpha] [δz,δxc,δyc,δh,δw,δl,sinα,cosα],其中 δ z \delta_z δz是深度偏移, δ x c , δ y c \delta_{x_c},\delta_{y_c} δxc,δyc是下采样过程中的偏移, δ h , δ w , δ l \delta_h,\delta_w,\delta_l δh,δw,δl是尺寸的偏移, sin α , cos α \sin \alpha,\cos \alpha sinα,cosα是偏航角的表示。
z的计算:其中
μ
z
是预定义的偏移,
σ
z
是比例因子
\mu_z是预定义的偏移,\sigma_z是比例因子
μz是预定义的偏移,σz是比例因子
根据z和相机内参计算相机坐标系下的3D坐标
根据尺寸残差计算真实尺寸,其中
h
⃗
,
w
⃗
,
l
⃗
,
\vec{h},\vec{w},\vec{l},
h,w,l,表示的是数据集上该类别目标的平均长宽高
航向角回归:没有直接回归航向角,而是通过
sin
α
,
cos
α
\sin \alpha,\cos \alpha
sinα,cosα计算
α
x
\alpha_x
αx,通过
α
x
\alpha_x
αx计算
α
z
\alpha_z
αz,通过
α
z
\alpha_z
αz计算航向角
Θ
\Theta
Θ,具体过程请看大佬博客单目3D目标检测-SMOKE中的航向角回归分析
有了上述参数就有了边界框,其中
R
θ
R_{\theta}
Rθ是偏航旋转矩阵
注:
尺寸残差和角度都是处理过的,也就是对模型的输出进行激活,分别是sigmoid函数和L2 正则化
损失函数
关键点检测的损失:
和CenterNet中的一样,就是写成了一个式子(还是CenterNet中的看着舒服)
3D参数回归的损失:
这部分的损失参考了Disentangling monocular 3d object detection
,作者将输出分为三组,按照检测头2:3D参数回归
部分描述的,可以根据输出结果计算得到位置、尺寸以及偏航角,这就是三组数据。然后使用每一组数据+标注数据的参数填充得到检测框的8个角,记作
B
1
^
,
B
2
^
,
B
3
^
\hat{B_1},\hat{B_2},\hat{B_3}
B1^,B2^,B3^,分别使用L1损失计算回归损失,他们的损失和就是回归部分的总损失,这样做将每组参数对损失函数的贡献解耦了,让优化器能分别优化每一组参数。
采用的是L1损失
所以总的损失是