论文学习笔记(一) PointCNN

『写在前面』
\qquad 最近在研究点云数据处理与应用,将学习论文中的一些值得记录和思考的点记录于此,方便自己后续回忆要点。建议参照原版paper使用,刚开始学写blog,欢迎各位指正纰漏。

  • 论文出处:CVPR 2018
  • 作者机构:Yangyan Li等,山东大学

Abstract

  • 传统CNNs成功之处在于利用了空间局部相关性

  • 而点云数据往往不规则且无序,如果直接应用传统的卷积运算,不但会丢失形状信息,还会受到点集顺序变化的影响

  • 为了解决上述问题,本文提出了X-transformation,并且结合传统的卷积运算,构成X-conv模块,也就是PointCNN的building block。

1 Introduction

  • 在某些情况下,使用point cloud表示数据比使用dense grid更为有效:比如三维空间中的平面,二维空间中的直线等。

以三维空间的平面为例:
如使用point cloud表示, S ( p 1 , p 2 , , p N ) S(p_1,p_2,···,p_N) 其中, N N 表示点的数量, p i = ( p i 1 , p i 2 , p i 3 ) p_i=(p_{i1},p_{i2},p_{i3}) 表示各点坐标,那么 S S 的数据量为 3 N 3N .
如使用dense grid表示,假设空间大小为 M M M M*M*M ,则数据量大小为 M 3 M^3
一般情况下, M 3 > 3 N M^3>3N ,所以Point Cloud效率更高?

  • f i i = f i i i f_{ii}=f{iii} ,但二者形状不同,故CNNs会丢失形状信息; f i i i f i v f_{iii} \neq f{iv} ,但其实二者代表的是统一形状,只是顺序不同,说明CNNs无法适应不同点集顺序。
    Fig.1

Equ.1

  • X-transformation.
    \qquad 从K个输入点中学习一个K×K的矩阵:
    X = M L P ( p 1 , p 2 , . . . , p K ) X={\rm {MLP}}(p_1,p_2,...,p_K)
    \qquad 使用X对输入特征同步进行加权和排列,最后对变换后的特征进行卷积,称这一系列操作为X-Conv,这也是PointCNN的基本模块。

Equ.2
关于这一段的理解:

  • X i i X_{ii} X i i i X_{iii} 从不同形状的点集中学习得到,故可以使得 f i i f_{ii} f i i i f_{iii} 不同;
  • 通过学习得到的 X i i i X_{iii} 可能等于 X i v × π X_{iv}\times\pi ,且 π × [ f a , f b , f c , f d ] T = [ f c , f a , f b , f d ] T \pi\times[f_a,f_b,f_c,f_d]^T=[f_c,f_a,f_b,f_d]^T ,所以使得 f i i i = f i v f_{iii}=f_{iv} .

\qquad 理想情况下,X-transformation可以做到考察点集形状的同时不受点集顺序的影响。但实际中,作者发现其效果并不理想,尤其是点集顺序重排

2 Related Work

  • PointCNN做到了输入特征表示和卷积核的稀疏性

  • PointNet和Deep Sets使用对称函数(symmetric function)来克服输入点集的无序性。尽管对称函数有理论支撑,但它带来丢失信息的代价。

  • 作者认为,PointCNN中的X-Conv结构在提取局部特征时,比PointNet中使用的最大池化表现更好。

  • STNs中使用了对称矩阵作为kernel。而在PointCNN中,X-transformation需要同时服务于权值和排序,所以使用了普通矩阵建模。意思是,如果只用来做排序,就可以用其他加以限制的矩阵实现?比如文中举了个例子doubly stochastic matrix(还没有具体看这块)。

3 PointCNN

3.1 Hierarchical Convolution

  • CNNs的分层结构会使得分辨率越来越小,通道数越来越多,feature map编码更高层的信息。

  • X-Conv参考CNNs分层结构的思想,将输入点集映射或聚合到下一层,“less and less points, richer and richer features”.

  • 需要注意的是, F 2 F_2 基于的点集( p 2 p_2 )并不一定要求是 F 1 F_1 基于的点集的子集( p 1 p_1 ).但在本文实现中,使用的都是采样的方法(所以都是子集):分类任务,使用随机下采样方法获得 p 2 p_2 ;而分割任务中,使用FPS(最远点采样法)。
    作者提到,他们认为一些代表点生成算法可能更加有效,如Deep Points。

3.2 X-Conv Operator

  • X-Conv使用 p 2 p_2 p 1 p_1 中的邻近点集作为输入

N \Bbb N p 2 p_2 p 1 p_1 中的邻近点集。从 N \Bbb N 中采样 K K 个点,得到X-Conv的输入 S \Bbb S S \Bbb S 是一个无序点集,可以表示为 [ P K × D F K × C 1 ] [P_{K\times D}|F_{K\times {C_1}}] 进而,可以得到,X-Conv中的trainable kernel是一个tensor K \bf K ,其大小为 K × ( C 1 + C δ ) × C 2 K\times (C_1+C_\delta)\times C_2 .

  • X-Conv算法描述

    输入: K K - trainable kernel
    p p - 映射/聚合标点
    P P - 输入点集
    F F - 输入点的特征集

    输出: F p F_p - 映射/聚合到 p p 的特征

    步骤:

    1. 将输入点集 P P 中各点坐标迁移到以点 p p 为原点的相对坐标系,得到点集合 P P^′
    2. 通过MLP将 P P` 中每个点映射到高维空间 δ \delta 中,得到特征矩阵 F δ F_\delta
    3. 将输入点的特征集 F F 和上一步得到的特征矩阵 F δ F_\delta 直接拼接,得到新的特征矩阵 F F_*
    4. 使用MLP从点集合 P P^′ 中学习到一个K×K大小的变换矩阵 X X
    5. 使用变换矩阵 X X 对特征矩阵 F F_* 进行矩阵变换(加权&排序),得到特征矩阵 F X F_X
    6. K K F X F_X 进行卷积,得到输出特征矩阵 F p F_p .

因为上述算法中所涉及到的卷积、MLP和矩阵乘法都是可微分的,故整个X-Conv模块可微,可以很方便地使用BP算法训练。

上文中提到,X-Conv的kernel size为 K × ( C 1 + C δ ) × C 2 K\times (C_1+C_\delta)\times C_2 ,其参数量主要受 K K 影响,与CNNs中的平方和3D-CNNs中的立方相比,具有稀疏性。可以节省内存和算力。Sparse kernel的一个好处是可以在不显著增加参数数量的情况下耦合较远距离信息

  • 关于局部坐标系的几点讨论
    \quad 1. X-Conv被设计用来刻画局部点集信息,所以应转换到中心点的相对坐标系。
    \quad 2. 注意一个点可能会是多个代表性点的邻近点,所以这样的点可能以不同的相对坐标作用在不同的代表性点上(Figure.3 主要就是在解释这个)。
    \quad 3. 局部坐标应作为部分特征输入到X-Conv中,但由于坐标特征与其他额外的特征相比,维度一般较低(不一致),故作者通过MLP来进行高维映射,以得到更加抽象的特征表示(该做法与PointNet类似)。

  • 关于X-Conv的几点讨论
    \quad 1. X-Conv的一个优点是它可以以一种统一的形式作用在有或没有额外特征的点云数据上,如XYZ点云、XYZI点云等。例如对XYZ点云而言,X-Conv层的输入只有 F δ F_\delta ,没有 F F
    \quad 2. 理论上,X-变换既可以用在feature上,也可以用在kernel上。但为了便于运行标准的卷积运算(一般建模成kernel被训练,而不是被X-变换“孵化”出来的kernel再训练),作者用在了变换feature上。

3.3 PointCNN Architecture

  • CNNs中的卷积层 VS PointCNN中的X-Conv结构
    \quad 1. 局部区域提取:卷积层使用K×K的窗口,X-Conv使用K-近邻;
    \quad 2. 学习特征的方法不同。

  • 感知野
    \quad 定义每个代表性点的感知野 K / N K/N ,其中 K K 代表近邻点数, N N 代表上一层的总点数。 K / N = 1 K/N=1 意味着本层的代表点get到了上一层的全局信息。

Fig.4

  • 分类网络结构
    \qquad 论文中,作者给出了两款用于完成分类任务的网络结构,Figure 4(a) 和 Figure 4(b).(a)中给出的网络结构采样数下降过快,导致X-Conv层不能被充分训练。作者为了改进此问题,提出了(b)结构,旨在控制网络深度的同时兼顾感知野的增长速度,使模型具有"see larger and larger"的能力。
    \qquad 借鉴CNNs中膨胀卷积的思想,作者也引入了膨胀因子 D D 。具体做法是从 K × D K×D 个近邻点中均匀采样得到最后的K个近邻点。这样使得在不增加近邻点数量,也就是没有增大kernel size的情况下,将感知野从 K / D K/D 增大到 ( K × D ) / N (K\times D)/N 。如图(b)所示,在fc层之前的4个代表点都可以看到整个形状,所以它们都具有进行预测的能力。

  • 分割网络结构
    \qquad 采用类似Conv&DeConv的结构,并且在Conv阶段和DeConv采用的均是X-Conv结构。不同之处在于在DeConv处,输出比输入含有更多的点数和更少的特征数

  • 其他Trick的使用
    \quad 1. 激活函数选择使用ELU(Exponential Linear Unit),数学表达如下所示。

摘自:https://blog.csdn.net/qq_20909377/article/details/79133981
其中 α \alpha 是一个可调整的参数,它控制着ELU负值部分在何时饱和。右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。
tensorflow中:tf.nn.elu(features, name=None)

f ( x ) = { x , if  x > 0 α ( e x 1 ) , if  x 0 f(x) = \begin{cases} x, & \text{if $x>0$} \\ \alpha(e^x-1), & \text{if $x\leq0$} \end{cases}
f ( x ) = { 1 , if  x > 0 α + f ( x ) , if  x 0 f^′(x) = \begin{cases} 1, & \text{if $x>0$} \\ \alpha+f(x), & \text{if $x\leq0$} \end{cases}
在这里插入图片描述

\quad 2. BN层的使用。在 P P^′ F p F_p 和全连接层(最后一层除外)上采用了批归一化。但没有用在MLP δ _\delta 和MLP上,因为 F F_* X X ,尤其是 X X ,旨在实现对特殊代表点的特定表示。

\quad 3. 卷积运算使用了分离卷积(separable convolution)以降低参数数量和计算消耗。

\quad 4. 在最后一个全连接层之前加了Dropout,还使用了"subvolume supervision"来缓解过拟合。

\quad 5. 最后一个X-Conv层中,感知野被设置为小于1的值,这样做的目的是使得该层的输出仅能涵盖原始数据中的部分信息,迫使模型在训练过程中更多地去学习如何捕捉有价值的局部信息。

\quad 6. 关于数据增强。随机采样和打乱顺序。作者建议,如果想要训练一个以N个点作为输入的PointCNN模型,各训练样本点数的的选择应服从高斯分布 N ( N , ( N / 8 ) 2 ) {\Bbb {N}}(N,(N/8)^2) ,这点至关重要。

猜你喜欢

转载自blog.csdn.net/sinat_37532065/article/details/83001494