这篇博客主要分析PointNet++, 首先回顾一下PointNet的主要内容(可以参见上一篇分析PointNet的博客),
(1) pointnet 采用点集上关于置换不变的对称函数 f : = γ ∘ max ∘ h f:=\gamma\circ\max\circ h f:=γ∘max∘h直接处理点云数据,并且使得网络输出与点云输入的顺序无关;
(2) 同时 f f f的universal approximation能力,保证了PointNet的近似能力
但是分析PointNet的过程,容易发现,它的整个提取点特征的过程,有如下的局限性:
(1) 网络提取特征时,在max pool 层之前,分辨率(点数)一直不变;这与典型的CNN网络通过逐步下采样形成的层次特征结构不同;
(2) PointNet采用的mlp(多层感知机)均是全连接形式,不能够很好地捕捉点云数据的局部特征;而典型的CNN网络,则是通过小卷积核来捕捉数据的局部特征。
PointNet++工作,主要就是为了解决PointNet中上述两个局限性。接下来分析PointNet++的主要内容及思想:
首先来看一下,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++是如何实现下采样,上采样,以及局部特征。
为了阐述的方便,先统一下符号说明:
{ 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 xi∈Rd+C,i=1,2,...,n, C C C表示点特征的维度, d d d表示点云数据的空间维度。
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} xi∈Rd+C。文中 [1] 采用迭代式的**farthest point sampling(FPS)**算法,生成这 N ′ N^{\prime} N′个候选点。具体做法是,假设已经选到了 m ( m < N ′ ) m~(m
grouping 层: 经过上面的sampling层,产生了 N ′ ( < N ) N^{\prime}(
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'
对于稠密预测任务,上采样是非常重要的恢复分辨率的手段。类似CNN中的反卷积上采样操作,PointNet++通过文中 [1]所称的Point Feature Propagation模块来实现,该模块由上图中的interplolate, skip links concatenation和unit 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 pi∈Rd表示点云数据的空间坐标, B ⊂ A B\subset A B⊂A。那么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 x∈A∖B, 赋予点特征值,具体就是计算 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模块,该模块主要是为了考虑到点云数据在空间中分布的极度不均匀性,其具体如下:
由于点云数据在空间上分布极可能非常不均匀,有些地方点云比较稠密,有些地方则非常稀疏。这样会导致PointNet++下采样处理中,sampling层中的有些下采样候选点周围没有其他相邻点或相邻点非常少(以候选点为球心,半径为 r r r的球体内的相邻关系)。那么,这样的PointNet++的局部模式识别能力可能依旧比较弱。因此,PointNet++ [1]给出了两种缓解这类情况的方法:
(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_1
(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.