文章:C. R. Qi, H. Su, K. Mo, and L. J. Guibas. Pointnet: Deep learning on point sets for 3d classification and
segmentation. arXiv preprint arXiv:1612.00593, 2016.
作者:Charles R. Qi, Hao Su, Kaichun Mo, Leonidas J. Guibas
链接:https://arxiv.org/abs/1612.00593
本文版权声明:copyright@phosphenesvision
参考资料:https://blog.csdn.net/qq_15332903/article/details/80224387
本文为PointNet系列第一篇论文,进阶篇PointNet++参见链接:https://blog.csdn.net/phosphenesvision/article/details/106724667,
首先来描述一下本文的网络的工作流程,网络的输入是未经处理过的点云数据,很多个点组成了一个集合输入到网络中,每个点由特征向量来表示,特征向量中包含该点的xyz坐标,颜色等相关信息,但是一般我们只考虑xyz坐标信息,忽略其他信息。
对于一个分类网络来说,输入就是直接输入这些未经处理的点云数据集,输出是一个k维的score向量,表示该点云集是每一类数据的可能性和概率。对于分割任务,又可以分成局部分割和全景分割,局部分割的意思是对一个物体进行分类,分类出它们的各个部位,而对于全景分割,通常是给出一个场景,分割出该场景中的每一类物体,但是这两种情况的输出都是一样的,输出是一个n * m的矩阵,分别来表示n个点中的m个类别的归属结果。
三个属性:无序性,点间交互性,刚性变换(transformation)不变性,我认为第二个属性和第三个属性其实是可以合并的,刚性变换不变性也是相对于点和周围点之间的属性,也算是点与点的交互性的范围,而刚性变换不变性又是点间交互性最主要的一个特性,因此个人认为两者可以合并。
无序性:这是点云相当重要的一个性质,什么意思呢,借用引用链接的解释,无序性的定义是说,点云本质上是一长串点(nx3矩阵,其中n是点数)。在几何上,点的顺序不影响它在空间中对整体形状的表示,例如图中,相同的点云可以由两个完全不同的矩阵表示,但是在正常的输入之中,如果再惨杂进无序性这个特点,那么数据就会受到影响了,如果一个点云图中有N个点,那么可能产生的输入就有N!种,因此我们希望得到的效果如下图右边:N代表点云个数,D代表每个点的特征维度。不论点云顺序怎样,希望得到相同的特征提取结果。具体的实现策略可以看4.2.1节。
点间交互性:点云图中的点存在于一个距离测量空间中,在这个空间中,所有的点都不是孤立的,而是可以与周围的点形成一个局部区域,这个局部区域是有意义的,这也就要求我们的网络能够提取出相应的局部特征。
在这里稍微提一下,虽然本文中提到了局部区域,但是点的表示只是用一个三维坐标来表示的,这根本无法如文中所说可以捕捉局部特征,因此本文中提出的PointNet网络并没有很好的提取局部特征的能力,而它的升级版PointNet++则着重于解决这个问题,具体参看PN++的文章。
刚性变换不变性(invariance under transformations):这一个特性很好理解,就是说对于这些点集对于一些刚性变换来说,比如旋转和平移,虽然点的位置和坐标会发生变化,但是内在特性应该是保持不变的,比如类别信息和语义信息。具体的实现策略可以参考4.2.3小节。
根据结构图,首先来看网络来分析该网络,然后再来补充细节。
在前面已经阐述了无序性的定义,网络结构需要处理这种无序性,也就是无论输入点集中点的顺序如何,输出结果应该是相同的,本文中本小节阐述了三种相应的方法,分别是①将输入点集按照一个规范的顺序进行排序;②把输入当成一个序列,按照训练RNN的方法来训练网络,但是需要做一个数据增强,提前将所有可能的刚性变换全部考虑到;③设计一个平衡函数,将所有的点通过这个平衡函数结合起来。
本文采取的是第三种算法,因此前两种算法不再详细介绍,值得注意的是平衡函数有很多种,加法运算 + 和乘法运算 * 都可以看作是一个平衡函数,我们设计的平衡函数需要满足的要求是如下这个公式
f ( { x 1 , x 2 , . . . , x n } ) ≈ g ( h ( x 1 ) , h ( x 2 ) , . . . , h ( x n ) ) f ( \{x_1, x_2, ..., x_n\}) \approx g(h(x_1), h(x_2), ..., h(x_n)) f({x1,x2,...,xn})≈g(h(x1),h(x2),...,h(xn))
本文的想法是用g函数去近似f函数,f函数是网络的原函数,是定义在初始点云集合上的,g函数是是一个平衡函数,是定义在初始点云集合提取的特征上的,h函数是一个多层感知器网络MLP,用于对初始点云集合提取特征。
具象来说,选取的平衡策略函数g,特征提取函数h等等这些函数的组合应该是要逼近网络的预期效果f。
而本文选取的g函数就是一个简单的最大池化层函数,回顾刚才的网络模型,输入进最大池化层的是一个n * 1024的张量,而输出的则是1 * 1024的张量,这便是最大池化层的效果。一个更为形象的图是这样的:
尽管最大池化的平衡策略看起来很简单,但是理论分析4.3节和实验结果5.2.1节都表明了该函数的有效性和高效性。
本文的PointNet网络的骨架结构输出是一个经过最大池化的一维向量,这个向量可以被看作是输入点云集的全局特征,对于分类任务来讲,再去训练一个SVM分类器或者MLP分类器即可得到输出结果,而分割任务则不是这么简单,分割任务需要用一个跳跃结构将该全局特侦与之前的局部信息结合起来,再去经过分类器去训练分类的语义值。
这样对于网络的改变从实验结果来看是起到了一个正向的作用。
本小节对应的是点云的第三个特征,刚性变换不变性
首先同样是给出了一个对比算法,是在特征提取之前把所有的输入数据集排列到一个规范空间。
但是本文的做法是训练一个小网络T-net,用这个T-net去预测一个放射变换矩阵(affine transformation matrix),然后让其与原坐标向量进行相乘。这样得到的结果不仅达到了刚性变换的目的,还保持了刚性变换的不变性,虽然这个T-net很小,但是它和大的网络的网络结构相似,由很多基本的小的单元组成,这些小的单元包括独立的点特征提取层,最大池化层和全连接层。
回过头来再看网络的整体结构,我们一共用了两次T-net去保持矩阵的刚性变换不变性,刚才是阐述了作用坐标空间的T-net,也就是第一次用到的T- net,而第二次用到T-net是作用在特征空间,事实上,特征空间同样可以用到T-net去做保持刚性变换的不变性,但是特征空间的维度要比坐标空间多,需要考虑更多的问题,网络优化的难度也会变大,因此需要加一个正则化公式到最终分类层softmax训练的损失上,具体来说是 L r e g = ∣ ∣ I − A A T ∣ ∣ F 2 L_{reg} = ||I - AA^{T}||_{F}^{2} Lreg=∣∣I−AAT∣∣F2,A就是通过T-net预测出来的特征转换矩阵,还可以人为约束特征转换矩阵是一个正交矩阵,这个操作可以避免输入内容的信息损失,这样优化过程就变得更加稳定,我们的网络也有一个更好的性能表现。
对比试验结果在5.2.2节
本节主要是说明两个定理
逼近定理:这个定理针对的还是4.2.1节的平衡策略,也就是说,这个定理证明了MAXPOOLING函数可以当作是一个平衡函数。定理的内容是说
假 设 f 函 数 是 一 个 定 义 在 H a u s d o r f f d i s t a n c e 的 连 续 的 集 函 数 f : χ → R , χ 是 一 个 点 集 的 定 义 域 , R 是 一 维 实 数 空 间 值 域 , 那 么 有 如 下 结 论 : ∀ ϵ > 0 , 必 然 存 在 一 个 连 续 集 函 数 h 和 一 个 平 衡 函 数 g ( x 1 , x 2 , . . . , x n ) = γ ∘ M A X 使 得 对 于 任 意 的 S ∈ χ , 有 ∣ f ( S ) − γ ( M A X x i ∈ S ( h ( x i ) ) ) ∣ < ϵ 其 中 S = { x 1 , x 2 , . . . , x n } , γ 是 一 个 连 续 函 数 , M A X 是 最 大 池 化 操 作 假设f函数是一个定义在Hausdorff \ distance的连续的集函数f: \chi \rightarrow R,\chi是一个点集的定义域,R是一维实数空间值域,\\ 那么有如下结论:\forall \epsilon >0,必然存在一个连续集函数h和一个平衡函数g(x_1, x_2, ..., x_n)=\gamma \circ MAX使得对于任意的S\in \chi,有 \\ \mid f(S) - \gamma(MAX_{x_i \in S}(h(x_i)))\mid < \epsilon \\ 其中S=\{x_1, x_2, ..., x_n\},\gamma是一个连续函数,MAX是最大池化操作 假设f函数是一个定义在Hausdorff distance的连续的集函数f:χ→R,χ是一个点集的定义域,R是一维实数空间值域,那么有如下结论:∀ϵ>0,必然存在一个连续集函数h和一个平衡函数g(x1,x2,...,xn)=γ∘MAX使得对于任意的S∈χ,有∣f(S)−γ(MAXxi∈S(h(xi)))∣<ϵ其中S={x1,x2,...,xn},γ是一个连续函数,MAX是最大池化操作
那么首先来理解一下这个定理,定理种的f函数就是整个PointNet网络,h函数就是对于每一个点集中的点做的特征提取函数,MAX对应平衡策略最大池化层的操作,γ 是最后的分类层训练的多层感知机。同时证明了最大池化层的维数越大,提取的信息越为精确。
关于Haudorff Distance
Hausdorff距离是一个衡量两个点集之间的距离的一个函数,它的定义是这样的,
H a u s d o r f f = M A X { M A X x ∈ X M I N y ∈ Y d ( x , y ) , M A X y ∈ Y M I N x ∈ X d ( x , y ) } Hausdorff = MAX\{MAX_{x\in X} MIN_{y \in Y}d(x,y), MAX_{y\in Y} MIN_{x \in X}d(x,y)\} Hausdorff=MAX{MAXx∈XMINy∈Yd(x,y),MAXy∈YMINx∈Xd(x,y)}
具体的操作过程是这样的,首先对于X集合中的所有点xi,分别求出xi到Y集合中的每个点的距离,再将所有的xi取出来,求它们的最小值,对于Y集合同样这样做,最终求它们两个的最大值当成最终的结果。Hausdorff距离的意义是用来衡量两个点集之间任何距离点的最大的不匹配度,对于X集合来说,得到X集合的距离最大值之后,便有,任意X中的点以该半径画圆,至少能有一个Y集合中的点能落在该圆中,也就是说,其实Hausdorff距离不关心是否每个点都落在该圆中,只要有一个点落在这个圆中即可,也印证了两个点集的最大不匹配度。
瓶颈定理:这个定理与整个网络的鲁棒性有关,实验测试参考5.2.3节,定理的内容是说
假 设 用 u 函 数 来 代 表 对 称 函 数 , 因 此 有 u = M A X x i ∈ S ( h ( x i ) ) , 函 数 u 定 义 在 χ → R K , χ 是 一 个 点 集 的 定 义 域 , R K 是 K 维 实 数 空 间 值 域 , f 则 可 以 表 示 成 f = γ ∘ u , 那 么 有 如 下 两 个 结 论 : ① ∀ S , ∃ C S , N S ⊆ χ , f ( T ) = f ( S ) , i f C S ⊆ T ⊆ N S ; ② ∣ C S ∣ ≤ K . 假设用u函数来代表对称函数,因此有u=MAX_{x_i \in S}(h(x_i)),函数u定义在 \chi \rightarrow R^K,\chi是一个点集的定义域,R^K是K维实数空间值域,\\ f则可以表示成f = \gamma \circ u,那么有如下两个结论:① \forall S, \exist C_S, N_S \subseteq \chi, f(T) = f(S) ,if C_S \subseteq T \subseteq N_S; ②\mid C_S \mid \leq K. 假设用u函数来代表对称函数,因此有u=MAXxi∈S(h(xi)),函数u定义在χ→RK,χ是一个点集的定义域,RK是K维实数空间值域,f则可以表示成f=γ∘u,那么有如下两个结论:①∀S,∃CS,NS⊆χ,f(T)=f(S),ifCS⊆T⊆NS;②∣CS∣≤K.
第一个定理表明,对于输入点集S来说,如果发生一定程度的信息丢失,或者一定程度的噪声干扰,也不会影响分类标签和分割标签的预测,只要它不超过信息丢失的临界点Cs(Critical Points)和噪声干扰的临界点Ns(Upper-bound Points),这也表明了网络的鲁棒性,能够忍受一定程度的信息丢失和噪声干扰;第二个定理表明,Cs中包含的点的个数小于K个,比最大池化层的维数还要低,也就是说网络对于点集S的预测只依赖于几个典型的特征点Cs,同时K被称作f函数的瓶颈维度。
一共可以应用在三个方面有相关的应用:3D object classification, object part segmentation and semantic scene segmentation ,可以理解成点云分类,局部分割和全景分割,前面已经介绍过了。
3D物体分类:用到了ModelNet40 shape classification数据集,一共有12311个CAD模型,人工分成40个类别,9843的训练集,2468测试集。
在输入数据的时候,我们直接输入原始点云数据,具体操作是在网格面上,根据网格的面积均匀采样1024个点,然后把它们归一化成一个单位球体。在训练过程中,我们也对点云做了数据增强,通过随机沿上轴(upper-axis)对物体进行旋转和通过一个平均值为0,标准差为0.02的高斯噪声对每一个点的位置进行抖动。
下表中列出了我们的模型的实验对比图,我们的这个PointNet与之前的网络进行了横向的对比,也与我们自己的baseline网络基本网络做了对比,baseline是对传统特征进行了提取。结果显示,不管怎样我们的网络的效果都比较好,而且可以并行在CPU上运行,只有一个例外,就是MVCNN战胜了我们的网络,原因是MVCNN这个网络是基于多视角的方法,我们认为我们的网络不如他们的原因是损失了一些可以被渲染图像捕获的精细几何细节。
3D目标区域分割:这是一个细粒度的很有挑战性的深度学习课题,是说什么意思呢,给定一个物体,比如一把椅子,要把椅子的每一个部分精确的分割出来。
这个任务用到的是ShapeNet part data set,一共有16881个shape,分成16个种类,这16个种类一共有50个part,大部分的shape是由二至五个part组成的,真实标签表在了每一个shape的采样点上面。
我们把这个任务看成了一各点的分类任务,评价标准是每一个点的mIOU。比如说对于一个shape S,它的类别是C,那么我们计算这个S中的每一个part的IOU,再把它平均,这样就得到了这个shape S的mIOU,如果要计算类别C的mIOU,那么就要把每一个类别是C的shape的mIOU进一步平均。
下表是这个实验的对比图,我们的网络在大部分种类上都超过了其他网络,平均提升2.3%。
为了试验鲁棒性,我们还在模拟的Kinect上面进行了实验,对于数据集的每一个shape,我们用Blensor Kinect Simulator重新从6个随机视角生成一个不完全的点云图,然后用同样的网络结构去训练完整的或者不完整的点云图,得到的结果只相差了5.3%的mIOU,下图显示的是在完整点云图和不完整点云图上做分割的结果对比。
语义场景分割:前面的区域分割可以很容易的拓展到全景分割中,只是把标签从object part labels改成了semantic object classes。
用到的数据集是Stanford 3D semantic parsing dataset,这个数据集是用Matterport 扫描仪扫描出来的一个6个区域271个房间,每一个扫描到的点都标注了1个语义标签,一共13个类别。在训练数据的准备中,首先是把点按照房间进行分类,然后再对一个房间进行采样,采样成1m * 1m的block,然后去预测每一个block的类别,每一个点用一个9维的向量来表示,XYZ,RGB和一个归一化的在房间中处的位置,训练的时候是采样了每一个block中的4096个点,测试的时候是测试了一个block的所有的点,而且用到了k-fold的训练策略。
首先用我们的网络和我们的baseline进行比较,我们的baseline除了使用原来的9维的向量数据外,还包括另外的3维数据,local point density, local curvature and normal 然后用了一个MLP对其进行分类,结果再下表中,两者性能的差别较大,下图是一个结果的可视化。
在这个基础之上,我们又建了一个3D目标检测系统,对比算法是基于滑动形状算法,后处理中用到了CRF,用了一个SVM分类器,训练数据是体素格子中的局部几何特征和全局房间纹理特征。对比看到,我们的算法大幅度领先。
在4.2.1小节中我们提到了如何处理无序的输入数据集,提到了三种方法,最后选择的maxpooling方法,这一小节就是证明了这个选择很正确。
从下表中可以看到T-net的加入使有效的,提升了0.8%的准确度,如果再加上之前提到的正则化的手法,将会取得更好的效果。
在此实验中,用到了一些损失点云信息做测试,当损失50%的点的时候,准确度仅仅下降了2.4%至3.8%;而对于增加一些随机点的情况,鲁棒性依然很好,我们做了两个实验一个是特征设成3维坐标形式,另一个是三维坐标形式外加一个点密度,事实证明,即使有20%的外部点参与,准确度依然可以达到80%以上。
在图7中,可以很清楚的看到原始点集,重要点集(critical point sets)和上限点集(upper-bound shapes)的对比情况,其中重要点集Cs主要描述出了shape的主要骨架,而上限形状集 Ns则描述出了最大可能的和输入点云有着相同全局特征的点集,Cs和Ns的可视化反映出了整个网络的鲁棒性很强,也解释了失去一些点并不会对网络产生多么大的影响。
对比算法为MVCNN和Subvolumn两种网络,PointNet和上述两种算法的精确度都很高,但PN的时间复杂度和空间复杂度都是O(N),是线性增长的,而另外两个网络由于包含卷积层,都是呈平方增长的。
时间复杂度上面,PointNet可以每秒处理超过100万个点的图像分类,大概是1千个物体的检测,或者也可以在全景分割上每秒处理2间屋子,分别领先上述两种算法141倍,8倍;空间复杂度上面,PN只用了350万参数,领先两种算法17倍,4倍;
训练用到的是1080X GPU和tensorflow,实时性上面有了很强的保障。其中PointNet (vanilla) 是表示去掉T-net后的PointNet网络,更为轻便。
这篇论文提出了一种可以直接运用点云数据的深度神经网络PointNet,可以处理物体分类,物体局部分割和语义全景分割等任务,性能等价或者超过现有的网络结构,我们同时还分析了这个网络,给出了网络的可视化,帮助读者理解这个网络。