PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
在表述PointNet++之前,其实列出题目可以更好的表述这篇paper,PointNet++其实就是PointNet的分层版本,并且顺便解决了由于分层带来的系列问题以及PointNet遗留的问题。
在PointNet中,一个显著的问题是对于局部特征问题的处理,在原PointNet中,对于part segmentation以及scene semantic sparsing,即需要得到每个点的得分时,处理办法是直接将点特征与全局特征结合到一块进行处理,忽略了局部特征这一中间步骤,例如在一个场景中,我们先识别出椅子是椅子,桌子是桌子等这些局部特征,是否在最终对每个点进行分类时,是否会更加准确呢,所以PointNet++采用了分层的结构用于处理局部特征,用论文中的词来描述就是可以更好的处理fine-grained patterns,而在PointNet中,并没有进行分层处理,所以PointNet++对这一部分工作进行了完善。
其次还有一点背景知识是,点云数据的一个特征是数据密度不同,体现出近多远少等问题,而在密度不同的情况下,使用统一的模板处理这些数据显然是不对的,基于此,PointNet++的作者提出了密度适应的网络结构。
而综上,PointNet++的主要就是在PointNet的基础上,加入局部特征提取以及在进行局部分割时,在网络结构中加入密度适应使得分割更加准确合理的处理点云数据的论文,而事实上,论文也就这两个问题展开,当然PointNet++在标准数据集的表现是better than state-of-the-art。
问题1: 如何进行局部划分?
对数据集进行划分,提取局部特征,然后不断抽象,提取更高维的特征,是PointNet++的基本思路,那么首先的问题是如何定义局部,PointNet++给出的解决思路是使用点球模型,从全部数据集中选出若干质心点,然后选取半径,完成覆盖整个数据集的任务。在质心点的选取上,采用的是FPS算法,即随机选取一个点,然后选择离这个点最远的点加入到结果集中,迭代这个过程,直到结果集中点的数量达到某个给定值,在PointNet++中,很常见的一个词是metric,即度量,PointNet++中的很多东西都是依赖度量的,而在PointNet中,其实对于度量并不是很强调,或者细究的话都有可能不需要是度量空间。在读到中心点的集合后,第二个问题是如何选择半径,其实半径的选取是个很麻烦的事,在点云数据集中,有些地方比较稠密,有些地方比较稀疏,稠密的地方必然半径要小,而稀疏的地方必然半径要大,不然可能都提取不出什么特征,此时引出第二个问题——密度适应,若半径确定,即局部大小确定,此时训练的模板大小也就确定了。
问题2: 密度适应问题
论文中提到的处理密度适应的方法有两种,方法1为MSG,即把每种半径下的局部特征都提取出来,然后组合到一起,作者在如何组合的问题上提到了一种random dropping out input points的方法,存在两个参数p和q(原文中为theta),每个点以q的概率进行丢弃,而q为在[0,p]之间均匀采样,这样做,可以让整体数据集体现出不同的稠密性和均匀性。这儿论文中没有提到但存疑的问题是实验时是在不同random dropping out input points后得到的points上得到不同特征,根据最终点的分类得到的组合策略抑或是其他方式?
先抛开这个问题,MSG有一个巨大的问题是运算的问题,然后作者经过思量,提出we can avoid the feature extraction in large scale neighborhoods at lowest levels,因为在低层级处理大规模数据,可能模板处理能力不够,感受野有些过大,基于此,作者提出了MRG。
MRG有两部分向量构成,分别为上一层即Li-1层的向量和直接从raw point上提取的特征构成,当点比较稀疏时,给从raw point提取的特征基于较高的权值,而若点比较稠密,则给Li-1层提取的向量给予较高的权值,因为此时raw point的抽象程度可能不够,而从Li-1层的向量也由底层抽取而得,代表着更大的感受野。
上图为MSG和MRG的图像话表示,可见 MRG为分层结构。
最后对整体网络结构和如何得到每个点的分数(即segmentation相关问题)进行介绍。
在整体网络结构中,首先进行set abstraction,这一部分主要即对点云中的点进行局部划分,提取整体特征,如图可见,在set abstraction中,主要有Sampling layer、Grouping layer、以及PointNet layer三层构成,sampling layer即完成提取中心点工作,采用fps算法,而在grouping中,即完成group操作,采用mrg或msg方法,最后对于提取出得点,使用pointnet进行特征提取。在msg中,第一层set abstraction取中心点512个,半径分别为0.1、0.2、0.4,每个圈内的最大点数为16,32,128。之后几层如代码所示,在classification的处理上,与pointnet相似,不再详述。
最后提及的一点是对于每个点的打分问题,即segmentation部分
pointnet++对于每个原始点的得分采用了插值及回溯的方式,对于l - 1层的点,它有l层点插值后与在set abstraction时得到的特征进行1 * 1的卷积,最终得到l - 1层的点的值,一直回溯,最终得到原始点的score。插值公式如下:
其中采用knn取最近的k个,论文中提及k一般取3,p取2,此处距离即为相应点的权值,显然距离与权值大小成反比。
-——————–
作者:sunfei05
来源:CSDN
原文:https://blog.csdn.net/sunfei05/article/details/80451808
版权声明:本文为博主原创文章,转载请附上博文链接!