概述
【2021】【DD3D】
研究的问题:
- 如何引入获得空间信息
- 如何增强深度估计效果
解决的方法:
- 密集深度估计子网络
- 大规模数据集下的深度估计预训练
细节
背景
背景:
基于伪点云
的算法能够随着深度估计效果的提升而提升,比如在大规模数据集中预训练的深度估计网络能够很好的提升伪点云算法的效果,但是单目深度估计这个任务很困难。简单且端到端
的3D检测器似乎更有前景,但他们无法受益于深度估计网络的预训练。因此作者
提出了一个端到端且能够受益于深度预训练的网络。
本文方法与伪点云方法的流程比较:
单目3D目标检测的分类:
- 将2D检测器的结果通过形状和场景几何等信息提升到3D空间
- 利用2D/3D之间的几何一致性约束,将检测任务变为优化问题
- 视图转换的方法,将图像转换为点云、鸟瞰图等
网络结构
主要分为两部分:特征提取网络和检测头。特征提取网络中提取多尺度特征,但每个尺度特征对应的检测头都是一样的,也就是分类头、2D检测头和3D检测头。
其中,分类头以及2D检测头和FCOS中的定义相同,关键是3D检测头。
3D检测头
任务:
3D检测头负责预测3D边界框、稠密深度图以及置信度,总共12个参数
前四个参数
(
q
w
,
q
x
,
q
y
,
q
z
)
(q_w,q_x,q_y,q_z)
(qw,qx,qy,qz)表示方向参数,作者这里预测3个方向,而不是平常的一个方向
两个深度参数
z
c
z_c
zc与
z
p
z_p
zp,前者是目标的z坐标,只与目标对应的特征有关,后者是到目标表面的深度,与图像中每个像素都有关,通过
z
c
z_c
zc与
z
p
z_p
zp可以计算得到真正的深度
d
c
d_c
dc与
d
p
d_p
dp,其中涉及到的参数都是已知的。可以发现
计算p的过程中用到了相机内参(焦距),作者说这种设计使得网络是具有相机意识的,也就是不仅从输入图像中推断深度,还从像素大小推断深度,而这对于训练的稳定很有用。实践中
,输入图像的尺寸改变之后,作者也会对内参矩阵进行变换,最终求的的深度图也会做上采样。(因为在作者的设计中,计算深度考虑到了像素)
位置参数
(
Δ
u
,
Δ
v
)
(\Delta u,\Delta v)
(Δu,Δv),具体的位置计算如下:
尺寸参数
(
δ
W
,
δ
H
,
δ
D
)
(\delta W,\delta H,\delta D)
(δW,δH,δD),具体的尺寸计算如下:
其中
(
W
0
,
H
0
,
D
0
)
(W_0,H_0,D_0)
(W0,H0,D0)是数据集中各类别的平均尺寸
置信度参数
β
3
D
\beta_{3D}
β3D,具体的边界框置信度计算如下:
作者将边界框置信度乘上前面分类头的分类置信度,得到最终的置信度。
损失函数
主要是三个检测头的损失,包括2D检测损失,3D检测算是以及置信度损失
其中2D检测损失是与FCOS完全相同的,3D检测损失用的是Disentangling Monocular 3D Object Detection中提到的disentangled L1 loss作为回归损失,置信度损失用的是自监督损失,
深度预训练
作者在深度估计任务下做预训练,能够使得网络得到更准确的空间信息。具体的过程是:
DD3D中作者先用一组在COCO数据集上预训练的2D目标检测参数初始化了特征提取网络FPN,然后将深度估计网络放到DDAD15M数据集上预训练,然后在KITTI-3D中训练。
在深度预测数据集中做密集深度预测(数据集的gt就是点云投影得到的深度图),训练时采用的深度损失如下:
作者发现:
- 使用FPN产生的多尺度特征,而不是单一尺度特征,进行预测会使训练更加稳定
- 使用L1 loss、较大的batch-size以及尺寸输入会比在深度估计任务中常用的SILog loss效果好
- 因为作者在设计深度参数的时候采用了相机内参,因此在做迁移的时候会更加有效
讨论
大规模深度预训练真的有用吗?
去除COCO数据集的初始化参数会导致效果小幅下降,但是去掉DDAD 15M这个大数据集的预训练之后,效果显著下降。
深度预训练真的有用吗?
作者分别使用2D检测和深度估计作为预训练,发现在深度估计数据集上预训练效果更好。
预训练数据集的大小?
作者发现随着预训练数据集的增大,带来的提升也越来越大
伪点云方法中预训练的问题1——需要微调:
DD3D的训练中作者先用一组在COCO数据集上预训练的2D目标检测参数初始化了特征提取网络FPN,然后将深度估计网络放到DDAD15M数据集上预训练,然后在KITTI-3D中训练。
PL的训练,作者先DDAD15M数据集上预训练,然后在KITTI-depth上微调,最后KITTI-3D中训练。
原因是作者发现,没有KITTI-depth上的微调,会导致PL性能的大幅下降。差不多就是不进行微调的话,预训练就没用了(而DD3D则不需要微调)
伪点云方法中预训练的问题2——泛化性能相对较差:
在验证集上PL的方法会比DD3D好一些,但是测试集上PL的方法会比DD3D低很多