PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space
Qi C R, Yi L, Su H, et al. Pointnet++: Deep hierarchical feature learning on point sets in a metric space[J]. Advances in neural information processing systems, 2017, 30.
最初的PointNet[2]没有捕捉到点的局部结构特征,限制了细粒度和复杂场景的识别、泛化能力。PointNet++则引出了一个分层结构神经网络,它在多级结构的点云中递归地应用PointNet。
由于在均匀点云密度上训练的网络在非均匀密度点云上性能极大的削弱,PointNet++提出了一个新颖的学习网络层,可以自适应整合多种尺度的特征。
实验表明PointNet++能够高效且鲁棒的学习到点云的深度特征,并且效果达到目前最优。
Introduction
PointNet基本思想是学习到每个点的空间编码,并且整合所有独立的点的特征成一个全局点云特征。PointNet没有捕捉局部结构特征,而局部结构特征是卷积网络成功的的关键之一。CNN可以通过规则网格的输入,沿着多分辨率的层级结构,以逐渐增大的尺度来捕捉特征。这种能够沿着多级结构捕捉局部特征的能力带来了更好的泛化能力。
PointNet++则是通过空间上的多级结构去处理点云。PointNet++通过潜在空间的距离度量,将点云划分为一系列堆叠的局部区域。和CNNs类似,PointNet++从小的局部邻域中捕捉到几何结构的局部特征,然后再整合到更大的尺度之中进行处理,形成更高级的特征,直到获得全局特征。
Problem Statement:对于\(\mathcal{X}=(M, d)\),M是点集(不一定均匀分布),d为距离度量。希望学习到一个函数\(\mathcal{f}\)来抽取\(\mathcal{X}\)中的语义特征。
关键问题:
- 怎么去划分局部区域
- 怎么去捕捉局部特征
这两个问题实际上相关,划分的同一个局部结构中使用的特征学习器(PointNet)可以进行权重共享,即形同于卷积的形式来学习局部结构特征。
如何去划分局部区域?局部区域即一个空间中的球形邻域,参数包括中心点和大小。
- 中心点:为了覆盖到完整的点集,应该使用最远点采样算法(FPS)选出代表邻域的中心点。
- 大小:不同于CNNs小尺寸卷积核往往有更好的效果。小的邻域可能不足以让PointNets捕捉特征。
Method
Hierarchical Point Set Feature Learning
和PointNet直接max pooling整个点集不同,PointNet++对点集进行了分级管理,随着层级逐步抽取越来越大的区域特征。
分层结构由set abstraction 层构成。每个层中会处理其包含的点集,并且抽取出一个更少元素的新点集。set abstraction详细结构为:
Sampling 层
从输入点集中使用FPS采样一个子集。这些点即作为每个局部邻域的中心点。
Grouping 层
在中心点附近使用ball Query查找相邻点,以便构建出局部邻域。输入包括原点集\(N \times (d+C)\)以及采样点集\(N^` \times d\)。输出包含K个元素的邻域点集\(N^` \times K \times (d+c)\)。每个邻域的K不一定相同,PointNet层最终会将其统一到一个相同长度的特征向量。
PointNet 层
使用了一个mini-PointNet来编码抽取每个邻域的特征。输出\(N^` \times (d+C^`)\)。处理时每个邻域中点集坐标转换成了相对中心点的偏移坐标:\(x_i=x_i-\hat{x}\),以便于捕捉点间联系关系。
Robust Feature Learning under Non-Uniform Sampling Denisty
从Grouping层可知,每个邻域的密度是不一样的。而非均匀分布会给点集特征提取带来一个较大的困难。稠密区域的特征可能不能泛化到稀疏区域。理想中,我们希望从尽可能小的邻域中提取特征。然而对于稀疏邻域来说,同样小的区域存在着采样不足的问题而不能提取特征。因此PointNet++通过一个密度自适应的PointNet层来结合不同尺度下的邻域特征。
在PointNet++中,每个set abstraction 层都会提取多尺度下的局部特征,并且根据邻域密度来智能地组合起来。其有两种类型的密度自适应层来实现以上目的:
Multi-scale grouping(MSG)
一种简单而有效的多尺度提取方法:使用多种尺度的grouping层,并且利用PointNet层去提取每个尺度下的特征,最终concat组合成一个统一多尺度的特征。
训练时通过随机dropout,使得网络能够接触到不同密度不同分布的点集,使得训练后网络能够找到更优的策略来组合多维度特征。在测试时则不进行dropout。
Multi-resolution grouping(MRG)
上面的MSG方法显然是计算昂贵的。比起MSG,MRG避免了很多最低层次的计算,更加高效。在\(L_i\)尺度下,一个邻域的特征由两个向量连接而成。一个向量是通过set abstraction层抽取低级尺度\(L_{i-1}\)下的子邻域的特征来获得。另一个向量是使用一个单独的PointNet直接处理邻域所有的点来得到。
当邻域的密度较低时,低尺度特征很容易受到采样稀疏性影响,因此逐尺度总结的特征会变得没有直接提取的特征可靠,从而更依赖直接特征。另一方面,当密度过高时,逐尺度特征能够提供更精细的细节。
Point Feature Propagation for Set Segmentation
set abstraction层会对原始点云进行二次采样,然而对于分割任务需要获得所有原始点的特征。一个办法是在所有尺度的set abstraction中将所有的点都作为中心点进行计算一次,而这计算很昂贵。另一个方法是将二次采样的点的特征传播到原始的点。
PointNet++采用了一个分层传播策略,包括基于距离插值和层级跳跃链接。
- 设\(N_{l-1},N_l\)为\(l\)层set abstraction的输入和输出的点集大小(\(N_l \leq N_{l-1}\)),feature propagation层会将\(N_l \times (d+C)\)的输入数据传播给\(N_{l-1}\)个点,即在\(N_{l-1}\)点的坐标上进行特征的插值。插值方法选择了在K近邻之上的反距离加权平权(实验采用p=2,k=3): \[ f^{(j)}(x)=\frac{\sum_{i=1}^{k} w_{i}(x) f_{i}^{(j)}}{\sum_{i=1}^{k} w_{i}(x)} \quad \text { where } \quad w_{i}(x)=\frac{1}{d\left(x, x_{i}\right)^{p}}, j=1, \ldots, C \]
- 然后将\(N_{l-1}\)点上的插值特征与从set abstraction层跳跃链接过来的特征进行连接。
- 连接后的特征传递给unit pointnet层(类1x1卷积层)。其中使用了一些共享权重的全连接层和ReLU层,以便更新每个点的特征向量。
- 重复以上处理过程,直到特征传播给了原始的所有点
Experiments
参考文献
[2] C. R. Qi, H. Su, K. Mo, and L. J. Guibas. Pointnet: Deep learning on point sets for 3d classification and segmentation. arXiv preprint arXiv:1612.00593, 2016.