2019年4月

CVPR 2018

Abstract

在之前的工作中,为了将LiDAR的稀疏点云与RPN相结合,通常采用的方法是对点云进行手工的特征提取。然而手工提取的特征往往较弱,不能取得很好的性能。本文提出了一种end-to-end的3D检测网络VoxelNet,去除了手工提取特征的过程。VoxelNet包含三个步骤:首先将点云按照空间位置划分成voxels;然后对每个voxel中的点进行特征提取,得到点云的volumetric representation;最后使用RPN的到检测结果。

Introduction

由于LiDAR采样时不同空间位置的采样密度不同,因此点云数据具有很强的稀疏性,即空间中大部分区域是没有点的。针对这一问题,之前的工作主要包括以下几种思路:1. 将点云投影到平面上,然后使用image-based方法;2. 将点云转化为voxels,然后对每个voxels进行手工提取特征,之后使用3D CNN或其它方法。但是,这些方法都没有充分利用点云中包含的信息,效果都不理想。

PointNet/PointNet++直接将点云作为输入,对整个点云进行处理,是一种深度点云特征学习的方法。但是,这两个模型在验证时只是用了ModelNet等小规模数据集,点云相对较小。LiDAR数据通常包含近10万个点,而这两个模型的计算量和内存开销都非常大,难以匹配。如何利用深度模型对大规模点云数据进行处理,这本文解决的主要挑战

VoxelNet

VoxelNet将深度点云特征学习与RPN进行了结合,实现了一种end-to-end的3D检测框架。VoxelNet分为三个部分:Feature Learning Network、Convolutional Middle Layers和RPN。

image.png

2.1 VoxelNet Architecture

2.1.1 Feature Learning Network

Voxel Partition + Grouping + Random Sampling

给定一个点云,VoxelNet首先对点云的空间划分成均匀分割的voxel,每个voxel中包含的点被用来对该voxel进行特征学习。但是,由于点云的空间分布非常不均匀,超过90%的voxel中没有点,而另一些voxel中的点非常多,而且个数各不相同。因此,作者对于每个点数超过T的voxel中随机采样了T个点用于特征学习。这样做有两个好处:一是减少计算量,二是防止过拟合。

Stacked Voxel Feature Encoding

对于每个voxel,VoxelNet使用了Voxel Feature Encoding layer(VFE)来对其进行特征提取。VFE其实是一种小型的PointNet,每个点的输入有7维:$(x_i, y_i, z_i, r_i, x_i-v_x, y_i-v_y, z_i-v_z)$,其中ri是反射值,$(v_x, v_y, v_z)$是voxel中所有点坐标的中点。VFE层的结构如Fig.3所示,FCN包括Linear-BN-ReLU。对voxel进行特征提取的过程有若干个VFE层组成,记号VFE-i($C_{in}$, $C_{out}$)表示第i个VFE层的输入是cin维,输出是cout维,而Linear层的输出是$\frac{C_{out}}{2}$维。最终voxel中所有点的feature vector通过maxpool得到最终的voxel feature representation。

image.png

2.1.2 Convolutional Middle Layers

在Feature Learning Network之后,VoxelNet通过一系列的Conv3d来对空间特征进行提取。Conv3d-block为Conv3d-BN-ReLU。

2.1.3 RPN

在Convolutional Middle Layers之后,假设特征图为$(C, D, H, W)$,此时会将C和D两维进行合并,将特征图转化为$(C \times D, H, W)$,其中D为上下,H和W是地面上的两个维度。通过将C和D合并作为channel维,特征图就转化为了地面上的2维特征图,RPN时生成的就相当于鸟瞰anchor。实际上,在网络结构设计时,depth维很小,在Convolutional Middle Layers之后只有2维。整个RPN的结构如Fig.4所示。

image.png

2.2 Loss Function

分类loss使用cross-entropy。回归loss使用smooth-l1。每个box被参数化为7维$(x_c^g,y_c^g,z_c^g,l^g,w^g,h^g,\theta^g)$,anchor参数化为$(x_c^a,y_c^a,z_c^a,l^a,w^a,h^a,\theta^a)$。回归的target设置为:

image.png

其中$d^a=\sqrt{(l^a)^2+(w^a)^2}$。整体的loss为:

image.png

2.3 Efficient Implementation

如前文所述,非空的voxel通常非常少,所以作者提出进行VFE的计算时,可以讲非空的voxel合并起来处理。方法为,假设有K个非空voxel,每个voxel采样点的最大个数为T,那么所有的voxel可以组成一个$(K, T, 7)$的tensor。这个tensor可以用VFE进行同时处理。对于点数不足T的voxel,将其中的值补0,因为网络中只是用了maxpool,这些0对最终的特征没有影响。

Training Details

3.1 Network Details

image.png

Learning rate: 0.01 for first 150 epochs, 0.001 for last 10 epochs
Batch size: 16 point clouds

3.2 Data augmentation

作者使用了三种augmentation的方法:

第一种是local pertubation。对于每个box和box中的点,进行:沿z轴旋转、随机平移、冲突检测。
第二种是global scaling。
第三种是global rotation。对整个点云和ground truth沿z轴和原点分别旋转。

Experiments

image.png

image.png