PointNet++实现第2步——PointNet++理解
一、PointNet的局限性(PointNet++出现的原因)
对每一个点映射到高维空间,再通过max结合。由于其网络直接暴力地将所有的点最大池化为了一个全局特征,因此局部点与点之间的联系并没有被网络学习到。PointNet本质上要么时对同一个进行操作,要么是对全局的点进行操作,所以PointNet实质上时没有局部概念的,这样子,会缺失一些精细的特征。在分类和物体的Part Segmentation中,这样的问题还可以通过中心化物体的坐标轴部分地解决,但在场景分割中,这就导致效果十分一般了。
1.PointNet缺失局部特征
2.PointNet有平移不变性的缺陷
关于平移不变性,此介绍详细可见【转载博文】。这里,我将其种有关的部分放到这里。
在欧几里得几何中,平移是一种几何变换,表示把一幅图像或一个空间中的每一个点在相同方向移动相同距离。比如对图像分类任务来说,图像中的目标不管被移动到图片的哪个位置,得到的结果(标签)应该是相同的,这就是卷积神经网络中的平移不变性。平移不变性意味着系统产生完全相同的响应(输出),不管它的输入是如何平移的 。
(平移不变性质)图来源于:https://blog.csdn.net/voxel_grid/article/details/79275637?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
(平移等变性质)图来源于:https://blog.csdn.net/voxel_grid/article/details/79275637?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
二、PointNet++
1.层级点云特征学习
核心思想:在局部的区域区域内,重复的,迭代性使用PointNet。由于局部具有置换不变性,所以整体也具有局部不变性。PointNet++这个核心思想主要借鉴了CNN的多层感受野的思想。CNN通过分层不断地使用卷积核扫描图像上的像素并做内积,使得越到后面的特征图感受野越大,同时每个像素包含的信息也越多。
下面以2D进行解释:
如下图,先找到一个局部的区域,我们想学习小区域的特征,因为我们不想受到整体平移的影响,所以,我们第一步是先把小区域的部分转移到一个局部坐标系下,这样整体的点云不会影响这个局部区域。第2步,在这个小区域内再使用PointNet来提取它的特征,得到一个新的点,不仅包含在整个点云的位置(X,Y),还有向量特征(F),F表示其几何形状。
重复上述操作,可以得到一组新的点(新的点集,该点集数量上少于原始点集,但每一个点表示周围一个区域的几何特点)。文章将这样的一个层成为Set Abstraction。:
1.1. Set Abstraction组成简介
点集的特征提取即Set Abstraction由三部分组成,分别为Sampling layer、Grouping layer、Pointnet layer。
(1) Sampling:利用FPS(最远点采样)随机采样点
(2)Grouping:利用Ball Query划一个R为半径的圈,将每个圈里面的点云作为一簇
(3)PointNet: 对Sampling+Grouping以后的点云进行局部的全局特征提取
1.2.Sampling layer
采样层在输入点云中选择一系列点,由此定义出局部区域的中心。采样算法使用迭代最远点采样方法 iterative farthest point sampling(FPS)。
其中,FPS为先随机选择一个点,然后再选择离这个点最远的点作为起点,再继续迭代,直到选出需要的个数为止。
相比随机采样,能更完整得通过区域中心点采样到全局点云。
图来源于:深蓝学院公开课,点云上的卷积神经网络及其部分应用-李伏欣老师
1.3. Grouping layer
目的是要构建局部区域,进而提取特征。思想就是利用临近点,并且论文中使用的是neighborhood ball,而不是KNN,是因为可以保证有一个fixed region scale,主要的指标还是距离distance。
图来源于:深蓝学院公开课,点云上的卷积神经网络及其部分应用-李伏欣老师
1.4. PointNet layer
在如何对点云进行局部特征提取的问题上,利用原有的Pointnet就可以很好的提取点云的特征,由此在Pointnet++中,原先的Pointnet网络就成为了Pointnet++网络中的子网络,层级迭代提取特征。
2.分类网络
分类网络只要通过这样逐层的提取局部特征,最后总结出全局特征就可以输出分类结果了
3.分割网络
这一部分强烈pick这个博主的解释,太精彩了!!!【点此此处获取】
4.非均匀采样密度下的鲁棒特征学习
通过上述方法实现的PointNet++虽然在点云上的分类和分割效果有了一定的提升,但是作者发现,其在点云的缺失鲁邦性上似乎变得更差了。其原因是因为激光收集点云的时候总是在近的地方密集,在远的地方稀疏,这种不均匀性给点集特征学习带来了很大的挑战——【在密集数据中学习到的特性可能无法推广到稀疏采样区域。当然,为稀疏点云训练的模型可能无法识别细粒级高精度的局部结构。】
因此当Sampling和Grouping的操作在稀疏的地方进行的时候,一个点可能代表了很多很多的局部特征,因此一旦缺失,网络的性能就会极大的受影响。
作者对其的改进是通过引入了不同分辨率/尺度的Grouping去对局部做PointNet求局部的全局特征,最后再将不同尺度的特征拼接起来;同时也通过在训练的时候随机删除一部分的点来增加模型的缺失鲁棒性。
在论文中,作者提及两种方案:
- 多尺度组合(multi-scale grouping, MSG)
- 多分辨率组合(multi-resolution grouping, MRG)
方案一:多尺度分组MSG
如上图(a)所示,比较直观的思想是,在每一个分组层都通过多个尺度来确定每一个中心点的邻域范围,并经过pointnet提取特征之后将多个特征联合起来,得到一个多尺度的新特征。 很明显,通过上述做法,对于每一个中心点都需要多个patch的选取与卷积,其计算量的增加也是很显著的。
方案二:多分辨率分组MRG
为了解决MSG计算量太大的问题,作者提出了MRG。。如上图(b)所示,类似的,新特征通过两部分连接起来。左边特征向量是通过一个set abstraction后得到的,右边特征向量是直接对当前patch中所有点进行pointnet卷积得到。并且,当点云密度不均时,可以通过判断当前patch的密度对左右两个特征向量给予不同权重。例如,当patch中密度很小,左边向量得到的信息就没有对所有patch中点提取的特征可信度更高,于是将右特征向量的权重提高。以此达到减少计算量的同时解决密度问题。