PointCNN 论文阅读笔记

版权声明:所有文章仅用于交流讨论,不定时修正错误,如若转载请附上原文链接,以免传播错误 https://blog.csdn.net/qq_15602569/article/details/79560614

最近在做velodyne的识别问题,导师让用深度学习,正好看到说是山东大学的PointCNN刷新了多项点云识别和分割的记录,就好好读读这篇论文。

这篇论文先举例子解释了为什么卷积无法直接应用在点云数据上。

如图1, 传统的卷积是作用在2维图像数据上。图像中每个像素的顺序是固定的,也就是说数据是结构化存储的。直接使用conv2d就能从这种潜在的空间结构中获取信息。

而点云数据是点集,如果直接使用卷积会出现图中234多种情况

        

    若直接使用卷积,则f2与f3的计算结果是相等的,但是从图中可知,23显示不同,这说明卷积无法获得点的空间信息

    而f3与f4的计算结果不等,但是图3与图4是相同的点集,必须得到相同的计算结果才合理,这说明卷积无法适应点集的N!种排列。

    在其他论文里,为了适应点云数据的这两种的特点采取的方式有体素化、3DCNN及PointNet提的对称操作(symmetric,这个翻译是我自己译的)

    而PointCNN里采用的是这样的策略:

        类似于空间变换网络(STN),从前一层的数据中取K个点,预测一个KxK大小的变换矩阵(X-transformation, 这个名字起的满满科幻风),用X矩阵前一层的特征做变换,然后对变换后的特征用卷积。


        论文里解释说:因为X2和X3是从不同形状的不同点中学习得到的,所以对输入的不同特征有不同权重,因此使得f2不在等于f3,而对于3和4,X3和X4 通过学习使得X3=X4π (这里是个大写的派,意思是排序矩阵),至于为啥不用像PointNet中一样使用对称操作,论文作者认为此种方法损失原始信息

    这也就是说次论文中学习的KxK是个一般矩阵,不再像PointNet中一样要求正则化。这必然会使得计算量增加,收敛性成疑。

    论文里接下里也说在实验中他们发现X-transformations和预想差的很远,尤其是在排序方面(想想也是,能适应N!种排序的矩阵要是这么好预测,无序问题不早解决了)。但是尽管如此,在卷积之前加上X变换,仍然能够大幅度改善卷积应用在点云上的性能。(要不然说是炼丹呢,不知道原因,就是好使。。。。)

    -----------------------------------------------------------------------------------------------------------------------

想法说完了,开始说点复杂的:

Hierarchical Convolution 分层卷积

先看CNN的卷积(太人性化了,少见这种用简单的东西去类比的作者,简直感动),CNN的输入是[R1,R1,C1]而卷积核的大小是[K,K,C1,C2]从前一层F1中大小为[K, K, C1]的区域生成F2中形状大小为[R2, R2, C2]的特征。其中R2<R1, C2>C1,即特征图的分辨率降低,但特征图数量增加,得到较高层次的信息。

    而PointCNN的输入时点集F1 = {(p1,i , f1,i ) : i = 1, 2, ..., N1},, 其中p是点的D维坐标(作者没有假设点的维数,所以这里用D,如果是3维空间D就是3),f是点对应的特征。这里N个点到底怎么取,在论文后面有提,这里先放着。

    对F1用 X-Conv(就是带X变换的卷积)得到F2 = {(p2,i , f2,i ) : f2,i ∈ RC2 , i =1, 2, ..., N2}。仿照CNN,这里也要求N2<N1, C2>C1, 所以随着一层一层的映射,点的数量会越来越少,而每个点的特征会越来越多

    

    上边的是CNN,通过conv提取特征,通过池化降采样,下面是PointCNN,类似。 通过X-Conv把点减少,把特征集中到某些点上。

    F2中的点怎么选,论文里说他们以后还要改进,暂时的实现是:对分类问题:p2是p1的随机下采样,对语义分割问题:p2是p1的最远点采样。  

   X-Conv Operator X卷积操作

    为了实现与conv类似的空间局部相关性,X-conv只作用于局部区域。在F2中的任何一个点,叫做p, 而p在F1中的K临近称作N。所以每一个X-conv针对p的输入是S = {(pi , fi ) : pi ∈ N}, 注意这里S是一个无序集合。不失一般性,S可以表示为KxD的矩阵,P = (p1,p2, ...,pK )T 和一个KxC1的矩阵F = (f1, f2, ..., fK )T。(一个是点的位置矩阵,一个是特征的矩阵),所以X-Conv的参数有K × (C1 + Cδ ) × C2个。(在后面提到)

具体的计算方法是:

    

1        P′ ← P − p 得到P相对于p的坐标

2        Fδ ← MLPδ (P′) 将每个点映射到Cδ维的空间中,逐点使用MLP

3        F∗ ← [Fδ , F] 把Fδ 和 F拼接起来 F∗ 是一个 K × (Cδ + C1) 矩阵(这里为啥要拼接还没读明白

4        X ← MLP(P′) 用P′预测KxK矩阵

5        FX ← X × F∗ 到这一步就做完X变换了

6        Fp ←Conv(K, FX) 做卷积

简介形式:

  

因为此式子中所有组件都是可微的,所以整个X-Conv是可微的,顾可以使用反向传播算法。


最后,补上P1中点的取法,用的是K临近或者是半径r内的随机K个点。到此,算法应该是完整了,还有一些X-Conv内部的想法,等过一段时间在详细写,先试试自己实现一份,看看在我的任务上的效果。



最后,附上原论文链接:https://arxiv.org/abs/1801.07791

原作者实现的TensorFlow代码:https://github.com/yangyanli/PointCNN

下一篇估计会是分析源码然后做pytorch实现

如果我写的有什么问题 欢迎指正。

没有更多推荐了,返回首页