85182fbf6fe90d9c3da177bcb600d572.png

目前,点云的一个研究热点是如何高效的计算点云中点的feature。本文介绍ICCV2019的一篇用核心点卷积(Kernel Point Convolution)来计算feature的文章,包括学习笔记和总结。

KPConv: Flexible and Deformable Convolution for Point Clouds​arxiv.org HuguesTHOMAS/KPConv​github.com
6ca82f2581cd147ac06de6e0c4d8f21b.png

1. Kernel Point Convolution定义

Kernel Point Convolution的作用是:计算出3D空间中一个点

的feature。下面以点
的feature计算过程为例,说明KPConv的定义。

点云中的点定义为:

所有点的feature定义为:

为球心,
为半径,确定一个球体。落在该球体内的点,将作为点
的邻居点,参与
的feature计算。
的邻居点定义为:

将球体定义为:

在球体内,找

个点,作为核心点(kernel points)。核心点并不是点云中的点,而是通过特定规则计算出来的一些特殊的位置,核心点位置的确定,此处先忽略,后面会介绍。
个核心点定义为:

对于每个核心点

,分别有一个权重矩阵
与之对应。
的定义为:

在前面定义的球体范围

,对于落在该范围内的点
(点云中的点),可以得到其相对于
的距离
。对于任意的
,定义
核函数
为:

可以直观的看出,

相当于对
个权重矩阵加权求和
。权重系数
定义为:

可以看出,每个权重矩阵

的系数,由
对应的核心点
的相对距离来确定。相对距离越小,权重越大,最大值为1;相对距离越大,权重越小,最小值为0。 直观的解释:距离越近,相关性越大,结果越大;反之亦然。
可以看作:专门针对
计算出来一个权重矩阵。其中,

基于以上内容,点

处的核心点卷积KPConv定义为,对每个邻居点
的特征
,分别用矩阵
变换后,累加起来:

总结一下核心点卷积的大概思路:

  1. 以点
    为球心确定一个球体;
  2. 在球体内确定若干个核心点,每个核心点带一个权重矩阵;
  3. 对于落在球体范围内的任意点,用核函数,计算出该点的权重矩阵,用该矩阵对这个点的feature进行变换;
  4. 对于落在球体内的每个点,都用上一步的方法,得出一个新的feature,最后将feature累加起来,作为点
    的feature。

可能是因为在3D空间下不好表达以上内容,论文中使用2D形式的核心点卷积来进行图示:

342d5267088d3b44931d056207fab902.png
2D Kernel Point Convolution

如上图所示,以第二个点为例,首先通过

分别计算出7个核心点权重矩阵
的系数,加权求和后,得到第二个点的feature的转换矩阵,对第二个点的feature进行变换。圆圈范围内(对应于3D里面的球体)的4个点,每个点分别计算出来一个feature,最后求和,得到目标点的feature。

2. 如何确定每个kernel point的位置?

所有的kernel point都在半径

限定的球体范围内。每个点的位置的确定方式大概如下:
  1. 球心作为一个kernel point的位置;
  2. 球心对其它点有一定的引力(attractive force)来吸引它们靠拢;
  3. 其它的kernel points之间有一定的斥力(repulsive force)来使它们相互远离。
  4. 这个由引力、斥力组成的系统稳定后,即可确定每个kernel point的位置。

具体过程,可以参考源码实现。按这种方式,得到的结果类似于:

5b54389d184ae40214ea2ad03b7d2e83.png
Kernel Point 位置示意图

3. Deformable Kernel Point Convolution定义

思想源于微软的《Deformable Convolutional Networks》:

d024a5360e37c77defa80142947a7620.png
Deformable Convolution示意图

对于一次卷积操作中涉及到的每个操作点,严格按照规则的矩形可能并不是最优的,所以在Deformable Convolution中,先计算出每个点相对于原始位置的偏移量,然后用偏移量修改位置后,再执行卷积。

论文使用相同的思路,实现了一个Deformable Kernel Point Convolution,大概思路是:按前面提到的引力、斥力的方法确定出来的所有kernel points的位置可能并不是最优的,因此,首先根据输入,计算出一个用来“优化”kernel points位置的偏移量,对每个kernel point的位置进行修改,然后再执行kernel point convolution。如下图所示:

e24488272f416fdd3a8f7fef5d66c760.png
2D Deformable Kernel Point Convolution示意图

如上图所示,经过修改后,kernel points的位置有了很大的变化。

如何计算出每个kernel point的偏移量?

首先明确两个名字:

  1. Rigid KPConv:kernel points位置不变,即没有使用deformable convolution的思路;
  2. Deformable KPConv:使用deformable convolution的思路,对kernel points的位置进行修改。

如上图所示,偏移量是通过一个Rigit KPConv计算出来的,计算过程前面有详细介绍,只是将Rigit KPConv计算出来的feature作为偏移量来用。例如,假设有

个 kernel points,则将Rigit KPConv的输出维度
设置为
即可,如此一来,每个kernel point都可以分到一个3D空间的偏移量。

用数学公式来表达,其核函数、卷积分别为:

加了Deformable后是否有效果?

论文指出,直接引入Deformable,效果并不好,需要配合以下两个

一起使用。

含义:任何一个kernel point,与其最近的输入点的距离,不能太大。

其中,

,是前面用来计算点
关于kernel point
权重矩阵
的系数,点
之间的距离越小,结果越大。所以该loss的含义为:kernel points彼此之间的距离,不能太小。

4. 总结

论文核心在于核函数

和相关性函数
。面对多个矩阵,
计算出每个矩阵的系数,
使用
的计算结果对所有矩阵加权求和,最终计算出一个权重矩阵,用于feature的更新。

与PointNet比较,PointNet中的某一层,所有点的feature的更新,使用相同的矩阵。而KPConv中,每个点根据其位置,计算出一个特别的矩阵来执行feature的更新。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐