需要先了解下CenterNet
【目标检测】Objects as Points
本文是基于单目图像的3D目标检测方法。
【2020】【SMOKE】
研究背景:
以往的3D目标检测方法中都会有一个子网络,通过2D目标检测产生2D候选框,然后通过2D候选框去学习3D信息或者得到伪点云送入基于点云的网络中。而这种基于2D目标检测的方法会存在一些问题,如
研究的问题:
提出的方法:
网络结构很简单,就是特征提取网络+检测头(关键点检测+3D参数回归)
本文用的特征提取网络和CenerNet中的基本相同,都是DLA-34,但也有一些改变,比如使用可变性卷积替换了标准卷积,使用GN替换了BN。
因为GN对batch-size不敏感,并且对于训练噪声更加鲁棒。并且实验发现,虽然准确率没有提高,但是训练的时间大大缩短了。
这边和CenterNet中的定义差不多,图像下采样四倍之后得到的特征图上进行关键点预测。区别就是本文的关键点指的是3D边界框的中心点在图像坐标系上的投影。
标签制作:
将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损失