3D点云目标检测算法综述

一、概述

在3D点云目标检测领域,对于数据输入的处理一般有三种:

  1. 多视角。将三维点云投射到多个二维平面形成图像
  2. 体素,voxel,将三维点云切割成多个小块,这些小块就叫体素,类似像素。这是最自然的一种想法,正如像素通过规律排列形成二维图像,体素也是通过规律排列形成三维体的,并且可以使用3D卷积像图像一样进行操作。然而这样做会增加一个维度,时间和空间复杂度都非常高(想想一下(416,416,416)的输入),所以现在已经不怎么用了。 现在的VoxelNet不还是回归到体素了吗?只不过VoxelNet不是直接对体素进行卷积,后面详细介绍。
  3. 直接输入点云数据(N,D),N是点云文件中点的数量,一般在万级,D则是特征维度,一般是x,y,z加一个强度,也就是4维。

二、PointNet(2017.7)

原生的点云数据有两大特点:
1. 置换不变性(transformation invariance):任意交换各点的位置,不影响对形状的表达
2. 旋转不变性:所有的点做相同的变换(旋转平移),不影响对形状的表达

PointNet的思路就是利用上述两个特点。

  1. 置换不变性
    事实上有很多函数是不考虑输入集顺序的,比如求最大值和均值,PointNet采用了MaxPooling,即求每个维度的最大值。比如N×D最终输出一个D维数组作为特征代表,D太小,会损失很多信息,所以作者现将输入映射到N×1024,然后输出1024维的特征,这样可以保留更多信息。
  2. 旋转不变形
    所谓旋转,就是乘以一个D×D的矩阵,作者采用了一个很巧妙的方式,训练一个这样的网络,让点云输入主网络之前自己调整到最好的姿态。

2.1 PointNet网络结构

3D点云目标检测算法综述_第1张图片

PointNet有分类和分割两种网络,分类网络基本思想如下:

  1. 输入N个3维点,也就是点云
  2. 经过Tnet旋转到合适的角度,利用旋转不变性
  3. 经过一系列的卷积转换为N×1024维
  4. Maxpooling,输出1024维的向量,利用置换不变性
  5. 经过全连接,输出k维向量,显然k就是分类数

分割是在分类的基础上做些演绎,最终输出N×M的矩阵,M代表分类,也就是说给每个点都进行了分类。

2.2 PointNet主要创新

  1. 首次直接将点云数据输入网络,而不是将其进行规范化
  2. 对旋转不变性和置换不变性的利用

三、VoxelNet(2017.9)

VoxelNet关注的更多是点云的稀疏性和密度不均衡性,虽然作为声称直接输入点云数据,但是看起来还是将点云进行了规范化,即投射到3D空间。
该算法发布于PointNet面世后两月,作者称赞了PointNet取得的成绩,然后反手就是一句我才是“state of the art”。具体来说,作者认为PointNet有两个问题:

  1. 能够容纳的点云数量太少(约1k,Nuscenes 32线 ~43k,Kitti 64线 ~153k)
  2. 没有目标检测功能(只有分类和分割)。

所以作者的主要目的就是要让自己的网络能够容纳更大规模的输入以及能够实现目标检测(带航向角的3D框,7个自由度)

3.1 VoxelNet网络结构和流程

3D点云目标检测算法综述_第2张图片

VoxelNet网络整体分为三部分:

  1. Feature learning network:全连接和最大池化,局部特征提取
  2. Convolutional middle layers:3D卷积,并在最后将张量压缩一个维度
  3. Region proposal network:2D卷积,输出目标map
3.1.1 Feature learning network
  1. 首先将3D空间均匀的划分为一个个3D格子,称为voxel(体素)。每个体素含有若干个激光点,而90%以上的voxel不含点,利用这个特性,后面会使用稀疏张量,大大节省空间和BP算法计算量。
    具体划分规则:以Kitti为例,首先限制点云范围在Z: [ -3, 1] , Y: [ 40, -40] , X: [0, 70.4],每个格子的尺寸相应为0.4,0.2,0.2,这样3D空间就被划分为10×400×352的网格(分别对应D-竖向,H-横向,W-纵向,也就是沿着道路的方向)。另外作者采取了随机采用的方式,对每个格子取点数量做限制,车取35,人和自行车取45,详见论文。
  2. 对每一个voxel,利用Voxel Feature Extraction(VFE)提取特征。VFE是作者声称的主要创新点,不过实际上相当于对每个voxel里的点集做PointNet做过的事,考虑到两篇论文时间相近,看来是两个作者想到一块去了?
  3. VFE
    3D点云目标检测算法综述_第3张图片

VFE的过程图中描述的很清楚,输入、全连接增加每个点的维度、最大池化提取这一堆点的特征(1维),在分别拼接到前面每个点的特征中,有点skip-connect的意思。经过一个VFE,输出了point-wise的feature,注意在整个网络中VFE是叠加的,并且每个VFE的参数不一样,详见论文。
4. 在经过一些列的VFE层之后,在接上全连接层和池化层,输出一个一维的特征,这个特征就可以代表所在的这个voxel了,所以这个特征也叫voxel-wise feature,而没有point的voxel则不存在这个特征。作者在这里使用了稀疏张量,不必记录这些为0的voxel。
所谓稀疏张量,是指记录张量尺寸、非零的值及其索引,这样可以节省内存和BP算法的计算开销
5. 所有的voxel经过VFE后最终输出的是一个128 × 10 × 400 × 352的张量,也就是说每个voxel里的特征都是128维的。再次强调,这是一个稀疏张量sparse tensor

3.1.2 Convolutional middle layers

这个阶段比较简单,对128 × 10 × 400 × 352的张量做3次3D卷积,聚合各个voxel的特征(可以看到,从最开始的point-wise、voxel-wise再到现在聚合voxels特征,该网络对特征的提取层层递进,很是精妙啊!)。
这3次卷积之后输出的张量是64 × 2 × 400 × 352,接着压缩一个维度,最终输出3D的张量:128 × 400 × 352,事实上从这个张量的形状可以看到,这就相当于是提取了俯视图的特征,然而和图片不同的是:图片是直接降维,在Z方向把3D点云拍扁,而作者这样做对每个“俯视图”中的点都保留了128维的信息!

3.1.3 Region proposal network

3D点云目标检测算法综述_第4张图片

RPN层,作者说参考的是Faster-RCNN,不过看起来更像是YOLO,因为这里输出的直接就是最后的预测结果了,而不是推荐区域。
上一层输出了3D张量,在本阶段就可以使用2D卷积了,基本上就是图像卷积里的老套路了,卷积、上采样、降采样、skip-connect等等。图中表达的很清楚,值得注意的是这个阶段缩小尺寸也是通过stride=2实现的,感觉现在的网络更加倾向于全连接,池化用的越来越少。
最重要的是输出,这层的输出就是最终结果了。作者设计了两个分支,一边分类,一边回归(毫无新意啊!)。
分类方面,输出2个维度,对应两个anchor,或者说每个网格预测两个结果。
回归方面,输出14个维度,也是对应两个anchor,而每组结果对应的是7个自由度。
顺便提一下损失函数,分类交叉熵损失,回归L1-smooth(毫无新意+1)

四、CenterPoint(2017.9)

按照作者描述,CenterPoint就是将VoxelNet的RPN层换成了CenterNet。(我真是醉了,这都能水论文)
从两个方面简单说一下两者区别:

  1. 首先VoxelNet的RPN层很简单,从上图可以看到只有十几层卷积,再加上resnet跳级连接的思想。而CenterNet无论是用DLA还是Hourglass网络规模和复杂度都要高很多,所以效果好是自然的。我觉得这不能算CenterPoint的贡献。
  2. 最后的输出也有差别。VoxelNet输出两个分支,分别对应分类和7个自由度的回归。CenterNet输出的是80张heat map分别代表80个类别的预测,而坐标等信息则通过另外的分支回归。而CenterPoint将输出分为两部分:prediction Y branchregression branch,这个Y指什么?中心点坐标吗?因为作者说CenterPoint中对中心点的检测是核心。还有分类是怎么处理的?也是回归?

五、备注

  1. PointPillar和VoxelNet一样也是主流的3D点云检测算法,主要差别在于在最初划分体素是PointPillar将整条点划为一个voxel,就像一个柱子一样,所以后面也不需要3D卷积,速度快了不少。
  2. SECOND(2018.10)在VoxelNet的基础上简化了VFE,直接对那些点做平均池化。
    参考:
    三维深度学习之pointnet系列详解
    从PointNet到PointNet++理论及pytorch代码
    VoxelNet: 基于点云的三维空间信息逐层次学习网络
    3D版CenterNet: CenterPoint

你可能感兴趣的:(算法笔记)