> 文章列表 > 3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

PointNet

3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

PointNet发布于2017CVPR。

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


题外话

PointNet对于3D点云分割的意义有点像FCN对语义分割的意义。PointNet不同以往的voxel-based的模型,它试图通过直接对点云数据中每一个点进行处理,来分析点云中每一个点的信息,提取特征,做分类或分割的task。也就是说,PointNet为点云分割提供了另一条道路,即point-based的方法


1引言

老生常谈,每一种数据结构都有其存在的道理和意义,点云(Point Cloud)也是如此,对于真实世界,光靠简单的2D RGB图片信息并不能很好的理解。而3D 结构则能够更好的去重现真实世界的场景,因此对于3D数据的处理也是未来的一个重要的发展方向。

通常,点云是一个无序的点集。这些点集分布在空间中,就如同云一样,形成了我们能看到的一些物体。当然,需要注意,这里的无序指的是点云中的点可以被保存在这个点集文件中的任意位置,只要你将点集读取出来并映射在空间中,这个点还是原来空间中的那一个点,它的空间位置信息并不会因为你把它保存在什么位置而改变。不同于点云,2D图像中的每一个点的位置就是固定的,改变了点的位置,图像就自然改变了。

在这里我们就引入了点云的一个特性,也就是无序性。当然,点云还有其他特性:一是旋转、平移不变性,也就是点云可以旋转任何角度、平移任何距离,它整体还是同一个点云,点与点之间的相对位置信息是不变的;二是点的交互性:点云中的点并不是孤立的,每一个点都会和周围点进行交互,即空间中的点在小范围内形成有意义的子集。就像很多点可以集成变成一把椅子这样。

在这里插入图片描述

1.1 voxel-based和point-based的优缺点

正如我们上面提到,点云是无序的,当我们输入一个点云,想对它实现semantic segmentation任务时,该如何确定点与点之间的相对关系呢?有了这一疑问,voxel-based的方法提出将点云分割为一个又一个规则的voxel,这样,相邻的点就会被归类到同一个voxel中。然后简单的取一个voxel中所有点的平均xyzrgb,用来指代这个voxel的特征。这种方法变相降低了计算复杂度,并且将点云中所有点的相对关系给确定了。之后,再用经典的CNN卷积即可实现点云的特征处理。

但是,我们也很容易能想到,简单的将一些点归类到一个voxel中并赋予其平均值作为特征,这就会导致一些重要的点被忽略,同时也会导致最终结果误差增大。

而point-based的方法,则是保留了所有点的原始特征,直接对所有点进行处理,但是这里还是没有提到解决点云无序的问题。在PointNet中,使用了Max-Pooling的方法来解决这一问题。这也很好理解,既然事先输入的点集是无序的,而在空间中又是固定位置,那只需要进行Max-Pooling操作即可保留点云的相对位置信息。同时又可以将点的特征聚合起来,形成全局特征。

个人认为,这一思想类似于点云的sub-sampling。你对一个点云下采样两倍、四倍等等,它还是能保留一个人能直观分辨的结果。只不过Max-Pooling是对特征进行处理,sub-sampling是对点进行处理。

2 PointNet结构

3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

Point的模型图也十分简洁明了,几个关键地方为input transform和feature transform中的T-Net、max pool、local和global feature的融合。

2.1 使用对称函数来解决无序性问题

由于点云的数据是无序的,那么就得想让模型来适应这个无序的数据或者让数据变得“有序”。那么解决这一问题主要有三个方法

  1. 将点云中的点进行排序,使其成为一种规范的结构。
  2. 用一个RNN网络来学习点云数据的“排列顺序”。
  3. 使用对称函数来汇总每一个点的信息。

对于第一个方法,排序或许是个简单的方法。至少我们或多或少接触过冒泡、归并等等排序算法,但是,点云是三维空间中的数据结构,并不是简单的一个数字比大小。在高维空间中,想要保证排出来顺序是有序的,这是比较难办到的事情。相当于将一个高维空间映射成一个射线,反过来,还得保证这条射线能够还原这个高维空间,对于人类而言,貌似有点困难。即便排成功了,如果其中有个别点不稳定,整个映射结构可能就会奔溃。

对于第二个方法,作为循环网络,RNN对于序列数据的敏感度是远强于CNN的。不过对于一个巨大的点云数据,动不动就是几十万的点集,一个小小的RNN可能难以获得一个较好的鲁棒性。当然,在文章的结尾,作者也比较了使用RNN的方法和PointNet的方法之间的效果差异。

不同于以上两点,使用一个对称函数来汇聚信息或许是一个更为高效简洁的方法。这里的对称函数可以理解为对输入顺序不敏感的操作。比如加、乘、池化pooling。

f({x1,…,xn})≈g(h(x1),…,h(xn))f\\left(\\left\\{x_{1}, \\ldots, x_{n}\\right\\}\\right) \\approx g\\left(h\\left(x_{1}\\right), \\ldots, h\\left(x_{n}\\right)\\right) f({x1,,xn})g(h(x1),,h(xn))

其中x1、x2...xnx_{1}、x_{2}...x_{n}x1x2...xn为输入的点,ggg则是一个对称函数,在模型中就是Max-Pooling,hhh则是一个MLP。也就是通过MLP和MaxPooling来拟合函数fff。至少,在经验上和实践上,PointNet的这个方法是成功的。

在文章最后,作者设计实验比较了几种方法来解决点云无序性问题得到的accuracy结果。

通过对比RNN、LSTM的输入时排序和对称函数如Attention sum、Average pooling、MaxPooling的方法,结果证明Max Pooling效果是最好的。

注:表的上半部分为输入时通过循环网络排序,下半部分则是使用对称函数进行信息聚合。
3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

2.2 Local和Global的特征聚合

经过对称函数MaxPooling输出出来的特征为聚合了每个点信息的全局特征,形成了一个特征向量[f1,...,fk][f_1, ..., f_k][f1,...,fk],在图中也就是长度为1024的global feature向量。

3D点云分割系列1:PointNet,从Voxel-base到Point-base的进阶之路

对于分类任务而言,这个global feature已经足够了,只需要再其后面添加一个简单的SVM或者MLP即可完成点云分类的task。但是,对于分割而言,global feature是显然不够的,这一点在2D的图像分割已经证明了(这也是Unet为什么好的原因)。因此,需要将Local和Global的Feature进行相应的融合。在这里,融合方式也十分简单,只需将两个特征进行连接操作(concat),然后将其输入到MLP中反馈给每一个点,既可以根据这个合并好的特征从点云中提取新的特征。当完成这一步时,每一个特征中都会包含点云的局部和全局信息。这在2D语义分割中是比较常见和有效的操作。

2.3 特征对齐网络

对于一个点云而言,我们可以将其看成一个刚体(也就是不会产生形变,无论怎么旋转平移,它都会保留原始形状)。那么,点云进行刚性变化(旋转平移等),点云本身不变,其标签自然也不变。因此,我们希望PointNet能够学习到这种变换,或者说,希望PointNet能够认出旋转任意角度、平移任意距离的点云物体。

有一个简单的方法就是,在输入点云之前,事先将点云数据按照一定的规范,将点云旋转、平移到相同的角度和位置。类似于对2D图像进行一个resize到统一大小的操作。

在这里,我们还得先理解如何对点云数据进行刚性变化。其实十分简单,对于3维的物体,我们想对其进行平移、旋转,只需要相应乘上一个平移矩阵、旋转矩阵即可。

在这里,作者通过一个T-Net来学习这种平移、旋转关系,也就是说让模型自己去拟合这个平移矩阵、旋转矩阵。

同时,作者将这一思想拓展到了点云的特征空间,用同样的方法对特征进行对齐,即feature transform。可以在点特征上插入另一个对齐网络,并预测一个特征变换矩阵来对齐来自不同输入点云的特征。不过,特征空间的变换矩阵比空间变换矩阵的维度高得多,这大大增加了优化的难度。因此,作者在训练的损失计算中加入了一个正则化项,以此将特征转换矩阵限制在接近正交矩阵的范围内。

Lreg=∥I−AAT∥F2L_{reg} = \\parallel I-A A^T \\parallel^{2}_F Lreg=∥IAATF2

其中,AAA就是T-Net学习到的变换矩阵。

3 总结

总结一下,PointNet为3D点云分割、分类开拓了一条新的道路,也就是Point-base的方法。从对体素voxel的处理转为对点point进行直接处理,提高了效率,同时也获得十分优秀的效果。

PointNet中出彩的地方包括使用T-Net来学习点云的刚性变换、使用MaxPooling来解决点云输入无序性的问题。