PointNet、PointNet++系列解读

PointNet、PointNet++系列解读

论文地址:
PointNet
PointNet++

PointNet 解读

经典的卷积神经网络需要一个规律的输入格式,但是点云或者meshes都不是一个规律的格式(点云只是一系列点坐标值的无序集合),很多研究者将点云转化为体素网格(3D voxel grids)或者多视图(如MVCNN)的2D图像送入深度网络中,这种数据形式的转化增加了不必要的数据量,同时还引入了量化伪像,掩盖了数据的自然不变性。

PointNet则直接将点云作为输入,并输出整个输入的类标签或输入的每个点的每个分割/部分标签,从而实现3D物体分类/分割。接下来介绍PointNet是怎么做的:

任务定义:

首先,输入定义为一个3D点集,每个点由一个长度为3的向量(x,y,z)表示,为其坐标。对于物体分类任务,输出为对应k个类别的k个得分。对于语义分割任务,网络的输出为nxm(总共n个点,m个语义分割类,即输出每个点属于每个类别的概率)。

点集的特性:

  1. 无序性。点云数据是一个没有特定序列的点集,也就是说一个网络需要对输入的N个3D点集的N!个排序方式有不变性。
  2. 点之间的相互作用。 这些点来自具有距离度量的空间。 这意味着这些点不是孤立的,相邻的点形成一个有意义的子集。 因此,模型需要能够从附近的点捕获local结构,以及local结构之间的组合相互作用。
  3. 变换不变性。对于一个几何物体,网络学习到的关于该点集的特征应该对诸如旋转和平移变换具有不变性。

PointNet结构

根据点集的这三点特性,设计PointNet的结构如图所示:

PointNet、PointNet++系列解读_第1张图片
PointNet包含三个主要结构:

  1. maxpooling层:作为对称函数聚合global信息
  2. 一个local和global信息组合结构
  3. 两个联合对齐网络:对齐输入的点和特征
maxpooling层

首先,作者讨论了处理无序输入的三种方式:排序、作为RNN、使用简单的对称函数。

排序的方式难以保证网络学到一个稳定的映射。

而通过RNN训练的目的是希望随机排序的点集,能够让RNN变得对输入顺序具有不变性,但是尽管RNN对长度较短(数十个)的序列的输入排序具有相对较好的鲁棒性,但很难扩展到数千个输入元素,这是点集的常见大小。

而作者提出的方法是通过对点集变换后的结果施加一个对称函数来近似一个点集上的通用函数,也就是说,通过一个MLP对输入的每一个点进行处理,然后通过一个pooling函数将他们加在一起(对称操作,与顺序无关)。
这三种方法的对比实验如下:
PointNet、PointNet++系列解读_第2张图片
可见使用作者提出的方法效果最好,且maxpooling的效果比另外两种好。

local和global信息组合

这部分用于语义分割,因为语义分割需要用到全局信息,所以将分类时pooling后得到的global feature 拼接到之前的nx64特征的每一个点之后,得到新的nx1088的特征,该特征包含了每个点的local特征以及global特征,最后通过两个MLP得到每个点的分割结果:
PointNet、PointNet++系列解读_第3张图片

联合对齐网络

如果点云经历某些几何变换(例如刚性变换),则该点云的语义标记必须是不变的。 因此,我们期望通过我们的点集获得的学习表示对于这些变换是不变的。这也是图中两个transform的作用。

图中第一个input transform 以及T-Net的结构,是一个MLP层 (with layer output sizes 64, 128, 1024) ,对每个点进行处理,最后通过一个max pooling操作对所有点的特征进行pooling,得到一个长度为1024的向量,然后通过三个全连接层(输出尺寸:512,256,9)得到长度为9的向量,最终resize成3x3,然后与原始输入Nx3做矩阵乘法,这个3x3的矩阵就是对原物体的坐标变换矩阵,可以对如旋转这类的操作进行对齐。
第二个feature transform也是类似操作。具体细节可以参考源码解析code。

PointNet 解读

待续…

你可能感兴趣的:(3D,3d点云,深度学习)