点云深度学习系列之由浅入深--PointNet++
这篇博客主要分析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++的主要内容及思想:
1. 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++是如何实现下采样,上采样,以及局部特征。
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
xi∈Rd+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} xi∈Rd+C。文中 [1] 采用迭代式的**farthest point sampling(FPS)**算法,生成这 N ′ N^{\prime} N′个候选点。具体做法是,假设已经选到了 m ( m < N ′ ) m~(m<N^{\prime}) m (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′(<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 (N,d+C)→(N′,d+C′),N′<N,实现点特征的下采样。通过重复这样的操作,形成类似CNN中的层级特征结构。
2.2 上采样
对于稠密预测任务,上采样是非常重要的恢复分辨率的手段。类似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模块,该模块主要是为了考虑到点云数据在空间中分布的极度不均匀性,其具体如下:
2.3 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<r_2
r1<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.