Introduction


论文在Introduction部分花费了大量的篇幅来解释卷积无法直接用在点云数据上的原因,大致主要是因为点云数据的无序性,难以用结构化的数据进行存储。如上图中,图中ii与iii虽然各个点的排序是相同的,但形状却不同,iii与iv虽然点的排序不同,但他们却是相同的点集。为了解决这一问题,作者提出使用空间变换网络(STN),从前一层的数据中取K个点,预测一个K×K大小的转置矩阵 (X-transformation),用转置矩阵对前一层的特征做变换,然后对变换后的特征用卷积。此外,同样也在提取出k近邻后,将各个点转换到局部坐标系。
X-transform有效性的可视化:

这里的想法与PointNet很相似,但PointCNN作者认为,PointNet等方法中所使用的对称操作造成了数据信息的损失,因此PointCNN中并没有使用。但实验结果好像不是特别的理想,变换矩阵确识带来了一些效果的提升,可与预想情况相差还蛮多的。
PointCNN的参数数量与训练耗时方面相较于此前的一些方法确实更优秀。
PointCNN结构

与CNN非常类似,仅在局部区域提取和特征学习上有所不同:在进行局部区域的选取时,CNN每次选取K×K大小的区域,而PointCNN则选择中心点周围的K个近邻点;在进行特征学习时,CNN使用Conv操作,而PointCNN使用X-Conv(具体操作细节在下文中)。
上图中,a、b为分类网络,c为分割网络。
在分类任务中,如a,使用两层X-Conv层,每个点的感受野为NK,其中K为相邻点的数目,N为前一层点的个数,最后一层因为可以看到所有点的信息,因此具有感受野1.0,具有整个形状的全局视图,可以在最后一层后加一个全连接层来实现分类。但由于最后一层X-Conv层的训练样本数量急剧下降,最后一层X-Conv层难以训练,为了解决这一问题,作者提出了b中的结构,为了保持网络深度,同时又保持感受野的增长率,引入CNN中空洞卷积的思想,定义了膨胀率D,也就是说,不总是以K个近邻点作为输入,而实从K×D个近邻点对K个输入点进行均匀采样,这样感受野就从NK增大到了NK×D。
在分割任务中,模仿Conv-DeConv的结构来实现PointCNN,Conv层与DeConv层唯一的不同在于输出的点数和特征通道数,与Conv层相比DeConv层的输出点数和特征通道数更少。此外,在最后的全连接层之前使用了Dropout和Subvolume supervision来防止过拟合。
分层卷积(Hierarchical Convolution)
作者与CNN的卷积操作进行了类比,对于输入点集F1=(p1,i,f1,i):i=1,2,...,N1,通过X-Conv(带有转换矩阵的卷积层)可得到输出点集F2=(p2,i,f2,i):i=1,2,...,N2,其中{p1,i:p1,i∈RD}是点的D维坐标,{f1,i:f1,i∈RC1}是点集对应的特征,F2符号含义同上。同CNN一致的是,随着逐层卷积,得到的点越来越少,但特征越来越丰富,即N2<N1,C2>C1,需要注意的是,{p2,i}不一定是{p1,i}的真子集。
在选取点集F1、F2时,对于分类问题p2是p1的随机下采样,对于分割问题p2是p1的最远点采样。
X卷积(X-Conv Operator)
与CNN的卷积操作类似,X-Conv只作用在局部区域,算法流程如下图:

-
P′←P−p 将点集P变换到以p点为中心的局部坐标系
-
Fδ←MLPδ(P′)逐点应用MLPδ,将P′从R3坐标空间映射到RCδ特征空间
-
F∗←[Fδ,F] 把Fδ 和F拼接起来,F∗ 是一个 K×(Cδ+C1) 矩阵
-
X←MLP(P′) 用MLP学习P′获得K×K的X变换矩阵
-
FX←X×F∗ 应用X变换矩阵加权置换 F∗
-
Fp←Conv(K,FX) 做卷积
上述算法流程总结为公式为:
Fp=X−Conv(K,p,P,F)=Conv(K,MLP(P−p)×[MLPδ(P−p),F])
F2中的点为p,p在F1中的K近邻为N,X-Conv的输入为S=(pi,fi):pi∈N(该集合是无序的),S可以表示为K×Dim的矩阵。因为P=(p1,p2,...pk)T,F=(f1,f2,...fK)T,故X-Conv的参数个数为K×(C1+Cδ)×C2