论文链接:ImVoxelNet: Image to Voxels Projection for Monocular and Multi-View General-Purpose 3D Object Detection
RGB 图像成本低、数据源丰富,可以提供场景和物体的视觉信息,但不包括场景几何结构的直接信息。因此,从 RGB 图像检测 3D 物体本身就是不适当的。给定一张单目图像,基于深度学习的 3D 检测方法只能推断数据的尺度。有些区域是看不到的,我们无法从 RGB 图像中清楚地推断出场景的几何结构。但是通过多个位姿的图像就能获取到比单目图像更丰富的场景信息。
现有的方法基本是独立地预测每张单目 RGB 图像,然后融合预测的结果。而本文方法在训练和测试时可接受任意数量的视角输入,效果更优。
将多视角基于 RGB 3D 目标检测方法看作为端到端的优化问题,提出了 ImVoxelNet。为了融合不同输入的信息,作者构建了一个 3D 空间的体素表征,然后从该 3D 特征图做最终的预测,类似于点云检测的方式。
本文方法可以接受任意数量的、带相机位姿的 RGB 输入。首先使用一个 2D 卷积主干网络提取特征,然后将图像特征投影到 3D 体素空间。通过简单地逐元素求均值,聚合多张图像的投影特征,得到每个体素的特征。然后将这个体素 volume 输入进 neck(一个 3D 卷积网络)。Neck 的输出再输入进检测 head(一些卷积层),预测每个 anchor 的边框特征。最终的边框预测结果表示为 ( x , y , z , w , h , l , θ ) (x,y,z,w,h,l,\theta) (x,y,z,w,h,l,θ),其中 ( x , y , z ) (x,y,z) (x,y,z)是中心点的坐标, w , h , l w,h,l w,h,l是宽度、高度、长度, θ \theta θ是 z z z轴的旋转角度。整体架构如下图所示。
用 I t ∈ R W × H × 3 I_t\in\mathbb{R}^{W\times H\times 3} It∈RW×H×3表示集合里的第 t t t帧图像,该集合共有 T T T张图像,对于多视角输入, T > 1 T>1 T>1;对于单视角输入, T = 1 T=1 T=1。使用一个预训练 2D 主干网络提取输入图像的 2D 特征,输出四个特征图,形状分别是 W 4 × H 4 × c 0 , W 8 × H 8 × 2 c 0 , W 16 × H 16 × 4 c 0 , W 32 × H 32 × 8 c 0 \frac{W}{4}\times \frac{H}{4}\times c_0,\frac{W}{8}\times \frac{H}{8}\times 2c_0,\frac{W}{16}\times \frac{H}{16}\times 4c_0,\frac{W}{32}\times \frac{H}{32}\times 8c_0 4W×4H×c0,8W×8H×2c0,16W×16H×4c0,32W×32H×8c0。通过一个 FPN 聚合这些特征图,输出一个形状是 W 4 × H 4 × c 1 \frac{W}{4}\times \frac{H}{4}\times c_1 4W×4H×c1的张量 F t F_t Ft, c 0 , c 1 c_0,c_1 c0,c1值与具体主干网络有关。
然后将第 t t t个输入的 2D 特征 F t F_t Ft投影到 3D 体素 volume V t ∈ R N x × N y × N z × c 1 V_t\in \mathbb{R}^{N_x\times N_y\times N_z\times c_1} Vt∈RNx×Ny×Nz×c1里面。设定 z z z轴垂直于地面, x x x轴指向前方, y y y轴正交于 x x x轴和 z z z轴。这三个轴都有各自的限制范围,记做 x m i n , x m a x , y m i n , y m a x , z m i n , z m a x x_{min}, x_{max}, y_{min}, y_{max}, z_{min}, z_{max} xmin,xmax,ymin,ymax,zmin,zmax。对于一个固定的体素大小 s s s,空间约束可以表示为 N x s = x m a x − x m i n , N y s = y m a x − y m i n , N z s = z m a x − z m i n N_xs=x_{max}-x_{min}, N_ys=y_{max}-y_{min}, N_zs=z_{max}-z_{min} Nxs=xmax−xmin,Nys=ymax−ymin,Nzs=zmax−zmin。使用小孔成像模型来判断特征图 F t F_t Ft上的 2D 坐标 ( u , v ) (u,v) (u,v)和 volume V t V_t Vt的 3D 坐标 ( x , y , z ) (x,y,z) (x,y,z)之间的对应关系:
[ u v ] = Π [ 1 4 0 0 0 1 4 0 0 0 1 ] K R t [ x y z 1 ] \left[\begin{array}{c} u \\ v \end{array}\right]=\Pi \left[\begin{array}{c} \frac{1}{4} & 0 & 0\\ 0 & \frac{1}{4} & 0\\ 0 & 0 & 1 \end{array}\right]KR_t \left[\begin{array}{c} x\\ y\\ z\\ 1 \end{array}\right] [uv]=Π 41000410001 KRt xyz1
其中 K K K和 R t R_t Rt是内参和外参矩阵, Π \Pi Π是透视映射。将 2D 特征投影后,某条相机射线上的所有体素都会被填充上相同的特征。定义一个形状与 V t V_t Vt相同的二值 mask M t M_t Mt,表示每个体素是否在相机视锥内。因此,对于每张图像 I t I_t It, M t M_t Mt定义如下:
M t ( x , y , z ) = { 1 , if 0 ≤ u < W 4 and 0 ≤ v < H 4 0 , otherwise M_t(x,y,z)=\left\{ \begin{aligned} 1,& \quad\text{if} &0\leq u<\frac{W}{4} \text{and} 0\leq v<\frac{H}{4} \\ 0,& & \text{otherwise} \end{aligned} \right. Mt(x,y,z)=⎩ ⎨ ⎧1,0,if0≤u<4Wand0≤v<4Hotherwise
然后将 F t F_t Ft投影到 V t V_t Vt中每个有效的体素:
V t ( x , y , z ) = { F t ( u , v ) , if M t ( x , y , z ) = 1 0 , otherwise V_t(x,y,z)=\left\{ \begin{aligned} F_t(u,v),&\quad \text{if} &M_t(x,y,z)=1 \\ 0,& & \text{otherwise} \end{aligned} \right. Vt(x,y,z)={Ft(u,v),0,ifMt(x,y,z)=1otherwise
将 M 1 , . . . , M t M_1,...,M_t M1,...,Mt融合,得到二值 mask M M M:
M ( x , y , z ) = { ∑ t M t ( x , y , z ) , if ∑ t M t ( x , y , z ) > 0 1 , otherwise M(x,y,z)=\left\{ \begin{aligned} \sum_tM_t(x,y,z),&\quad \text{if} &\sum_tM_t(x,y,z)>0 \\ 1,& & \text{otherwise} \end{aligned} \right. M(x,y,z)=⎩ ⎨ ⎧t∑Mt(x,y,z),1,ift∑Mt(x,y,z)>0otherwise
最后,将 V 1 , . . . , V t V_1,...,V_t V1,...,Vt的特征求平均得到 3D volume V V V:
V = 1 M ∑ t M t V t V=\frac{1}{M}\sum_t M_tV_t V=M1t∑MtVt
将体素 volume V V V输入一个 3D 卷积 encoder-decoder 网络,优化特征。对于室内场景,作者简化了网络,减少耗时的 3D 卷积层。简化后的 encoder 只有三个下采样残差模块,每个有三个 3D 卷积层。简化后的 decoder 包括三个上采样模块,每个模块由一个步长为 2 2 2的转置 3D 卷积层和一个 3D 卷积层组成。Decoder 分支输出三个特征图,形状如下: N x 4 × N y 4 × N z 4 × c 2 \frac{N_x}{4}\times \frac{N_y}{4}\times \frac{N_z}{4}\times c_2 4Nx×4Ny×4Nz×c2, N x 2 × N y 2 × N z 2 × c 2 \frac{N_x}{2}\times \frac{N_y}{2}\times \frac{N_z}{2}\times c_2 2Nx×2Ny×2Nz×c2,和 N x × N y × N z × c 2 N_x\times N_y\times N_z\times c_2 Nx×Ny×Nz×c2。
将 3D 空间的 3D 目标检测降低为 BEV 平面的 2D 检测问题。Necks 和 heads 都由 2D 卷积层组成。Head 的输入是一个 2D 特征图,所以我们应该从 3D 体素 volume 中获取一个 2D 表征。形状是 N x × N y × N z × c 1 N_x\times N_y\times N_z\times c_1 Nx×Ny×Nz×c1的体素 volume V V V经过由多个 3D 卷积和下采样操作组成的 encoder 后,就映射成一个形状是 N x × N y × c 2 N_x\times N_y\times c_2 Nx×Ny×c2的张量。
ImVoxelNet 构建一个 3D 体素表征。因此,它能利用激光点云 3D 检测方法的 heads。
将室外 3D 检测看作为 BEV 平面的 2D 目标检测。作者使用了 2D anchor head,它在 KITTI 和 nuScenes 上都很高效率。因为室外 3D 检测方法是在车辆上做评价,所以目标的尺度都相似,而且属于同一个类别。对于单尺度、单类别检测,head 包括两个平行的 2D 卷积层。一层估计类别概率,另一层回归边框的七个参数。
输入是形状为 N x × N y × c 2 N_x\times N_y\times c_2 Nx×Ny×c2的张量。
对于每个 2D BEV anchor,head 返回一个类别概率 p p p和一个七元组的 3D 框:
Δ x = x g t − x a d a , Δ y = y g t − y a d a , Δ z = z g t − z a d a \Delta{x}=\frac{x^{gt}-x^a}{d^a},\Delta{y}=\frac{y^{gt}-y^a}{d^a},\Delta{z}=\frac{z^{gt}-z^a}{d^a} Δx=daxgt−xa,Δy=daygt−ya,Δz=dazgt−za
Δ w = log w g t w a , Δ l = log l g t l a , Δ h = log h g t h a \Delta{w}=\log\frac{w^{gt}}{w^a},\Delta{l}=\log{\frac{l^{gt}}{{l^a}}},\Delta{h}=\log\frac{h^{gt}}{h^a} Δw=logwawgt,Δl=loglalgt,Δh=loghahgt
Δ θ = sin ( θ g t − θ a ) \Delta{\theta}=\sin(\theta^{gt}-\theta^a) Δθ=sin(θgt−θa)
这里 ⋅ g t \cdot^{gt} ⋅gt和 ⋅ a \cdot^{a} ⋅a是 ground-truth 和 anchor boxes。边框对角线长度是 d a = ( w a ) 2 + ( l a ) 2 d^a=\sqrt{(w^a)^2+(l^a)^2} da=(wa)2+(la)2。 z a z^a za对于所有的 anchors 都是常量,因为是定位在 BEV 平面的。
使用了与 SECOND 算法一样的损失函数。损失包括多个损失项,定位损失 L l o c L_{loc} Lloc使用平滑平均绝对值损失,分类损失 L c l s L_{cls} Lcls用的是 focal loss,方向损失 L d i r L_{dir} Ldir用的是交叉熵损失。
L o u t d o o r = 1 n p o s ( λ l o c L l o c + λ c l s L c l s + λ d i r L d i r ) L_{outdoor}=\frac{1}{n_{pos}}(\lambda_{loc}L_{loc}+\lambda_{cls}L_{cls}+\lambda_{dir}L_{dir}) Loutdoor=npos1(λlocLloc+λclsLcls+λdirLdir)
其中 n p o s n_{pos} npos是正样本 anchor 的个数, λ l o c = 2 , λ c l s = 1 , λ d i r = 0.2 \lambda_{loc}=2,\lambda_{cls}=1,\lambda_{dir}=0.2 λloc=2,λcls=1,λdir=0.2。
目前所有的室内 3D 检测算法都对稀疏的点云表征使用深度 Hough voting。而本文使用的是密集的体素表征,于是作者受到 FCOS 启发,构建了一个 head 可以完成多尺度的 3D 目标检测。
FCOS head 的输入是 FPN 的 2D 特征,然后通过 2D 卷积层预测 2D 框。这里,作者将 2D 卷积替换为了 3D 卷积,处理 3D 输入。作者使用了中心采样来选取候选目标的像素位置。在 2D 检测,对于每个 ground-truth,候选样本个数是 3 × 3 = 9 3\times 3=9 3×3=9个,而在 3D 空间,候选样本个数就是 3 × 3 × 3 = 27 3\times 3\times 3=27 3×3×3=27。Head 包括三个 3D 卷积层,分别用于分类、定位、centerness,对所有的尺度都共享权重。
多尺度输入包括三个张量,形状是 N x 4 × N y 4 × N z 4 × c 2 \frac{N_x}{4}\times \frac{N_y}{4}\times \frac{N_z}{4}\times c_2 4Nx×4Ny×4Nz×c2, N x 2 × N y 2 × N z 2 × c 2 \frac{N_x}{2}\times \frac{N_y}{2}\times \frac{N_z}{2}\times c_2 2Nx×2Ny×2Nz×c2, N x × N y × N z × c 2 N_x\times N_y\times N_z\times c_2 Nx×Ny×Nz×c2。
对于每个 3D 坐标 ( x a , y a , z a ) (x^a,y^a,z^a) (xa,ya,za)和每种尺度,head 预测类别概率 p p p、centerness c c c、七元组的 3D 框:
Δ x m i n = x m i n g t − x a , Δ x m a x = x m a x g t − x a \Delta{x}_{min}=x_{min}^{gt}-x^a,\Delta{x}_{max}=x_{max}^{gt}-x^a Δxmin=xmingt−xa,Δxmax=xmaxgt−xa
Δ y m i n = y m i n g t − y a , Δ y m a x = y m a x g t − y a \Delta{y}_{min}=y_{min}^{gt}-y^a,\Delta{y}_{max}=y_{max}^{gt}-y^a Δymin=ymingt−ya,Δymax=ymaxgt−ya
Δ z m i n = z m i n g t − z a , Δ z m a x = z m a x g t − z a , θ . \Delta{z}_{min}=z_{min}^{gt}-z^a,\Delta{z}_{max}=z_{max}^{gt}-z^a,\theta. Δzmin=zmingt−za,Δzmax=zmaxgt−za,θ.
这里 x m i n g t , x m a x g t , y m i n g t , y m a x g t , z m i n g t , z m a x g t x_{min}^{gt},x_{max}^{gt},y_{min}^{gt},y_{max}^{gt},z_{min}^{gt},z_{max}^{gt} xmingt,xmaxgt,ymingt,ymaxgt,zmingt,zmaxgt表示 ground-truth 框三条轴对应的最小和最大的坐标值。
分类损失 L c l s L_{cls} Lcls是 focal loss,centerness 损失 L c n t r L_{cntr} Lcntr是交叉熵损失,定位损失 L l o c L_{loc} Lloc是 IoU 损失。作者将 2D IoU loss 替换为了旋转 3D IoU Loss。此外,用第三个维度更新了 ground-truth centerness 的值。
L i n d o o r = 1 n p o s ( L l o c + L c l s + L c n t r ) L_{indoor}=\frac{1}{n_{pos}}(L_{loc}+L_{cls}+L_{cntr}) Lindoor=npos1(Lloc+Lcls+Lcntr)
n p o s n_{pos} npos是正样本 3D 位置的个数。
在一些室内场景基准上,3D 目标检测任务被看作是场景理解的一个子任务。因此,评测就不只是解决 3D 框估计的问题,而包括了各种场景理解任务。作者增加了一个简单的 head,预测 R t R_t Rt和 3D 布局。这个 head 包括两个平行分支:两个全连接层输出房间布局,另外两个全连接层预测相机旋转角度。
输入是一个形状是 8 c 0 8c_0 8c0的张量,主干网络输出后经过全局平均池化得到。
Head 输出相机的姿态(包括 pitch 角 β \beta β和 roll 角 γ \gamma γ),以及七元组的 3D 布局框 ( x , y , z , w , l , h , θ ) (x,y,z,w,l,h,\theta) (x,y,z,w,l,h,θ)。固定住 yaw 角,将其转为 0 0 0。
布局损失 L l a y o u t L_{layout} Llayout定义为预测布局框和 ground-truth 框之间的旋转 3D IoU 损失。相机旋转角度预测使用的是 L p o s = ∣ sin ( β g t − β ) ∣ + ∣ sin ( γ g t − γ ) ∣ L_{pos}=|\sin(\beta^{gt}-\beta)|+|\sin(\gamma^{gt}-\gamma)| Lpos=∣sin(βgt−β)∣+∣sin(γgt−γ)∣。
整体损失如下:
L e x t r a = λ l a y o u t L l a y o u t + λ p o s e L p o s e L_{extra}=\lambda_{layout}L_{layout}+\lambda_{pose}L_{pose} Lextra=λlayoutLlayout+λposeLpose
λ l a y o u t = 0.1 , λ p o s e = 1.0 \lambda_{layout}=0.1, \lambda_{pose}=1.0 λlayout=0.1,λpose=1.0。