0%

浅谈PointNet和PointNet++网络及其应用

PointNet 和 PointNet++ 网络由 Charles R. Qi 于2017年提出,分别发表于CVPR 2017和NIPS 2017会议上。PointNet++ 是 PoinNet 的升级版,也更复杂,两篇论文的现在都可检索,且分别作为一个章节被写入了 Qi 的博士论文中,如果想更加具体地理解各个细节,可从博士论文下手(参考文献会附上资源)。本文预先假设读者已经阅读过这两篇论文,并且对点云特性有一定了解,所以细节方面不过多赘述,更多地是探讨思路。

1. 网络结构

1.1 PointNet

PointNet 按照任务划分 classification 和segmentation两种,如上图所示,途中上半部分为classification network(下文以C网络代替),下半部分为 segmentation network(下文以S网络代替)。两个任务的网络输入都是 $ n * 3 $ ,代表 $n$ 个三维坐标点,C网络输出为经过 softmax 之后的 $k$ 个值,而S网络为 $n$ 个点的逐点的score。

其中一个值得注意的区别是,两个网络中对max pooling层出来之后global feature不同。我的理解为是:C网络由于是简单的输入点云的分类任务,所以只需要得到一个最明显的feature来代表这个点云就可胜任分类任务;而S网络由于是逐点的语义分割,所以将global feature concatenate到每一点后面,作用是使每一个点都同时具有自身点的feature和global feature,更有利于进行逐点的分类。

1.2 PointNet++

PointNet++按照任务也分为 classification (C网络)和 segmentation (S网络)两种,输入和输出分别与PointNet中的两个网络一致。首先,比较PointNet++两个任务网络的区别:在得到最高层的 feature 之后,C网络使用了一个小型的 PointNet + FCN 网络提取得到最后的分类 score;S网络通过 skip link connection 操作不断与底层 low-level 信息融合,最终得到逐点分分类语义分割结果。

PointNet++ 的思路与U-Net很相似:利用encoder-decoder结构,逐层提高feature level,在到达最高层之后通过 skip link connection 操作恢复局部信息,从而达到既能获取 high-level context feature 也能获取 low-level context feature。

2. 应用场景

从PointNet的结构可以看出,由于没有local context信息,因此对复杂的点云没办法处理,也是PointNet结尾总结的future work,即在PointNet++中进行了升级。由于使用了max-pooling这个具有强对偶性和特征筛选的操作,使得PointNet只能处理较为简单的点云,这些点云都有一个特征:属于同一物体或者处于某个局部空间内。在点云中属于同一个物体和处于某一局部空间内可看作等价。因此,从PointNet的应用目的角度,使用PointNet的点云分割和检测网络主要有以下两种:

  • 放在网络前部,作为局部点云特征提取器(feature extractor)
  • 放在网络后部,作为具体任务的refine或语义分割,如局部点云语义分割或3D BBox等目标的回归

至于为什么使用PointNet而不是使用PointNet++,从结构上可以看出PointNet++会有一个邻域中心和邻域点云索引的过程,会使速度下降严重,另外从本节第一段话也得知,对于局部点云这些简单的数据组成,使用PointNet也足够胜任。下面将就PointNet和PointNet++作为不同任务,简单罗列下提到的Paper中的使用。

2.1 特征提取器

Motivation:特征提取器(feature extractor)有别于人工特征设计,特征提取器的目的是在特征构建层面,使用网络让其自行学习一些人工无法构建的特征,从而提升特征的表达,最终达到提升网络性能的目的。说句题外话,人工构建特征都是基于人的先验知识来构建的特征,比如说点的数目,最大高度等等,这些具有强人类先验知识特征构建便于人类理解,但是对于数据表达来说,在这个过程丢失了很多信息。因此,我们希望送进网络的是raw data,网络能自行的学习特征。

值得注意的是,特征提取器网络一般采用PointNet而不是PointNet++,除了如上文所说速度考虑以外,作为特征提取器一般会在对整张点云进行栅格化(grid)或体素化(voxel)后的单元内进行,这样就符合了上文另一个条件——输入点云都处于局部空间内。相关的论文有如下:VoxelNet,SECOND,PointPillars, PointFusion。

也有例外,如IPOD,使用PointNet++对整张点云提取特征。

VoxelNet

使用PointNet对体素化后的单元提取特征。

SECOND

使用PointNet对体素化后的单元提取特征,同VoxelNet。

PointPillars

使用PointNet对栅格化后的单元提取特征。

PointFusion

IPOD(PointNet++)

使用PointNet++对整帧点云提取特征。

2.2 逐点语义分割 / 3D BBox 回归

PointNet或PointNet++作为具体任务网络与论文挂钩,但主要分为逐点语义分割和3D BBox回归两种。当然还有其它任务,后面也会罗列。

PointRCNN(PointNet++)

PointNet++输入整帧点云进行语义分割和3D BBox proposal提取。

Frutum-PointNet

第1个PointNet:对得到的锥形3D proposal进行前景点语义分割

第2个PointNet:对前景点回归出3D Bbox

RoarNet

第1个PointNet:对同一个目标筛选出置信度最高的proposal和大致回归出目标3D Bbox的位置

第2个PointNet:回归出3D Bbox

FVNet

PointNet 对 proposal 局部点云回归 3D Bbox。

3. 结论

  1. 从前文分析可得出,不管点云网络的任务是什么,对于复杂场景点云一般采用PointNet++进行处理,而简单场景点云则采用PointNet。

  2. 如果只从点云分类和分割两个任务角度分析,分类任务只需要max pooling操作之后的特征信息就可完成,而分割任务则需要更加详细的local context信息。

这篇文章主要从PointNet角度去分析基于点云的目标检测任务,从提取 3D proposal 形式的角度在将来会以另一篇文章继续进行讨论。

以上。

参考文献:

  1. DEEP LEARNING ON POINT CLOUDS FOR 3D SCENE UNDERSTANDING(Ph.D Thesis)
  2. PointNet : Deep Learning on Point Sets for 3D Classification and Segmentation
  3. PointNet ++ : Deep Hierarchical Feature Learning on Point Sets in a Metric Space
  4. VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection
  5. SECOND: Sparsely Embedded Convolutional Detection
  6. PointPillars: Fast Encoders for Object Detection from Point Clouds
  7. PointFusion : Deep Sensor Fusion for 3D Bounding Box Estimation
  8. IPOD: Intensive Point-based Object Detector for Point Cloud
  9. PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud
  10. Frustum PointNets for 3D Object Detection from RGB-D Data
  11. RoarNet: A Robust 3D Object Detection based on RegiOn Approximation Refinement
  12. FVNet: 3D Front-View Proposal Generation for Real-Time Object Detection from Point Clouds