点云深度学习系列由浅入深之--PointNet++

点云深度学习系列之由浅入深--PointNet++

    • 1. PointNet++的主要网络结构
    • 2. PointNet++的主要模块
        • 2.1 下采样
        • 2.2 上采样
    • 2.3 Robust Feature Learning under Non-Uniform Sampling Density 模块
    • 参考文献

这篇博客主要分析PointNet++, 首先回顾一下PointNet的主要内容(可以参见上一篇分析PointNet的博客),
(1) pointnet 采用点集上关于置换不变的对称函数 f : = γ ∘ max ⁡ ∘ h f:=\gamma\circ\max\circ h f:=γmaxh直接处理点云数据,并且使得网络输出与点云输入的顺序无关;
(2) 同时 f f f的universal approximation能力,保证了PointNet的近似能力

   但是分析PointNet的过程,容易发现,它的整个提取点特征的过程,有如下的局限性:
(1) 网络提取特征时,在max pool 层之前,分辨率(点数)一直不变;这与典型的CNN网络通过逐步下采样形成的层次特征结构不同;
(2) PointNet采用的mlp(多层感知机)均是全连接形式,不能够很好地捕捉点云数据的局部特征;而典型的CNN网络,则是通过小卷积核来捕捉数据的局部特征。

  PointNet++工作,主要就是为了解决PointNet中上述两个局限性。接下来分析PointNet++的主要内容及思想:

1. PointNet++的主要网络结构

首先来看一下,PointNet++的整体网络结构图 [1]:点云深度学习系列由浅入深之--PointNet++_第1张图片
  从上图可以看到,PointNet++同样可以进行点云分割和分类任务,主要有如下特点:
(1) 包含了点云特征的下采样:如 ( N , d + C ) → ( N 1 , d + C 1 ) → ( N 2 , d + C 2 ) (N,d+C)\rightarrow (N_1,d+C_1)\rightarrow (N_2,d+C_2) (N,d+C)(N1,d+C1)(N2,d+C2),其中 N > N 1 > N 2 N>N_1>N_2 N>N1>N2,即分辨率是在逐渐下降的,即形成了典型CNN中的层级特征结构图。
(2) 对于稠密预测任务,如点云分割,实现了上采样:即文中 [1]的模块 point feature propagation 模块,包含上图中的interpolate,skip link concatenation 和unit pointnet操作。
(3) 网络输出依然与点云数据的顺序无关:从上图可以看见,PointNet++以pointnet作为子网络提取点云特征。

下面来具体分析PointNet++是如何实现下采样,上采样,以及局部特征。

2. PointNet++的主要模块

为了阐述的方便,先统一下符号说明:
{ x 1 , x 2 , . . . , x n } \{x_1,x_2,...,x_n\} {x1,x2,...,xn}:表示网络某一层的点云特征, n n n表示点的个数(即分辨率), x i ∈ R d + C , i = 1 , 2 , . . . , n x_i\in R^{d+C},i=1,2,...,n xiRd+C,i=1,2,...,n C C C表示点特征的维度, d d d表示点云数据的空间维度。

2.1 下采样

  PointNet++通过下采样方式实现典型CNN中的层次特征结构,即文中 [1]所称set abstraction模块,它主要由如下三个步骤构成:sampling层,grouping层,pointnet特征提取层,具体如下:

sampling 层: 该层主要产生点云特征的下采样点,后面的内容中均称作下采样候选点,例如要从 N N N个点 { x 1 , x 2 , . . . , x N } \{x_1,x_2,...,x_N\} {x1,x2,...,xN}中选取 N ′ N^{\prime} N个点, x i ∈ R d + C x_{i}\in R^{d+C} xiRd+C。文中 [1] 采用迭代式的**farthest point sampling(FPS)**算法,生成这 N ′ N^{\prime} N个候选点。具体做法是,假设已经选到了 m   ( m < N ′ ) m~(mm (m<N)个点 { x i 1 , x i 2 , . . . , x i m } \{x_{i_1},x_{i_2},...,x_{i_m}\} {xi1,xi2,...,xim},那么选取的下一个点 x i m + 1 x_{i_{m+1}} xim+1,满足: x i m + 1 = arg ⁡ max ⁡ x ∈ { x 1 , x 2 , . . . , x n } ∖ { x i 1 , x i 2 , . . . , x i m } d i s t ( x , { x i 1 , x i 2 , . . . , x i m } ) x_{i_{m+1}}={\arg\max}_{x\in \{x_1,x_2,...,x_n\}\setminus\{x_{i_1},x_{i_2},...,x_{i_m}\}}dist(x,\{x_{i_1},x_{i_2},...,x_{i_m}\}) xim+1=argmaxx{x1,x2,...,xn}{xi1,xi2,...,xim}dist(x,{xi1,xi2,...,xim}) 其中 d i s t dist dist表示度量空间中的距离函数。重复上面过程,直到选取了指定数目的候选点。相比与随机选取 N ′ N^{\prime} N个候选点,这样产生的点能够最大程度地覆盖整个点集。实则相当于选取了 N ′ N^{\prime} N个点,使得这 N ′ N' N个候选点集的直径尽可能达到最大。注意到,经过sampling层产生的候选点都是上一层点集的一个子集(这个性质会在后面讲述PointNet++的上采样中用到)。

grouping 层: 经过上面的sampling层,产生了 N ′ ( < N ) N^{\prime}(N(<N)个候选点,相当于对点云分辨率进行了下采样。由于PointNet++目的是为了增强网络的局部特征处理能力(不像PointNet那样全局处理整个点云特征),PointNet++则只考虑以候选点为球心,半径为 r r r的球体内的点作为一个局部区域(这类似CNN中 k × k k\times k k×k卷积核覆盖的局部 k × k k\times k k×k邻域)。那么,经过grouping层之后,输出大小为 N ′ × K × ( d + C ) N^{\prime}\times K\times (d+C) N×K×(d+C),其中 K K K表示相邻点数目, C C C表示点云特征的维度。(注意到,可能每个下采样候选点周围的相邻点个数 K K K不一致,但是由于 P o i n t N e t PointNet PointNet中提取特征最后用到的 m a x   p o o l max ~pool max pool,所以最终所有候选点的局部特征维度仍然是一样的)

pointnet 特征提取层: 该层主要就是,把每个候选点及其邻域点的特征(大小为 K × ( d + C ) K\times (d+C) K×(d+C)),送入PointNet网络进行特征提取,产生一个 d + C ′ d+C^{\prime} d+C大小的特征向量,作为这个候选点的局部特征。经过这层处理之后,得到的点特征大小为 N ′ × ( d + C ′ ) N^{\prime}\times (d+C^{\prime}) N×(d+C)

  所以经过上面的三个操作,即set abstraction模块,点特征变化为 ( N , d + C ) → ( N ′ , d + C ′ ) , N ′ < N (N,d+C)\rightarrow (N',d+C'), N'(N,d+C)(N,d+C),N<N,实现点特征的下采样。通过重复这样的操作,形成类似CNN中的层级特征结构。

2.2 上采样

   对于稠密预测任务,上采样是非常重要的恢复分辨率的手段。类似CNN中的反卷积上采样操作,PointNet++通过文中 [1]所称的Point Feature Propagation模块来实现,该模块由上图中的interplolate, skip links concatenationunit pointnet构成:

interploate: 假设现在的点特征大小为 ( N ′ , d + C ′ ) (N',d+C') (N,d+C),需要上采样到 ( N , d + C ′ ) (N,d+C') (N,d+C)大小。在前面下采样的sampling层中讲过,下采样后的点集 B = { p 1 , p 2 , . . . , p N ′ } B=\{p_1,p_2,...,p_{N'}\} B={p1,p2,...,pN}是下采样之前点集 A = { p 1 , p 2 , . . . , p N } A=\{p_1,p_2,...,p_{N}\} A={p1,p2,...,pN}的子集, p i ∈ R d p_i\in R^d piRd表示点云数据的空间坐标, B ⊂ A B\subset A BA。那么PointNet++上采样过程就是:
(1) ( N ′ , d + C ′ ) (N',d+C') (N,d+C)空间分辨率为 B B B,对其进行上采样,上采样的后空间分辨率就是 A A A
(2) 因为空间分辨率上升,需要对每个新出现的点 x ∈ A ∖ B x\in A\setminus B xAB, 赋予点特征值,具体就是计算 x x x B B B中的 k k k个最近邻点(按空间坐标距离,文中取 k = 3 k=3 k=3),然后取这 k k k个点的点特征的权重平均,得到 x x x的点特征值, f ( x ) = ∑ i = 1 k w i ( x ) f ( x i ) ∑ i = 1 k w i ( x ) , w i ( x ) = 1 d i s t ( x , x i ) 2 f(x)=\frac{\sum_{i=1}^{k}w_{i}(x)f(x_i)}{\sum_{i=1}^{k}w_{i}(x)}, w_{i}(x)=\frac{1}{dist(x,x_i)^2} f(x)=i=1kwi(x)i=1kwi(x)f(xi),wi(x)=dist(x,xi)21其中 x i x_i xi属于 x x x k k k个最近邻点集。经过插值之后,特征变化为 ( N ′ , d + C ′ ) → ( N , d + C ′ ) (N',d+C')\rightarrow(N,d+C') (N,d+C)(N,d+C)

skip links concatenation: 将上面interpolate得到的特征(大小为 ( N , d + C ′ ) (N,d+C') (N,d+C)),与PointNet++ encoder部分具有相同分辨率的特征(大小为 ( N , d + C ) (N,d+C) (N,d+C))进行concatenation,得到组后的点特征。

unit pointnet: 就是利用多个 m l p mlp mlp对concatenation之后的特征进行refine。

   这样经过上面的操作之后,PointNet++实现了点特征的上采样操作(类似CNN中的反卷积上采样)。至此,PointNet++的主要功能模块已经实现了。下面分析,文中 [1]提到的 Robust Feature Learning under Non-Uniform Sampling Density模块,该模块主要是为了考虑到点云数据在空间中分布的极度不均匀性,其具体如下:

2.3 Robust Feature Learning under Non-Uniform Sampling Density 模块

由于点云数据在空间上分布极可能非常不均匀,有些地方点云比较稠密,有些地方则非常稀疏。这样会导致PointNet++下采样处理中,sampling层中的有些下采样候选点周围没有其他相邻点或相邻点非常少(以候选点为球心,半径为 r r r的球体内的相邻关系)。那么,这样的PointNet++的局部模式识别能力可能依旧比较弱。因此,PointNet++ [1]给出了两种缓解这类情况的方法:点云深度学习系列由浅入深之--PointNet++_第2张图片
(1) Multi-scale grouping (MSG): 该方法就是在下采样过程中,计算下采样候选点的邻域时,从原来的只考虑一个半径为 r r r的球体内的相邻点,改为统计多个半径分别为 r 1 , . . . , r m r_1,...,r_m r1,...,rm的球体内的相邻点,这样相当于在多个尺度下考察了下采样候选点的相邻关系。然后把每个尺度下的邻域点经过PointNet网络,得到该尺度下的候选点的局部特征;然后把多个尺度下得到的局部特征进行concatenation操作,作为候选点最终的局部特征(这有点类似语义分割CNN中的aspp模块)。但是这种方法可能会大大增加计算复杂度,因为网络浅层时,由于点的数目较大,统计多个半径球内的相邻点,可能会大量重复计算相同的邻域点的点特征(因为半径为 r 1 r_1 r1的球体 ⊂ \subset 半径为 r 2 r_2 r2的球体,如果 r 1 < r 2 r_1r1<r2)。

(2) Multi-resolution grouping (MRG): 该方法仍如上面介绍的下采样过程一样,即只考虑一个半径为 r r r的球体内的相邻点来计算下采样候选点的局部特征 f 1 f_1 f1,但是同时会用PointNet计算当前所有点的特征 f 2 f_2 f2。 将 f 1 , f 2 f_1,f_2 f1,f2 进行concatenation之后的结果,作为下采样候选点最终的局部特征。这种处理,使得PointNet++具有如下的局部模式识别能力:(a) 当下采样候选点附近点云密度较大时,能够通过 f 1 f_1 f1有效提取下采样候选点的局部特征;(b) 当下采样候选点附近点云稀疏时,那么可以通过 f 2 f_2 f2辅助 f 1 f_1 f1获得较可靠的局部特征。

PointNet++采用的是Multi-resolution grouping (MRG)方法。

总结: PointNet++通过设计 s e t   a b s t r a c t i o n + P o i n t N e t set ~abstraction+PointNet set abstraction+PointNet操作,实现了点特征的下采样,得到了类似CNN中的层级结构特征;同时通过 P o i n t   F e a t u r e   P r o p a g a t i o n Point~Feature~Propagation Point Feature Propagation操作,实现了点特征的上采样,得到了类似CNN中的反卷积上采样操作;同时通过 M u l t i Multi Multi- r e s o l u t i o n   g r o u p i n g ( M R G ) resolution~grouping (MRG) resolution grouping(MRG)模块,增强了PointNet++网络对点云密度分布不均匀的鲁棒性。

参考文献

[1] PointNet++: Deep hierarchical feature learning on point sets in metric space.

你可能感兴趣的:(点云分割,PCL,点云分类)