Advertisement

【3D目标检测】VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection解读

阅读量:

文章目录

  • 前言
    • 摘要
    • 1. 介绍
    • 2. VoxelNet
    • 3 训练细节
    • 4. 结果
    • 5. 总结

前言

1. 为什么要做这个研究?
以往的3D检测应用LiDAR数据或是投影到某个视角,或是对3D体素手工提取特征,而PointNet++无法处理大规模点云数据。作者希望能够构建一个端到端的3D检测网络,并且可以高效运行。
2. 实验方法是什么样的?

  1. 体素化划分,将整个点云区域按照固定分辨率划分成立体网格;
  2. 随机采样,每个体素随机选取t个点(t \leq T),由于点云的稀疏,这些体素90%为空;
  3. VFE层级结构,对每个体素进行编码,得到输入特征集V_{in},对体素内每个点进行全连接(FCN)操作获得逐点特征f_i;然后对所有点特征进行MaxPooling操作获取局部聚合特征\widetilde{f};逐点拼接f_i\widetilde{f},得到f_{out}=[f_i^T, \widetilde{f}^T]^T
  4. 每个体素经过多层VFE得到n×C的特征向量,再经过FCN和element-wise Maxpool,提取出1×C维的voxel-wise Feature;
  5. 所有体素的voxel-wise Feature可放在一个稀疏的4D特征张量中,方便并行处理节约计算成本(这里打一个问号,就是把没有点的网格在4D张量中置0,但是也要参与计算);
  6. 4D特征张量作为输入,采用3D卷积来提取特征;
  7. 通过RPN网络进行预测和回归。

3. 得到了什么结果?
VoxelNet是第一个不采用手工设计的特征表达处理体素网格的端到端3D目标检测网络,网络在KITTI汽车、行人和自行车检测上都取得了很不错的效果。这篇文章可以帮助我们了解如何处理体素化后的点云数据。

摘要

VoxelNet是一种将特征提取和边界盒预测统一为一个单阶段、端到端可训练的3D检测网络。具体而言,VoxelNet将点云划分为等距的3D体素,采用VFE(voxel feature encoding)网络对每个体素内的点进行编码,然后将其连接到3D-RPN检测。该方法在KITTI car detection上取得了SOTA的效果。

1. 介绍

3D检测的应用及其重要性 广泛用于自主导航、家政机器人以及AR/VR。LIDAR提供可靠的深度信息用于准确定位目标并表征其形状。
现有方法 将LIDAR投影到某个视角作为输入;采用3D体素,手工提取体素特征;PointNet和Pointnet++无法处理大规模点云数据。让网络能够处理大规模点云数据实现3D目标检测是本文的主要挑战。
Region proposal network(RPN) 是一种高度优化的高效目标检测算法。该方法要求数据是密集的,并且以张量结构(图像、视频),而原始点云是无序的、稀疏的。在本文中,作者是缩小了3D检测任务的点云特征学习和RPN之间的差距。
VFE 结合点尺度特征和局部聚合特征,实现体素内的点间交互。通过层叠的VFE层将体素编码,然后3D卷积进一步聚合局部体素特征,将点云转化为高维体积表示。最后,通过RPN产生检测结果。
1.1 相关工作 现有的一些3D检测的方法包括:

  1. 手工制作特征,但是无法适应更复杂的形状和场景,也无法从数据中学习。
  2. 从2D图像中推断出3D边界框,但是精准度被深度估计限制。
  3. 对每个体素网格进行表示,先encode再处理。
  4. 多模态融合方法,将图像和LiDAR结合。

1.2 贡献

  1. 提出了一种基于点云的端到端可训练的3D检测架构,VoxelNet。
  2. 提出了VoxelNet的快速实现的方法,受益于稀疏点结构能在体素网格上有效并行处理。
  3. SOTA效果。

2. VoxelNet

2.1 VoxelNet架构
VoxelNet由三个功能块组成:特征学习网络、卷积中间层和区域候选网络。
在这里插入图片描述
2.1.1 Feature Learning Network
Voxel Partition 将3D空间细分为同样间隔的体素。假设点云包含的范围D, H, W是沿Z,Y,X轴的3D空间。作者定义了每个体素的大小为v_D, v_H, v_W,则得到的3D体素网格的size为D^{'}=D/v_D, H^{'}=H/v_H, W^{'}=W/v_W。这里作者假设D,H,W是体素网格的整数倍。
Grouping 由于点云在空间中分布不均匀,因此不同体素之间的点数量差别很大。
Random Samping 针对包含超过T个点的体素,随机抽取保留T个点,一是为了节省计算量,二是为了减少体素之间点的不平衡性,减少采样偏差,增加训练的多样性。
Stacked Voxel Feature Encoding 作者表明最大的创新就在于VFE层级结构,图3显示了VFE第1层的体系结构。
在这里插入图片描述
假设一个体素中包含t \leq T个点,每个点由其XYZ坐标以及反射率表示,体素V = \{p_i=[x_i, y_i, z_i, r_i]^T \in \mathbb{R^4}\}_{i=1...t}。通过级联的VFE-Layer实现点特征和局部聚合特征的逐步级联结合,以VFE-Layer1进行分析。

  1. 计算所有点的均值作为V的质心,记为(v_x, v_y, v_z),用质心的相对偏移量w.r.t增大每个点的质心,得到输入特征集V_{in} = \{\hat{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^4}\}_{i=1...t}。这一步的目的是对每个体素中的点进行去中心化,得到VFE-Layer1的输入,即Point-wise Input;
  2. 输入的每个点\hat{p_i}通过FCN(线性层、BN层和ReLU层)转换到特征空间,获得逐点特征f_i,即Point-wise Feature;
  3. 对逐点特征进行逐点MaxPooling计算,结合周围的点得到局部聚合特征\widetilde{f},即Locally Aggregated Feature;
  4. 逐点拼接Point-wise Feature和Locally Aggregated Feature,得到f_{out}=[f_i^T, \widetilde{f}^T]^T,即Point-wise concatenated Feature。对于VFE-i,假设输入的点的维度是C_{in},输出的逐点特征维度为C_{out},那么在第二步FCN层需要学习C_{in}×(C_{out}/2)个参数。

最终,每个voxel包含t个点,使用多层VFE Layer提取特征,得到n个C维的Point-wise Feature。这些特征向量经过FCN整合特征,再通过element-wise Maxpool,提取出1×C维的voxel-wise Feature。
Sparse Tensor Representation 经过多层VFE后,每个voxel都可以得到一个voxel-wise Feature,放在一起可表示为一个稀疏的4D张量,尺寸为C×D^{'}×H^{'}×W^{'}。虽然点云包含了大约100k个点,但是大部分voxel都是空的,将非空体素特征表示为稀疏张量可以有效节省计算资源,如图2中voxel3是空的,因此在特征列表中没有对应特征。
2.1.2 Convolutional Middle Layers
使用3D卷积进行特征提取,采用ConvMD(C_{in}, C_{out}, k, s, p)来表示,其中C_{in}为输入通道的数量,C_{out}为输出通道的数量,k, s和p分别对应kernel size、stride和padding。每个卷积中间层顺序应用3D卷积、BN层和ReLU层。
2.1.3 Region Proposal Network
RPN网络的输入是卷积中间层输出的特征图,网络有3个完全卷积层,见图4。

  1. 每个块的第一层通过stride=2将feature map的尺寸降低一半,然后是一系列stride=1, padding=1的3×3卷积。在每个卷积层后,应用BN和ReLU操作。

  2. 将3个block的输出都上采样到一个统一的size,然后拼接到一起,再映射为两个学习目标:Probability score map和Regression map。
    在这里插入图片描述
    2.2 Loss Function
    Probability score map的输出通道是2,分别对应positive和negative的分数,Regression map输出通道为14维,对于每个回归的Bounding box都用7维来表示(x_c^g,y_c^g,z_c^g,l_c^g,w_c^g,h_c^g,\theta_c^g),也就是中心位置 、候选框的长宽高和航向角,另外两个旋转轴默认为0,原因是地面水平。同理,假设预测的anchor位置为(x_c^a,y_c^a,z_c^a,l_c^a,w_c^a,h_c^a,\theta_c^a),因此可定义如下的残差:
    在这里插入图片描述
    其中,d^a=\sqrt{(l^a)^2+(w^a)^2}是anchor框底部的对角线长度,采用d^a的目的是用对角线齐次归一化\Delta{x}\Delta{y}。然后定义损失函数:
    在这里插入图片描述
    损失函数前面两项是正则化分类损失,其中p_i^{pos}p_j^{neg}分别表示softmax层对正锚a_i^{pos}和负锚a_j^{neg}的分数,采用的是交叉熵表示,\alpha\beta为正定平衡系数。最后一项是回归损失,u_iu_i^*是正锚的回归输出和ground truth,采用的是Smooth L1损失。
    2.3 高效实现
    将稀疏点云转为密集张量,使得VFE能够并行处理voxel,提高处理效率。

  3. 初始化一个K×T×7维的tensor,存储feature buffer,K表示非空体素的最大数量,T是每个体素的最大点数,7是每个点编码的特征维度。

  4. 对于点云中任意一个点去查找它所在的voxel是否初始化,如果已经初始化了就检查是否大于T个点,如果没有就添加该点,否则舍弃该点。如果这个voxel没有初始化,就初始化一个voxel,将其坐标存储在voxel buffer中,并将该点插入到该体素位置。

  5. 建立了input buffer之后,堆叠的VFE仅涉及点级别和voxel级别密集操作,该操作可以在GPU上并行计算。在VFE中的concate之后,把没有点的特征再次设置为0。

  6. 使用存储的坐标缓冲区,将计算的稀疏体素结构重新组织到密集体素网格。
    在这里插入图片描述

3 训练细节

3.1 Network Details
Car Detection

  • 输入的z,y,x范围为[-3, 1]×[-40,40] × [0, 70.4]内的点云,多余的删除;
  • 每一个voxel的尺寸为v_D=0.4, v_H=0.2, v_W=0.2米,这样D^{'}=10,H^{'}=400,W^{'}=352
  • 每个非空体素中的随机采样点最大为35,即T=35;
  • 使用两个VFE层,VFE-1(7,32)和VFE-2(32,128),最后VFE-2输出的特征维度为128。这样得到的稀疏点云tensor为:128×10×400×352
  • 为了进一步聚合voxel-wise features,依次应用3个卷积中间层Conv3D(128, 64, 3, (2,1,1), (1,1,1)),Conv3D(64, 64, 3, (1,1,1), (0,1,1))Conv3D(64, 64, 3, (2,1,1), (1,1,1)),这里(2,1,1)表示3D卷积沿着xyz轴移动的步长,(1,1,1)表示长宽高的padding都为1,得到64 × 2 × 400 × 352的4D张量。送入RPN网络前整合一下,输入为128×400×352,分别对应3D张量的通道、高度和宽度。
  • 文章仅使用了一种anchor size,l^a=3.9, w^a=1.6, h^a=1.56m,中心在z_c^a=-1.0,具有0度和90度两个旋转角度。
  • 如果预测出的anchor在鸟瞰图中与ground truth的IoU>0.6,则为positive(正例框)

Pedestrian and Cyclist Detection 和上面类似,细节改变。
3.2 Data Augmentation
文章提出了三种数据增强方法,主要针对旋转平移、缩放变换、全局或局部进行。

4. 结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 总结

文章提出了一种用于点云的3D检测的新型端到端可训练的深度架构,可以直接在稀疏的3D点云上运行,有效捕获3D形状信息。此外,文章还提供了VoxelNet的高效实现,将稀疏点云转为密集张量,实现并行处理。网络在KITTI汽车、行人、自行车检测任务上都获得了不错的效果。

全部评论 (0)

还没有任何评论哟~