[论文阅读]PointNet++:Deep Hierarchical Feature Learning on Point Sets

PointNet++是PointNet的进化版,解决了点局部特征的获取问题,提出的set abstraction level很有意思,也竭尽可能的整理好整理清楚这种开山之作

Posted by Xuehui Wang on 2019-06-01

从PointNet起源的反思

  • PointNet最基本的想法:将点集中的每一个点进行空间编码,然后将所有的点的特征进行聚合,这样就可以得到一个全局的特征。
  • 所以缺点就是并没有考虑度量空间中点与点之间的局部结构关系,这样就导致可以从全局大概的推断一个点集的类别或者分割,但是对于细节的把握就很欠缺了。
  • 局部结构是很重要的,这些结构在不同尺度下可以层次性聚合的性质在2D的CNN中就证实了其可以对于未知的case有更好的泛化能力。

PointNet++ 提出的背景

  • PointNet没有捕捉度量空间中点与点之间的局部结构信息,限制了模型对于细粒度部分的识别以及对复杂环境的泛化能力。
  • 其实感觉就是整合了全局的信息,但是对于点与点之间的关系没有做过多的相关性联结。

PointNet++ 的设计简述

  • 是一种分层网络。它可以将PointNet网络递归的在嵌套分隔的点云集上使用,通过对度量空间距离的使用,可以学习带有上下文尺度信息的局部特征。
  • 同时还注意到了点集经常是不同密度的抽样结果,这种方式大幅度的降低了网络在统一密度点集上的训练效果,因此也提出了一种先进的集合学习层(set learning layer)来自适应的结合不同尺度的特征。
  • 所以要解决两个问题:
    • 如何来划分点集
    • 如何通过一个局部特征学习器来获得局部特征。

PointNet++的设计思路

  • 首先,根据度量空间中的某种度量方式将点集划分为有重合部分的一个个子区域。
  • 然后,提取出已经从其他小范围相邻的点捕获到了比较好的几何结构的局部特征。这些局部特征被聚合在一起进而形成更高级的特征。
  • 逐渐迭代聚合过程,直到产生相对于所有点集的特征。

PointNet++ 详细

分层特征学习

  • 通过使用PointNet,将其作为一个特征提取器,使用分层的方式来迭代抽象出越来越大的区域

  • 分层结构的主要组成部分是一堆集合抽象层(set abstraction layers),处理 $N \times (d + C)$ 的矩阵,其中$N$是点云数量,$d$是每个点的坐标系维度,$C$是额外的点的特征维度(比如颜色,法向量,亮度),输出$N’ \times (d+C’)$ 的矩阵,其中$N’$是经过该层下采样后得到的点云数量,$C’$是新的能概括局部信息的特征维度,每一层中的点都被抽象为下一层更少的点,就是卷积那种赶脚。一个抽象层分为三部分:

    • 采样层-从点集中选择出一个子集,子集中每一个点都是一个局部区域的中心

    使用FPS方法得到一个点子集,每一个点都是距离子集中其他点最远的点。相比随机采样这种方法的收敛性更强,与CNN扫描(感受野)分布未知的向量空间相比,这种采样策略的感受野范围与数据是相互独立的,也就是不用在意数据的量。

    • 分组层-对子集中的每一个点搜索他们的近邻点,这样就组成了一个个局部区域。可能相互之间会有重叠(overlap)

    输入是$N \times (d + C)$ 的数据和大小为$N’ \times d$ 的中心点的坐标($N’$应该就是子集的数量,$d$是每个中心点的坐标系维度)。输出是一组组的点集,大小为$N’ \times K \times (d+C)$,其中$K$是每一个中心点邻域范围内的点的数量,每一组对应一个局部区域,$K$在不同组中可能是不同的,但是不影响,因为PointNet模块对于输入数量没啥限制,反正都是输出一个特征向量。

    在卷积中,图像的局部区域是通过kernel的size范围来确定的,在点云的抽样中,一个点的邻域范围是通过度量空间得到的。(也就是这一簇是以度量后进行的group)

    分组方式是使用了球体选择(ball query),也就是给定一个以中心点为体心的球,给半径,然后再这个半径组成的球体内取不超过$K_{max}$ 个点组成一组。另外有种代替方案是KNN,但是球体选择这种方案的好处就是得到的局部近邻保证了一个固定尺度的区域,这样使得这个局部区域的特征更加泛化,这对于局部识别任务(比如点云语义分割)更合适。

    • PointNet层(算是特征提取层)-使用一个mini-PointNet对局部区域进行编码得到一个特征向量

    对于分组层的输出,PointNet层将每一个group的中心点以及其周围的局部特征(从邻域点编码而来)进行抽象得到一个整体的局部区域,所以输出是$N’ \times (d+C’)$

    在这一层中,进行抽象前首先将邻域点的坐标变成相对于中心点的相对坐标:$x_i^{(j)}=x_i^{(j)}-\hat{x}^{j}$ ,其中$i=1,2…,K$,$j=1,2…,d$ 。然后$\hat{x}$是中心点的坐标。这样之后就可以使用PointNet作为一个基础模块来对一个group进行抽象得到下一层的一个输入点。

对于非均匀采样密度的鲁棒性解决方案

a是multi-scale grouping,b是multi-resolution grouping
  • 问题来源于点云在不同区域密度不同,即非均匀采样。在密集的区域中学到的特征可能对稀疏区域无法泛化,这样就会使得在稀疏点云中模型无法识别到精细的局部结构。
  • 最理想的当然是在密集区域可以尽可能的得到最精细的细节,但在采样不足的区域就是天方夜谭。因此比较好的方法就是扩大采集的尺度。
  • 所以本文提出了一种密度自适应的PointNet层,可以在输入的采样密度改变的时候学会结合区域多尺度下的特征,即是PointNet++。
  • 在PointNet++的set abstraction layers中,会提取多个尺度的局部点,然后把他们结合起来。为了group局部区域以及结合多个尺度的特征,提出了MSG和MRG两种方案。
    • Multi-scale grouping:最简单也有效的方式就是使用group layers来多次获得不同尺度的子集(也就是多个$N’$,但是每一个中心点对应有的$K$数量不同),紧接着使用PointNet来提取多尺度子集的各自特征,然后把他们concat起来。形成了多尺度特征。
    • Multi-resolution grouping:上边的方法是比较耗时的,因为对于每一种尺度PointNet layer都要对每个中心点进行处理一次。而中心点个数在特征层次比较低时数量是很多的,所以及其耗时。所以换一种又省时间,又可以根据点的分布特点来自适应的聚合信息的方法。即:在一些层$L_i$中,局部区域的特征是由两个特征拼合起来的。一个是对$L_{i-1}$层中几个中心点子集经过set abstraction layer得到的向量进行合并后的总特征向量,另一个是对这几个中心点集合的并集进行一起的PointNet得到的向量。比如在第1层中,1,2,3三个中心点集合在第2层中是一个集合,那第2层的输出特征就是1,2,3特征的汇总再加1,2,3三个集合所有点一起送入PointNet后得到的特征。 在点云稀疏时,第一个特征的依赖程度(或者说权重)应该低于第二个特征。因为第一个特征在计算时候点云很稀疏,抽样能力降低。而第二个特征因为是几个点集一起算,相当于在稀疏时扩大了区域。

集合分割任务中点特征的传递问题

  • 想解决的是在分割问题中,需要对每一个点都作出label的预测,但是set abstraction level是一种降采样。一种解决方式是将每一个点都当做一个中心点,但是这种方式对于计算资源的开销是巨大的。另一种方式是从降采样后的点中将特征传递到原始点集中。
  • so提出了一种带有基于插值距离以及层级跳跃连接的分层的传播策略。
    • 在特诊传递层中,会将特征从$N_l \times (d+C)$的点传递到$N_{l-1}$的点,其中$N_l$是set abstraction level $l$的输出点集size,$N_{l-1}$是输入点集size。通过将$N_l$的特征值$f$插值到$N_{l-1}$的坐标中来完成传播过程。