【3D计算机视觉】KPConv——点云上的可形变卷积网络

Github代码:https://github.com/HuguesTHOMAS/KPConv
论文:https://arxiv.org/abs/1904.08889

一、主要贡献

这是PointNet的作者Charles R. Qi的一篇文章,在许多分割的任务上都达到了极好的效果,超过了当前的State of the art七八个点。这一篇的贡献点总结如下:

  • 提出了一种基于Kernel Point的新型点云卷积。相当于将Kernel Point当成了每个点的参照物,去计算与这些Kernel Point的权重去更新每个点;
  • 提出了两种不同类型的Kernel Point,一种是刚性的Rigid Kernel,相当于均匀分布在每个点的周围球面;一种是可变的Deformable Kernel ,通过在刚性的基础上通过网络去学习它的位置变化;
  • 整个网络GPU占用少、速度快,可以在不定个数的点云上直接训练,因此效果也好。

二、模型

2.1 定义在点云上的核函数

首先定义一下点云上的某个点 x i P R N × 3 x_i\in P \in R^{N\times 3} 以及其对应的特征 f i F R N × D f_i\in F \in R^{N\times D} ,通常由kenel 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 其中 N x N_x 代表其某个局部邻域,可以看做是某个中心点以半径 r r 画出的一个球形邻域,即 N x = { x i P x i x r } N_x = \{x_i \in P | ||x_i-x||\leq r\}

在不同的工作中,往往上面公式中的核函数 g g 才是关键, g g 取以 x x 为中心的相邻点作为输入。在这篇文章中,作者同其他工作一样将局部的区域中心化,即对于每一个点 x i x_i ,可以通过中心化 y i = x i x y_i = x_i-x 将其转换成 y i y_i ,因此, B r 3 = { y R 3 y r } B^3_r= \{y\in R^3 | ||y||\leq r\} , 这样网络就拥有了平移不变性。与其他工作不同的是,作者定义了一组Kernel Points { x k ^ k < K } B r 3 \{\hat{x_k}|k<K\}\in B^3_r 以及它们对应的权重 { W k k < K } R D i n × D o u t \{{W_k}|k<K\}\in R^{D_{in} \times D_{out}} ,通过将每个点周围的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 其中 h h 代表 x k ^ \hat{x_k} y i y_i 的相关性,当他们两个接近的时候其会比较高。
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}) 其中 σ \sigma 是Kernel Points的影响距离,将根据输入密度进行选择。因此,每个点的特征 f i f_i 乘以所有的Kernel的权重矩阵,相关系数 h i k h_{ik} 取决于它相对于Kernel Points的位置
在这里插入图片描述

2.2 Rigid or Deformable Kernel

Kernel Points 的选取相当于这篇文章的核心问题,它们需要研究出一个通用的方案,对于任意的Kernel Points数量 K K ,都可以在空间上面构建这些Kernel Points。论文提出了两种解决方案:

Rigid Kernel

作者在文章中说,Rigid Kernel 对于一些简单的任务表现得较好。作者首先选择通过求解一个优化问题来放置Kernel Points,其中每个点对其他点施加一个斥力。这些点被限制在具有吸引力的球面上,其中一个点被限制在中心。最终,周围的点被限制在平均半径1.5σ,确保每个Kernel Points之间的影响力有小幅度的重叠。

具体的数学推导其实是求解一个优化问题,即希望K个Kernel Points在球面上离得足够远,又离球心不要太远。目标方程的第一部分是希望Kernel Points之间彼此不要太近:
在这里插入图片描述
第二个部分是希望与中心点不要太远
在这里插入图片描述
所以最后的目标方程如下:
在这里插入图片描述
通过论文的实验结果可以看到选取不同的超参数K时所得到的Kernel Points的位置。
在这里插入图片描述

Deformable Kernel

作者首先考虑给予不同的层不同的初始化Kernel Points,但是他们认为这样并不能给予网络更多的表述能力,因此他们最后参考了Deformable Convolutional Networks的设计,对于每个Kernel Points学习一个位移 Δ ( x ) \Delta(x) 。所以最终卷积的形式如下:

在这里插入图片描述其通过对一个Rigid Kernel的KPNet,将特征从 D i n D_{in} 映射到 3 K 3K 维度,并在训练的时候给予0.1倍的学习率去进行训练。
在这里插入图片描述
但是这里会出现一个问题,由于点云的稀疏性,会容易出现一个Kernel Points的影响范围内没有出现任何点。因此网络需要去学习一个位移去使得这些Kernel Points去拟合点云的空间形状。这里作者设计了两个Loss,fitting loss用来使得这些Kernel Points形状与点云相似,repulsive loss 使得她们彼此之间不会太近。
在这里插入图片描述

2.3 Kernel Point Network Layers

Subsampling to deal with varying densities

作者使用采样策略来控制每一层输入点的密度。为了保证采样点位置的空间一致性,他们采用网格采样(即通过空间划分网格,对每个网格内采取中心点)。因此每一个网格的重心,被作为采样点。

Pooling layer

为了使得网络感受野不断增大,网络需要在后面的层不断减少点的个数。文章中有两种下采样的方法:

  • 逐点作为中心点的计算kernel point的权重,更新点的feature,最后再利用Max pooling减少点的个数;
  • 采样一些点作为中心点,同上,但最后不做Max pooling。

KPConv layer

KPConv的输入是输入点云 P R N × 3 P\in R^{N\times 3} 以及它们对应的特征 F R N × D i n F\in R^{N\times D_{in}} 。同时还需要计算一个邻居索引的矩阵 n [ 1 , N ] N , n m a x n\in [1,N]^{N',n_{max}} ,其索引的值为1~N,N’个点各有 n m a x n_{max} 个邻居。如果是Deformable Kernel的话网络还会学习一个 3 k 3k 的位移矩阵(如下图2)。
在这里插入图片描述

网络的超参数

对于网络的每一层 l a y e r j layer_j ,有网格的宽度cell size d l j dl_j 。 Kernel Points的影响范围 σ j = × d l j \sigma_j = \sum \times dl_j 。对于刚性的卷积核,卷积的半径为 2.5 σ j 2.5\sigma_j ,其 Kernel Points的平均半径 1.5 σ j 1.5 \sigma_j 。对于可形变的卷积核, r j = ρ × d l j r_j = ρ\times dl_j ρ ρ \sum 为整个网络的比例系数。通过交叉验证作者得到了: K = 15 K = 15 , Σ = 1.0 Σ = 1.0 ρ = 5.0 ρ = 5.0 。第一次下采样的cell size d l 0 dl_0 取决于数据的大小,之后 d l j + 1 = 2 × d l j dl_{j+1} = 2 \times dl_j

2.4 Kernel Point Network Architectures

在这里插入图片描述

三、实验结果

3.1 简单任务(分类+部件分割)

在这里插入图片描述

3.2 复杂任务(真实场景分割)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39373480/article/details/100118359