Pointnet++
文章信息
标题:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
作者:Charles R. Qi
来源:NIPS 2017,arxiv1706.02413
代码:官方(tf) / Pytorch / PyTorch(sshaoshuai)
动机
Pointnet在捕获点之间的关系时受到限制,它只能学习全局特征或单点特征,对大规模场景的通用性较差。
整体思想
首先选取一些比较重要的点作为每一个局部区域的中心点,然后在这些中心点的周围选取k个近邻点。再将k个近邻点作为一个局部点云采用pointnet网络来提取特征。
框架
1、改进特征提取方法
pointnet++使用了分层抽取特征的思想,把每一次叫做set abstraction,分为三部分——采样层、分组层、特征提取层。
- 采样层:为了从稠密的点云中抽取出一些相对较为重要的中心点,采用FPS(farthest point sampling),相对于随机采样,这种采样算法能够更好地覆盖整个采样空间。
- 分组层:在上一层提取出的中心点的某个范围内寻找k个近邻点组成patch。
(为了提取一个点的局部特征,首先需要定义这个点的“局部”是什么。一个图片像素点的局部是其周围一定曼哈顿距离下的像素点,通常由卷积层的卷积核大小确定。同理,点云数据中的一个点的局部由其周围给定半径划出的球形空间内的其他点构成。组合层的作用就是找出通过采样层后的每一个点的所有构成其局部的点,以方便后续对每个局部提取特征。)
- 特征提取层(feature learning):因为PointNet给出了一个基于点云数据的特征提取网络,因此可以用PointNet对组合层给出的各个局部进行特征提取来得到局部特征。值得注意的是,虽然组合层给出的各个局部可能由不同数量的点构成,但是通过PointNet后都能得到维度一致的特征(由上述K值决定)。
- 特征提取层:将这k个点通过小型的pointnet进行卷积和池化,提取的特征作为此中心点的特征,再送入下一个分层继续。这样每一层得到的中心点都是上一层中心点的子集,并且随着层数加深,中心点的个数越来越少,但是每一个中心点包含的信息越来越多。
2、解决点云密度不同的问题
由于采集时会出现采样密度不均的问题,所以通过固定范围选取的固定个数的近邻点是不合适的。pointnet++提出了两个解决方案。
- 方案一:MSG(多尺度分组)
对不同尺度的局部提取特征并将它们串联在一起,得到一个多尺度的新特征。但对于每一个中心点都需要多个patch的选取与卷积,计算开销很大。 - 方案二:MRG(多分辨率分组)
为了解决MSG计算量太大的问题,作者提出了MRG。新特征通过两部分连接起来。此种方法在某一层对每个局部提取到的特征由两个向量串联构成——第一部分由其前一层提取到的特征再次通过特征提取网络得到,第二部分则通过直接对这个局部对应的原始点云数据中的所有点进行特征提取得到。
并且,当点云密度不均时,可以通过判断当前patch的密度对左右两个特征向量给予不同权重,以此达到减少计算量的同时解决密度问题。例如,当patch中密度很小,左边向量得到的信息就没有对所有patch中点提取的特征可信度更高,于是将右特征向量的权重提高。
参考
[1] 作者的poster
[2] 三维深度学习之pointnet系列详解(二)
[3] 代码解析