论文链接:MVX-Net Multimodal VoxelNet for 3D Object Detection
1. 解决了什么问题?
2D 目标检测取得了显著成效,但由于输入模态的本质区别,CNN 无法直接应用在 3D 检测任务。LiDAR 能准确地定位到 3D 空间的物体,基于 LiDAR 数据的检测方法通常优于 2D 方法。
一些方法将 3D 点云转换为特征表示,如 BEV maps,然后用 2D-CNN 方法来做检测和分类。但这些方法对于点云稀疏或几何变化大的物体效果就不太好。另一些方法则在体素网格中表示 3D 点云,然后用 3D CNN 来做预测。这类方法通常受限于内存占用,尤其是处理全场景时。
VoxelNet 将 LiDAR 点云体素化,用一组 Voxel Feature Encoding(VFE) 层来编码这些体素。这样,VoxelNet 就可以使用 3D RPN 来做检测。
与点云相比,图像能提供更加稠密的纹理信息,我们可以将图像和点云结合使用,提升检测的表现。
2019 年前后,涌现了诸多基于 LiDAR 点云的 3D 目标检测方案。这些方法表现不错,但它们一般只依赖于某一种模态,无法利用其它模态的信息,如相机。另一些方法则尝试通过复杂的流程或是后融合的方式来处理多模态数据,无法在早期阶段学习各模态间的交互。
2. 提出了什么方法?
本文基于 VoxelNet 架构提出了多模态的 VoxelNet。为了融合图像和点云数据的信息,首先从 2D 检测网络的最后一个卷积层提取特征。该 2D 网络是在 ImageNet 上预训练,然后对 2D 检测任务做微调得到。高层级的图像特征编码了语义信息,可作为先验来帮助推理目标。
本文扩展了 VoxelNet,提出了两种融合技术:
- PointFusion:前融合方法,将点云投影到图像平面,然后用预先训练好的 2D 检测器来提取图像特征。然后将图像特征和对应的点云 concat,输入 VoxelNet。
- VoxelFusion:将 VoxelNet 产生的非空 3D 体素投影到图像平面,然后对于每个体素的投影,用预先训练好的 CNN 提取出相应的图像特征。随后对这些图像特征做池化,添加到每个体素的 VFE 特征编码后面,然后用 3D RPN 来输出 3D 边框。
2D 检测网络
与激光雷达点云相比,RGB 图像能捕捉到丰富的色彩和纹理信息。为了提升 3D 检测准确率,本文方法将提取得到的高层级语义特征,融合到 VoxelNet 算法中。2D 检测网络 Faster RCNN 包括一个 RPN 和一个 RCN。基线模型是在 ImageNet 上预训练的 VGG16,然后用 2D 检测数据集对 Faster RCNN 微调。推理时,提取出 VGG16 网络的 conv5 \text{conv5} conv5层的特征,与点云或体素做融合。
VoxelNet
将 VoxelNet 作为 3D 检测的基线模型有两个原因:
- 输入是原始点云,无需人为设计特征;
- 提供了一个 3D 空间内有效的接口(点云或体素),方便融合不同细粒度的图像特征。
VoxelNet 包括三个模块:Voxel Feature Encoding 层、卷积中间层、3D RPN。VFE 是一个特征学习网络,在单个体素层级编码原始点云。给定一个点云,3D 空间被划分为大小相同的体素,将点划分到体素中。然后用一组 VFE 层来编码各个体素。首先,体素内的每个点 p i = [ x i , y i , z i , r i ] T \mathbf{p}_i=[x_i,y_i,z_i,r_i]^T pi=[xi,yi,zi,ri]T(包括 XYZ \text{XYZ} XYZ坐标以及反射值)用它的坐标和相对于体素内质心(centroid)的相对偏移量表示,即 p ^ i = [ x i , y i , z i , r i , x i − v x , y i − v y , z i − v z ] T ∈ R 7 \hat{\mathbf{p}}_i=[x_i,y_i,z_i,r_i,x_i-v_x,y_i-v_y,z_i-v_z]^T\in \mathbb{R}^7 p^i=[xi,yi,zi,ri,xi−vx,yi−vy,zi−vz]T∈R7,其中 x i , y i , z i , r i x_i,y_i,z_i,r_i xi,yi,zi,ri是 p i \mathbf{p}_i pi的坐标和反射值, v x , v y , v z v_x,v_y,v_z vx,vy,vz是 p i \mathbf{p}_i pi所属的体素内点的 centroid 坐标。然后,每个 p ^ i \hat{\mathbf{p}}_i p^i都通过 VFE 层(一个全连接网络)变换到特征空间,聚合 3D 点特征的信息,编码体素内的表面形状。全连接网络包括一个线性层、BN 层和一个 ReLU 层。使用逐元素的 max-pool \text{max-pool} max-pool操作来聚合每个体素内的特征,再将 max-pool \text{max-pool} max-pool后的特征向量与点特征 concat \text{concat} concat起来,得到最终的特征 embedding。所有的非空体素编码过程是相同的,共享全连接网络的参数。VFE 层将输入的点云数据变换成高维特征。
VFE 层的结果会输入进一组卷积中间层,用 3D 卷积来聚合体素特征。这些层会融入额外的上下文信息,提升检测表现。
卷积中间层后面跟着一个 RPN 网络,做 3D 检测。该网络包括三个全卷积层组成的模块。每个模块的第一层是通过步长为 2 2 2的卷积,对特征图做下采样,随后是步长为 1 1 1的卷积。每个卷积层后是一个 BN 和 ReLU 层。每个模块的输出会被上采样到固定大小,然后 concat \text{concat} concat起来构建一个高分辨率的特征图。最后,将该特征图映射成概率得分图和回归图。
Multimodal Fusion
VoxelNet 基于单模态,将其适配到多模态输入可以提升其表现。本文提出了两个简单的融合方法。
PointFusion
属于前融合方法,每个 3D 点都会与图像特征融合,获取稠密的语义信息。该方法首先使用一个预先训练好的 2D 检测网络提取高层级特征图,编码图像的语义。然后利用标定参数,将每个 3D 点投影到图像上,将投影位置索引的特征添加到该点的后面。注意,图像特征来自于 VGG16 网络的 conv5 \text{conv5} conv5层。先用一个全连接层将其从 512 512 512维降至 16 16 16维,然后 concat \text{concat} concat到点特征后。用一组 VFE 层来处理这个新的特征,最后用于检测。
下图是 MVX-Net PointFusion 方法,使用预先训练好的 2D Faster RCNN 计算图像特征图,RPN 和 RCN 并不用于 3D 推理流程。使用标定参数将 3D 点投影到图像,把对应的图像特征添加到 3D 点的后面。随后,VFE 层和 3D RPN 处理聚合后的特征,输出 3D 结果。
优点:图像特征很早就被 concat \text{concat} concat到一起,网络通过 VFE 层能学到两个模态有用的信息。
VoxelFusion
PointFusion 在早期阶段融合特征,而 VoxelFusion 则在较后面才做融合,图像特征添加到体素里面。VoxelNet 的第一阶段是将 3D 空间划分为相同大小的体素。根据 3D 点的位置将它们划分到各个体素里面,然后用一组 VFE 层来编码。将每个非空体素投影到图像平面,得到 2D ROI。使用 2D 预训练检测器的特征图(VGG16 的 conv5 \text{conv5} conv5层),池化 ROI 特征,输出 512 512 512维的特征向量,然后进一步降维成 64 64 64维,添加到 VFE 层输出的每个体素的特征向量的后面。这个过程编码了 2D 图像上每个体素的先验信息。
下图是 MVX-Net VoxelFusion 方法,使用预先训练好的 2D Faster RCNN 计算图像特征图,RPN 和 RCN 并不用于 3D 推理流程。使用标定参数将非空体素投影到图像,提取 ROIs。然后池化每个 ROI 内的特征,添加到 VFE 层计算出的体素特征后面。随后,3D RPN 处理聚合后的特征,输出 3D 结果。
尽管 VoxelFusion 的融合相对靠后一些,输出的结果略逊于 PointFusion。但其优点如下:
- 降低了对高分辨率 LiDAR 点云的依赖,可以将图像信息融合到空体素里面,这些空体素可能是 LiDAR 点缺失造成或者远距离目标。
- VoxelFusion 在内存占用上更加高效。
训练细节
2D 检测器
使用 Faster RCNN 网络,该双阶段检测架构包括一个 RPN 和一个 RCN。基线模型是 VGG16 架构,使用 RoIAlign \text{RoIAlign} RoIAlign操作来池化特征,再输入进 RCNN。在 conv5 \text{conv5} conv5层,使用了四组大小是 { 4 , 8 , 16 , 32 } \{4,8,16,32\} {4,8,16,32}的 anchors,以及三个宽高比 { 0.5 , 1 , 2 } \{0.5,1,2\} {0.5,1,2}。如果与 ground-truth 框的 IoU ≥ 0.7 \text{IoU}\geq 0.7 IoU≥0.7,anchors 则为正样本;如果与 ground-truth 框的 IoU < 0.3 \text{IoU}< 0.3 IoU<0.3,则是负样本。训练时,图像的短边缩放为 600 600 600个像素,用翻转和随机噪声对数据集做增广。RCNN 阶段,batch size 为 128 128 128, 25 % 25\% 25%的样本留作前景 ROIs。网络用 SGD 训练,学习率为 5 × 1 0 − 4 5\times 10^{-4} 5×10−4, momentum = 0.9 \text{momentum}=0.9 momentum=0.9。
Multimodal VoxelNet
保留了 VoxelNet 的大部分设定。将 3D 空间划分为大小 v D = 0.4 , v H = 0.2 , v W = 0.2 v_D=0.4,v_H=0.2,v_W=0.2 vD=0.4,vH=0.2,vW=0.2的体素。使用了两组 VFE 层和三个卷积中间层。根据融合方式不同,这些层的输入和输出维度也不同。
- 对于 PointFusion,VFE 层的配置为 VFE-1 ( 7 + 16 , 32 ) \text{VFE-1}(7+16, 32) VFE-1(7+16,32)和 VFE-2 ( 32 , 128 ) \text{VFE-2}(32, 128) VFE-2(32,128)。 VFE-1 \text{VFE-1} VFE-1的输入是将 3D 点特征和图像特征 concat \text{concat} concat起来,点特征有 7 7 7个维度,图像特征有 16 16 16个维度。2D 检测网络的 conv5 \text{conv5} conv5层的特征有 512 512 512个维度,然后降维至 96 96 96,最终用两个全连接层降至 16 16 16维。
- 对于 VoxelFusion,VFE 层的配置为 VFE-1 ( 7 , 32 ) \text{VFE-1}(7, 32) VFE-1(7,32)和 VFE-2 ( 32 , 64 ) \text{VFE-2}(32, 64) VFE-2(32,64)。2D 检测网络的 conv5 \text{conv5} conv5层的特征有 512 512 512个维度,然后用两个全连接层降维至 128 128 128维和 64 64 64维。然后将降维后的特征与 VFE-2 \text{VFE-2} VFE-2的输出 concat \text{concat} concat起来,每个体素就得到 128 128 128维的向量。
为了降低内存占用,在 RPN 中只使用一半个数的 ResNet blocks。对于这两个融合方法,网络用 SGD 训练,前 150 150 150个 epochs 的学习率为 0.01 0.01 0.01,然后学习率除以 10 10 10。尽管 RPN 变小了,也没有用特殊的数据增强,本文方法取得的准确率仍要明显高于原来只用激光雷达数据的 VoxelNet。
下图展示了在 KITTI 验证集上的可视化效果。(a) 是 VoxelNet,(b) 是用了 VoxelFusion 的 MVX-Net,© 是用了 PointFusion 的 VoxelNet。绿色框表示检测结果,红色框表示漏检和误检的结果。