Github代码:https://github.com/HuguesTHOMAS/KPConv
论文:https://arxiv.org/abs/1904.08889
这是PointNet的作者Charles R. Qi的一篇文章,在许多分割的任务上都达到了极好的效果,超过了当前的State of the art七八个点。这一篇的贡献点总结如下:
首先定义一下点云上的某个点 x i ∈ P ∈ R N × 3 x_i\in P \in R^{N\times 3} xi∈P∈RN×3以及其对应的特征 f i ∈ F ∈ R N × D f_i\in F \in R^{N\times D} fi∈F∈RN×D,通常由kenel g g g所定义的点云的卷积可以写成如下的形式:
( F ∗ g ) ( x ) = ∑ x i ∈ N x g ( x i − x ) f i (F*g)(x) = \sum_{x_i \in N_x} g(x_i-x )f_i (F∗g)(x)=xi∈Nx∑g(xi−x)fi其中 N x N_x Nx代表其某个局部邻域,可以看做是某个中心点以半径 r r r画出的一个球形邻域,即 N x = { x i ∈ P ∣ ∣ ∣ x i − x ∣ ∣ ≤ r } N_x = \{x_i \in P | ||x_i-x||\leq r\} Nx={xi∈P∣∣∣xi−x∣∣≤r}
在不同的工作中,往往上面公式中的核函数 g g g才是关键, g g g取以 x x x为中心的相邻点作为输入。在这篇文章中,作者同其他工作一样将局部的区域中心化,即对于每一个点 x i x_i xi,可以通过中心化 y i = x i − x y_i = x_i-x yi=xi−x 将其转换成 y i y_i yi,因此, B r 3 = { y ∈ R 3 ∣ ∣ ∣ y ∣ ∣ ≤ r } B^3_r= \{y\in R^3 | ||y||\leq r\} Br3={y∈R3∣∣∣y∣∣≤r}, 这样网络就拥有了平移不变性。与其他工作不同的是,作者定义了一组Kernel Points, { x k ^ ∣ k < K } ∈ B r 3 \{\hat{x_k}|k<K\}\in B^3_r {xk^∣k<K}∈Br3 以及它们对应的权重 { W k ∣ k < K } ∈ R D i n × D o u t \{{W_k}|k<K\}\in R^{D_{in} \times D_{out}} {Wk∣k<K}∈RDin×Dout,通过将每个点周围的Kernel Point作为其参照物,去进行特征的聚合。
最终,点云上的核函数可以定义为:
g ( y i ) = ∑ k < K h ( y i , x k ^ ) W k g(y_i)=\sum_{k<K}h(y_i,\hat{x_k})W_k g(yi)=k<K∑h(yi,xk^)Wk其中 h h h代表 x k ^ \hat{x_k} xk^和 y i y_i yi的相关性,当他们两个接近的时候其会比较高。
h ( y i , x k ^ ) = m a x ( 0 , 1 ∣ ∣ y i − x k ^ ∣ ∣ σ ) h(y_i,\hat{x_k}) = max(0,1\frac{||y_i-\hat{x_k}||}{\sigma}) h(yi,xk^)=max(0,1σ∣∣yi−xk^∣∣)其中 σ \sigma σ是Kernel Points的影响距离,将根据输入密度进行选择。因此,每个点的特征 f i f_i fi乘以所有的Kernel的权重矩阵,相关系数 h i k h_{ik} hik取决于它相对于Kernel Points的位置。
Kernel Points 的选取相当于这篇文章的核心问题,它们需要研究出一个通用的方案,对于任意的Kernel Points数量 K K K,都可以在空间上面构建这些Kernel Points。论文提出了两种解决方案:
作者在文章中说,Rigid Kernel 对于一些简单的任务表现得较好。作者首先选择通过求解一个优化问题来放置Kernel Points,其中每个点对其他点施加一个斥力。这些点被限制在具有吸引力的球面上,其中一个点被限制在中心。最终,周围的点被限制在平均半径1.5σ,确保每个Kernel Points之间的影响力有小幅度的重叠。
具体的数学推导其实是求解一个优化问题,即希望K个Kernel Points在球面上离得足够远,又离球心不要太远。目标方程的第一部分是希望Kernel Points之间彼此不要太近:
第二个部分是希望与中心点不要太远
所以最后的目标方程如下:
通过论文的实验结果可以看到选取不同的超参数K时所得到的Kernel Points的位置。
作者首先考虑给予不同的层不同的初始化Kernel Points,但是他们认为这样并不能给予网络更多的表述能力,因此他们最后参考了Deformable Convolutional Networks的设计,对于每个Kernel Points学习一个位移 Δ ( x ) \Delta(x) Δ(x)。所以最终卷积的形式如下:
其通过对一个Rigid Kernel的KPNet,将特征从 D i n D_{in} Din映射到 3 K 3K 3K维度,并在训练的时候给予0.1倍的学习率去进行训练。
但是这里会出现一个问题,由于点云的稀疏性,会容易出现一个Kernel Points的影响范围内没有出现任何点。因此网络需要去学习一个位移去使得这些Kernel Points去拟合点云的空间形状。这里作者设计了两个Loss,fitting loss用来使得这些Kernel Points形状与点云相似,repulsive loss 使得她们彼此之间不会太近。
作者使用采样策略来控制每一层输入点的密度。为了保证采样点位置的空间一致性,他们采用网格采样(即通过空间划分网格,对每个网格内采取中心点)。因此每一个网格的重心,被作为采样点。
为了使得网络感受野不断增大,网络需要在后面的层不断减少点的个数。文章中有两种下采样的方法:
KPConv的输入是输入点云 P ∈ R N × 3 P\in R^{N\times 3} P∈RN×3以及它们对应的特征 F ∈ R N × D i n F\in R^{N\times D_{in}} F∈RN×Din。同时还需要计算一个邻居索引的矩阵 n ∈ [ 1 , N ] N ′ , n m a x n\in [1,N]^{N',n_{max}} n∈[1,N]N′,nmax,其索引的值为1~N,N’个点各有 n m a x n_{max} nmax个邻居。如果是Deformable Kernel的话网络还会学习一个 3 k 3k 3k的位移矩阵(如下图2)。
对于网络的每一层 l a y e r j layer_j layerj,有网格的宽度cell size d l j dl_j dlj。 Kernel Points的影响范围 σ j = ∑ × d l j \sigma_j = \sum \times dl_j σj=∑×dlj。对于刚性的卷积核,卷积的半径为 2.5 σ j 2.5\sigma_j 2.5σj,其 Kernel Points的平均半径 1.5 σ j 1.5 \sigma_j 1.5σj。对于可形变的卷积核, r j = ρ × d l j r_j = ρ\times dl_j rj=ρ×dlj, ρ ρ ρ 和 ∑ \sum ∑ 为整个网络的比例系数。通过交叉验证作者得到了: K = 15 K = 15 K=15, Σ = 1.0 Σ = 1.0 Σ=1.0 和 ρ = 5.0 ρ = 5.0 ρ=5.0。第一次下采样的cell size d l 0 dl_0 dl0取决于数据的大小,之后 d l j + 1 = 2 × d l j dl_{j+1} = 2 \times dl_j dlj+1=2×dlj。