PointNet & PointNet++

PointNet & PointNet++

​ 3d 数据多重表示,例如 point cloud,mesh,volumetric 和 RBGD(投影过后的视角),但是我们常常使用的是 point cloud数据格式,因为点云格式是传感器的原始数据,同时是一种规范的数据形式,因此在实际中我们常常选择对点云数据处理而非其他格式的 3d 数据,PointNet 之前的工作都是通过将点云数据通过变换,变为其他形式的数据之后再使用对应数据的处理方法来进行 3d 分类的,例如先将点云数据投影到二维再使用 CNN 分类;再例如将点云数据变成体素数据,使用 3d 的卷积网络进行分类。PointNet 直接对点云的原始数据进行处理,避免了转化过程的信息损失,达到了更好的性能:

PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

​ PointNet 所作的事情就是对点云做特征学习,并将学习到的特征去做不同的应用:分类(shape-wise feature)、分割(point-wise feature)等。PointNet 之所以影响力巨大,就是因为它为点云处理提供了一个简单、高效、强大的特征提取器(encoder),几乎可以应用到点云处理的各个应用中,其地位类似于图像领域的 resnet

​ 对点云数据的特征学习需要考虑一下点云数据的特点:

  1. 无序性 --> 需要设计对称函数来进行表征学习
  2. 点不是孤立的,需要考虑局部结构 --> 局部全局特征结合
  3. 仿射变换无关性 --> alignment network

pointnet

PointNet 设计结构体现了上面提到的设计思路:

  • max-pooling 是对称的,输出结果对于输入数据的顺序是无关的
  • T-Net 用于仿射变换(但是实际上这个模块效果作用不大,这只是一种广义的数据增强的手段,以此来一定程度上提升泛化能力)
  • 对于分割任务,将 global feature 和浅层网络的 point-wise feature 拼接,再进行特征融合到最后的逐点的分类,就是一种局部全局特征融合(可以看得出来当时网络设计没有借鉴 UNet,这种融合还是很粗糙的)

PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

​ 简单理解就是 PointNet 借鉴了 UNet 的设计思想,进行了逐阶段的特征融合,避免了特征融合的时候一下子尺度差异太大,对于细粒度分类的地方效果不好。

​ 如果要逐级特征融合,那么可以预见的,我们要思考:数据如何逐级下采样和上采样?

  • downsample & group:使用FPS(最远点采样)对点集进行降采样,将输入点集从规模 NN 降到更小的规模 N1N_1,即从 NN 个点中选取 N1N_1 个中心点,那么 grouping 就是一这 N1N_1​ 个点为中心,找固定规模的相邻点,这个 grouping 一版有两种方式:KNN 和 query ball point,KNN 就是 K 近邻算法,找 K 个坐标空间最近的点。和中心点在一起为一组;query ball point 就是划定某一半径,找在该半径球内的点作为邻点
  • upsample:使用 downsample 前的坐标进行插值,通过反向插值和 skip connection 来获得 discriminative point-wise feature

pointnet++

研究意义

​ 这两项工作提供了点云深度学习的一条可行道路,证明了直接在非欧几何数据上学习表征的可行性,后续的 DGCNN、KPConv 等方法均继承其核心思想,通过改进邻域构建方式(提取局部特征)提升性能