参考PointNet论文和代码详解
原作者的视频报告
与传统的3DCNN分层提取特征相比,PointNet属于全局特征学习,只对单个点或者所有点进行操作,没有局部信息,对精细的特征难以学习,例如分割的时候会有所缺陷,此外在平移不变性上也会有所缺陷。
因此,在原PointNet的基础上进行分层级的迭代学习,保留了置换不变性和几何不变性
具体讲解一下这个过程,对于一组点云,首先圈出一组局部点云,根据这组点云数据利用PointNet生成一个高维点,因此根据所有输入点云可以得到一个简化的特征点云。这个操作称为set abstraction。
重复这个set abstraction就可以得到一个层级的迭代学习,特征所包含的区域也会越来越大。
在Introduction部分,作者首先指出PointNet的思想是对每个单独的点进行空间编码然后将所有单个的点特征聚集成为一个全局点云特征。因此点云并没有捕获局部特征的能力。而CNN在层级结构中,低层感受野较小而高层感受野较大,就可以有效捕获局部特征。
因此,作者引入了分层的神经网络PointNet++,它的思想很简单,首先根据度量方式将原始点云划分成重叠的局部区域,然后在小区域里面捕捉局部特征,然后将这些精细的局部特征组合起来,形成新的特征点云,继续之前的划分和提取操作,这样就形成的层级的特征提取。
在这之中我们会注意到两个问题,首先是怎么去得到点云分区,其次怎么提取局部特征。
提取局部特征使用的是PointNet,因为他可以处理置换不变性和几何不变性的问题,从而让PointNet++仍然具有这两个性质。
点云分区其实就是需要找到每个分区球的质心和尺度,质心的选择使用的是FPS算法。为了选择合适的尺度,作者考虑到特征尺度的纠缠性和输入点集的不均匀性,这个问题会比较困难,传统CNN认为卷积核越小效果越好,但是在点云中恰好相反,因为尺度太小在采样缺乏的区域,包含的点数会很少,从而导致鲁棒性较差。
PointNet++利用多尺度上利用邻域能够实现鲁棒性和细节捕获的效果,同时在训练的时候利用dropout来增强鲁棒性。
PointNet
与点云只对整个点云集使用单一的max pooling操作相比,我们的新结构通过层级的操作逐步提取出越来越大的局部区域。
层级结构通过一组set abstraction操作实现,每一个set abstraction都是由三个基本操作组成的:Sampling layer从输入点中选出一系列的点组成局部区域的质心;Grouping layer 确定尺度,找到质心的相邻点,构建局部区域;PointNet layer对每个局部区域提取特征。
问题:实际场景中的不均匀采样很常见,但是如果为稠密区域提取的特征可能由于稀疏区域采样数目不够而遭到破坏,而为稀疏区域训练的模型可能无法提取稠密区域的细节特征。
因此提出了一种自适应的PointNet,能够根据采样密度的改变,学习组合来自不同尺度区域的特征,称为PointNet++。
与之前所说的单个尺度的分组和特征提取有所区别,PointNet++中,每个abstraction层会提取局部的多个尺度,然后根据局部点云的密度将他们智能组合。根据局部区域分组和不同尺度特征的组合,提出了两种密度自适应层:
对于分割任务,希望达到的其实时对于所有原始点的特征,但是在set abstraction中,输入点云都是经过子采样的。有一个方法是在set abstraction中始终将原始点云作为输入,但是这样消耗很大。另一个方法就是将特征从子采样点传播到原始点。