PointNet与PointNet++:基于深度学习的3D点云分类和分割模型

0 / 662

PointNet由斯坦福大学的Charles R. Qi等人在PointNet:Deep Learning on Point Sets for 3D Classification and Segmentation一文中提出。之后提出了2.0版本 PointNet++

github地址:

https://github.com/charlesq34/pointnet
https://github.com/charlesq34/pointnet2

这两个为tensorflow版本。

有第三方修改后的pytorch版本如下:

https://github.com/yanx27/Pointnet_Pointnet2_pytorch

点云具有三个特征:无序性、稀疏性、信息量有限
PointNet网络结构的灵感来自于欧式空间里的点云的特点。对于一个欧式空间里的点云,有三个主要特征:
无序性:虽然输入的点云是有顺序的,但是显然这个顺序不应当影响结果。
点之间的交互:每个点不是独立的,而是与其周围的一些点共同蕴含了一些信息,因而模型应当能够抓住局部的结构和局部之间的交互。
变换不变性:比如点云整体的旋转和平移不应该影响它的分类或者分割

以往学者用深度学习方法在处理点云时,往往将其转换为特定视角下的深度图像或者体素(Voxel)等更为规整的格式以便于定义权重共享的卷积操作等。PointNet则允许我们直接输入点云进行处理。

输入输出

输入为三通道点云数据(x_i,y_i,z_i),也可以有额外的通道比如颜色、法向量等,输出整体的类别/每个点所处的部分/每个点的类别。对于目标分类任务,输出为k个分数,分别对应k个可能的类别。对于语义分割任务,输出n\times m个分数,分别对应n个点相对于m各类别的分数。

网络结构

网络结构

如图所示,分类网络对于输入的点云进行输入变换(input transform)和特征变换(feature transform),随后通过最大池化将特征整合在一起。分割网络则是分类网络的延伸,其将整体和局部特征连接在一起出入每个点的分数。图片中"mpl"代表"multi-layer perceptron"(多层感知机)。
其中,mlp是通过共享权重的卷积实现的,第一层卷积核大小是1x3(因为每个点的维度是xyz),之后的每一层卷积核大小都是1x1。即特征提取层只是把每个点连接起来而已。经过两个空间变换网络和两个mlp之后,对每一个点提取1024维特征,经过maxpool变成1x1024的全局特征。再经过一个mlp(代码中运用全连接)得到k个score。分类网络最后接的loss是softmax。

网络特点

针对无序输入的对称函数
为了让模型具有输入排列不变性(结果不受输入排列顺序的影响),一种思路是利用所有可能的排列顺序训练一个RNN。作者在这里采用的思路是使用一个对称函数,将n个向量变为一个新的、与输入顺序无关的向量。(例如,+\times是能处理两个输入的对称函数)。
将点云排序是一个可能的对称函数,不过作者在这里采用一个微型网络(T-Net)学习一个获得3\times 3变换矩阵的函数,并对初始点云应用这个变换矩阵,这一部分被称为输入变换。随后通过一个mlp多层感知机后,再应用一次变换矩阵(特征变换)和多层感知机,最后进行一次最大池化。
作者认为以上这个阶段学习到的变换函数是如下图所表示的函数gh,保证了模型对特定空间转换的不变性(注意到深度学习实际上是对复杂函数的拟合)。
个人的理解是其中g作为一个对称函数,是由最大池化实现的(注意到映射(x_1,x_2,...,x_n)\rightarrow ||(x_1,x_2,...,x_n)||_\infty是n-对称的);而h是mlp结构,代表了一个复杂函数(在图中是将一个3维向量映射成1024维向量的函数)。

学习到的对称函数

整合局部和全局信息
对于点云分割任务,我们需要将局部很全局信息结合起来。
这里,作者将经过特征变换后的信息称作局部信息,它们是与每一个点紧密相关的;我们将局部信息和全局信息简单地连接起来,就得到用于分割的全部信息。

理论分析

除了模型的介绍,作者还引入了两个相关的定理:

定理1

定理1证明了PointNet的网络结构能够拟合任意的连续集合函数。

定理2

定理2(a)说明对于任何输入数据集,都存在一个关键集和一个最大集,使得对和之间的任何集合,其网络输出都和一样。这也就是说,模型对输入数据在有噪声和有数据损坏的情况都是鲁棒的。定理2(b)说明了关键集的数据多少由maxpooling操作输出数据的维度K给出上界(框架图中为1024)。个角度来讲,PointNet能够总结出表示某类物体形状的关键点,基于这些关键点PointNet能够判别物体的类别。这样的能力决定了PointNet对噪声和数据缺失的鲁棒性。[引自美团知乎专栏]

下图给出了一些关键集和最大集的样例:

原始数据、关键集和最大集