1. 解决了什么问题?
单目 3D 目标检测是自动驾驶的重要课题,与一般的多传感器系统相比,它具有简洁、成本低、易部署的优点。单目 3D 检测的主要挑战在于能否准确预测目标的深度。由于缺乏直接的测量手段,我们只能从目标和场景信息推断,因此单目 3D 检测的表现远落后于 LiDAR 和双目视觉的方案。
一些单目目标检测方法会单独训练一个深度估计网络,直接学习深度信息。但在 3D 检测阶段,它们直接使用估计的深度信息,缺乏对深度置信度的理解,网络对预测的深度值过于相信,造成模型对于大尺度范围的深度估计不准确。而且在训练时,深度估计任务独立于 3D 检测任务,深度图的优化就脱离了检测任务。
另一些方法则隐式地学习图像中的深度信息,将图像特征直接变换到 3D 空间,再变换到 BEV 网格里。但这类方法会遇到特征拖尾效应(feature smearing),即投影空间内的多个位置出现相似的图像特征。特征拖尾效应增加了目标定位的难度。 如下图所示,(a) 是输入图像。(b) 是不带深度分布监督时,CaDDN 的 BEV 特征具有特征拖尾效应。© 带了深度分布监督后,BEV 特征编码了丰富的深度置信度,目标能被准确地检出。
2. 提出了什么方法?
本文提出了 Categorical Depth Distribution Network(CaDDN),使每个像素点都有一个分类深度分布,将图像特征映射到 3D 空间内合适的深度区间,生成 BEV 表征。然后使用 BEV 表征和单阶段目标检测器输出最终的检测结果。该方案完全可微并且端到端,协同完成深度估计和目标检测任务。下图展示了 CaDDN 架构,主要用 3 个模块生成 3D 表征,以及 1 个模块进行 3D 检测。使用预测的深度分布
D
\mathbf{D}
D,由图像
I
\mathbf{I}
I生成视锥特征
G
\mathbf{G}
G,再变换为体素特征
V
\mathbf{V}
V。然后将体素特征
V
\mathbf{V}
V坍缩为 BEV 特征
B
\mathbf{B}
B,用于 3D 检测。
2.1 3D 表征学习
网络学习输出适用于 3D 目标检测的 BEV 表征。对于单张输入图像,我们使用预测得到的分类深度分布,构建视锥特征。利用相机参数,将该视锥特征栅格变换为体素栅格,最后坍缩为 BEV 特征栅格。
2.1.1 视锥特征网络
该网络将图像特征关联到预测的深度值,将图像信息映射到 3D 空间。网络的输入是一张图像 I ∈ R W I × H I × 3 \mathbf{I}\in \mathbb{R}^{W_I\times H_I\times 3} I∈RWI×HI×3, W I , H I W_I,H_I WI,HI是图像的宽度和高度。输出是一个视锥特征栅格 G ∈ R W F × H F × D × C \mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C} G∈RWF×HF×D×C, W F , H F W_F,H_F WF,HF是图像特征的宽度和高度, D D D是离散化深度 bins 的个数, C C C是特征通道数。
主干网络使用 ResNet-101 提取图像特征 F ~ ∈ R W F × H F × C \tilde{\mathbf{F}}\in\mathbb{R}^{W_F\times H_F\times C} F~∈RWF×HF×C,如上图所示。从 ResNet-101 的 Block1 提取图像特征,保证高分辨率。从视锥到体素网格的变换需要分辨率高一些,这样视锥栅格就不太可能包含重复的特征。
F ~ \tilde{\mathbf{F}} F~用于估计每个像素点的分类深度分布 D ∈ R W F × H F × D \mathbf{D}\in\mathbb{R}^{W_F\times H_F\times D} D∈RWF×HF×D,类别是 D D D个离散的深度 bins。对于 F ~ \tilde{\mathbf{F}} F~上的每个像素点,分别预测 D D D个概率值,每个概率值表示深度值属于某一个深度 bin 的置信度。
作者按 DeepLabV3 语义分割网络设计了上图的 Depth Distribution Network,从图像特征 F ~ \tilde{\mathbf{F}} F~预测分类深度分布。作者修改了网络,输出的是每个像素点属于各深度 bin 的概率得分,而非某个语义类别。ResNet-101 其余的结构(Block2, Block3, Block4)会对 F ~ \tilde{\mathbf{F}} F~做下采样。使用了 atrous spatial pyramid pooling 获取多尺度信息,输出通道数等于 D D D。用双线性插值对 ASPP 模块的输出做上采样,让特征尺寸和原始特征的尺寸一样,得到分类深度分布 D ∈ R W F × H F × D \mathbf{D}\in\mathbb{R}^{W_F\times H_F\times D} D∈RWF×HF×D。然后对每个像素点使用 softmax 函数,将 D D D个 logits 归一化为 0 0 0和 1 1 1之间的概率值。
同时,对 F ~ \tilde{\mathbf{F}} F~进行通道降维以降低 ResNet-101 的内存占用,得到最终的图像特征 F \mathbf{F} F,具体是用 1 × 1 1\times 1 1×1卷积 + BatchNorm + ReLU +\text{BatchNorm}+\text{ReLU} +BatchNorm+ReLU 将通道数从 C = 256 C=256 C=256降为 C = 64 C=64 C=64。
用 ( u , v , c ) (u,v,c) (u,v,c)表示图像特征 F \mathbf{F} F的坐标, ( u , v , d i ) (u,v,d_i) (u,v,di)表示分类深度分布 D \mathbf{D} D的一个坐标, ( u , v ) (u,v) (u,v)是特征的像素位置, c c c是通道索引, d i d_i di是深度 bin 的索引。为了得到视锥特征栅格 G \mathbf{G} G,对每个特征像素 F ( u , v ) \mathbf{F}(u,v) F(u,v),用该像素关联的 D ( u , v ) \mathbf{D}(u,v) D(u,v)深度 bin 的概率对其加权,以填充深度维度 d i d_i di,如下图所示。计算特征像素和深度概率的外积,做加权:
G ( u , v ) = D ( u , v ) ⊗ F ( u , v ) \mathbf{G}(u,v)=\mathbf{D}(u,v)\otimes \mathbf{F}(u,v) G(u,v)=D(u,v)⊗F(u,v)
D
(
u
,
v
)
\mathbf{D}(u,v)
D(u,v)是预测的深度分布,
G
(
u
,
v
)
\mathbf{G}(u,v)
G(u,v)是大小为
D
×
C
D\times C
D×C的输出矩阵。上式的外积就算出了每个像素点的视锥特征
G
∈
R
W
F
×
H
F
×
D
×
C
\mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C}
G∈RWF×HF×D×C。
2.1.2 视锥到体素的变换
如下图所示,利用已知的相机参数,将视锥特征 G ∈ R W F × H F × D × C \mathbf{G}\in \mathbb{R}^{W_F\times H_F\times D\times C} G∈RWF×HF×D×C变换到体素表征 V ∈ R X × Y × Z × C \mathbf{V}\in \mathbb{R}^{X\times Y\times Z\times C} V∈RX×Y×Z×C。在每个体素的中心位置产生该体素的采样点 s k v = [ x , y , z ] k T s_k^v=[x,y,z]_k^T skv=[x,y,z]kT,用相机参数矩阵 P ∈ R 3 × 4 \mathbf{P}\in \mathbb{R}^{3\times 4} P∈R3×4将之变换到视锥栅格,产生视锥采样点 s ~ k f = [ u , v , d c ] k T \tilde{s}_k^f=[u,v,d_c]_k^T s~kf=[u,v,dc]kT, d c d_c dc是视锥深度轴 d i d_i di上连续的深度值。每个连续的深度值 d c d_c dc都转化为一个离散的深度 bin 的索引 d i d_i di。通过三线性插值,使用采样点 s k f = [ u , v , d i ] k T s_k^f=[u,v,d_i]_k^T skf=[u,v,di]kT采样 G \mathbf{G} G内的视锥特征,填充体素特征 V \mathbf{V} V。
视锥栅格
G
\mathbf{G}
G的空间分辨率和体素栅格
V
\mathbf{V}
V的分辨率应该接近。如果
V
\mathbf{V}
V的分辨率高,其采样密度就高,若对低分辨率的视锥栅格做过采样,会产生大量相似的体素特征。因此,我们从 ResNet-101 的 Block1 提取特征
F
~
\tilde{\mathbf{F}}
F~,确保视锥栅格
G
\mathbf{G}
G的空间分辨率较高。
2.1.3 体素坍缩为 BEV
体素特征 V ∈ R X × Y × Z × C \mathbf{V}\in \mathbb{R}^{X\times Y\times Z\times C} V∈RX×Y×Z×C坍缩为单一高度的平面,生成 BEV 特征 B ∈ R X × Y × C \mathbf{B}\in \mathbb{R}^{X\times Y\times C} B∈RX×Y×C。BEV 栅格极大地降低了计算成本,而检测表现与 3D 体素栅格相似。沿着通道维度 c c c,concat V \mathbf{V} V的垂直轴 z z z,得到 BEV 栅格 B ~ ∈ R X × Y × Z ∗ C \tilde{\mathbf{B}}\in \mathbb{R}^{X\times Y\times Z\ast C} B~∈RX×Y×Z∗C。用 1 × 1 1\times 1 1×1卷积 + BatchNorm + ReLU +\text{BatchNorm}+\text{ReLU} +BatchNorm+ReLU 降低 B ~ ∈ R X × Y × Z ∗ C \tilde{\mathbf{B}}\in \mathbb{R}^{X\times Y\times Z\ast C} B~∈RX×Y×Z∗C维度,得到 B ∈ R X × Y × C \mathbf{B}\in \mathbb{R}^{X\times Y\times C} B∈RX×Y×C, 回到原始的通道数 C C C ,学习每个高度切片的相对重要性。
2.2 BEV 3D 目标检测
为了在 BEV 特征栅格上做 3D 检测,主干网络和检测 head 借鉴了 PointPillars,该 BEV 3D 目标检测器的 3D 检测效果优异,而且计算成本低。
在 BEV 主干部分,将 Block1, Block2, Block3 中下采样模块的
3
×
3
3\times 3
3×3卷积
+
BatchNorm
+
ReLU
+\text{BatchNorm}+\text{ReLU}
+BatchNorm+ReLU 的个数从
(
4
,
6
,
6
)
(4,6,6)
(4,6,6)增加到
(
10
,
10
,
10
)
(10,10,10)
(10,10,10),增大 BEV 网络的学习能力。与 LiDAR 点云相比,图像提供的特征质量较低。
检测 head 与 PointPillars 一样,输出最终检测结果。
2.3 深度离散化
将连续的深度空间离散化,在深度分布
D
\mathbf{D}
D中定义一个由
D
D
D个 bins 组成的集合。深度离散化可以用固定 bin 大小的 uniform discretization(UD),bin 大小在
log
\log
log空间逐渐增大的 spacing-increasing discretization(SID),或 bin 大小线性增加的 linear increasing discretization(LID) 完成。下图展示了这些深度离散方法。本文采用了 LID,它能为所有的深度提供均衡的深度估计,定义如下:
d
c
=
d
min
+
d
m
a
x
−
d
m
i
n
D
(
D
+
1
)
⋅
d
i
(
d
i
+
1
)
d_c=d_{\min}+\frac{d_{max}-d_{min}}{D(D+1)}\cdot d_i(d_i+1)
dc=dmin+D(D+1)dmax−dmin⋅di(di+1)
d
c
d_c
dc是连续的深度值,
[
d
m
i
n
,
d
m
a
x
]
[d_{min},d_{max}]
[dmin,dmax]是离散化的深度区间,
d
c
d_c
dc离散化为
D
D
D个深度 bins,
d
i
d_i
di是深度 bin 的索引。
2.4 深度分布标签的生成
我们需要深度分布标签 D ^ \hat{\mathbf{D}} D^来监督深度分布的预测。将 LiDAR 点云投射到图像平面,生成稀疏的深度图,以此作为深度分布的标签。在图像的每个像素点进行深度补全,生成深度值。在每个特征像素都要有深度信息,于是对大小是 W I × H I W_I\times H_I WI×HI的深度图做下采样,从而和特征图大小 W F × H F W_F\times H_F WF×HF一致。使用 LID 方法将深度图离散化为 bin 索引,然后转化为一个 one-hot 编码,生成深度分布标签。One-hot 编码确保深度分布标签是清晰的。
2.5 训练损失
监督深度分布网络的学习时,作者通过分类来促成某一正确深度 bin,本文使用了 focal loss:
L
depth
=
1
W
F
⋅
H
F
∑
u
=
1
W
F
∑
v
=
1
H
F
FL
(
D
(
u
,
v
)
,
D
^
(
u
,
v
)
)
L_\text{depth}=\frac{1}{W_F\cdot H_F}\sum_{u=1}^{W_F}\sum_{v=1}^{H_F}\text{FL}(\mathbf{D}(u,v),\hat{\mathbf{D}}(u,v))
Ldepth=WF⋅HF1u=1∑WFv=1∑HFFL(D(u,v),D^(u,v))
其中
D
\mathbf{D}
D是预测的深度分布,
D
^
\hat{\mathbf{D}}
D^是深度分布标签。作者发现在自动驾驶数据集中,图像里的目标像素要远少于背景像素,造成损失更偏向于背景像素。在 focal loss 中,针对前景和背景像素,分别设定加权系数
α
f
g
=
3.25
,
α
b
g
=
0.25
\alpha_{fg}=3.25, \alpha_{bg}=0.25
αfg=3.25,αbg=0.25。所有位于 ground-truth 2D 目标框的像素都算前景像素,其余的就是背景像素。Focal loss 的关注系数
γ
=
2.0
\gamma=2.0
γ=2.0。
在 3D 检测中,使用了 PointPillar 的分类损失
L
c
l
s
L_{cls}
Lcls、回归损失
L
r
e
g
L_{reg}
Lreg和方向分类损失
L
d
i
r
L_{dir}
Ldir。整的损失如下:
L = λ d e p t h L d e p t h + λ c l s L c l s + λ r e g L r e g + λ d i r L d i r L=\lambda_{depth}L_{depth}+\lambda_{cls}L_{cls}+\lambda_{reg}L_{reg}+\lambda_{dir}L_{dir} L=λdepthLdepth+λclsLcls+λregLreg+λdirLdir
其中 λ d e p t h , λ c l s , λ r e g , λ d i r \lambda_{depth},\lambda_{cls},\lambda_{reg},\lambda_{dir} λdepth,λcls,λreg,λdir是加权系数。