「论文阅读」PCT:Point Cloud Transformer

目录

PCT的点云处理

编码器(Encoder):

物体分类

语义分割

法线估计

Naive PCT

SPCT

全PCT


受Transformer在视觉和nlp任务方面的成功启发,我们基于传统Transformer的原理,提出了一个用于点云学习的新框架PCT。PCT的核心思想是利用Transformer固有的顺序不变性,避免了点云数据顺序的定义,并通过注意机制进行特征学习。

该文章提出的PCT可以处理的任务有物体分类、语义分割和法线估计。

针对点云处理任务,PCT做出的主要调整如下:

基于点坐标的位置嵌入模块:

Transformer在处理自然语言的时候给每个单词嵌入了在句子中的位置信息,然而点云是无序的,因此在pct中将原始的transformer中的位置编码的嵌入改成了一个基于坐标的输入嵌入模块中,他可以输出可区分的特征,因为点云中每个点都是独一无二的。

优化的偏移Attention模块:

工作原理是用自注意模块输入与注意特征之间的偏移量代替注意特征。这有两个好处:

1:点云刚性变换后,绝对位置坐标不同,而相对位置坐标不变

2:(没看懂)(偏移注意本身具有的置换不变性?)

邻居嵌入模块:

在自然语言处理中每个词都蕴含词本身的信息,而在点云中,每个点单独拎出来是没有任何意义的,除非能考虑到这个点周围的邻居。因此使用邻接嵌入策略来改进点嵌入。它还通过考虑包含语义信息的局部点组之间的注意而不是单个点之间的注意来辅助注意模块。

通过上述调整,PCT变得更适合于点云特征学习,并在形状分类、部件分割和常规估计任务上取得了最先进的性能。

PCT的点云处理

「论文阅读」PCT:Point Cloud Transformer_第1张图片

PCT的总体架构。编码器(Encoder)主要由输入嵌入模块和四个堆叠的注意力模块组成。解码器(Decoder)主要包含多个线性层。每个模块上面的数字表示其输出通道。MA-Pool即最大池化和平均池化的组合。LBR是Linear,BatchNorm and ReLU layers的组合。LBRD是LBR再加一个Dropout。

编码器(Encoder):

PCT的目标是将输入点转换(编码)到一个新的高维特征空间,以表征点之间的语义亲和度,作为各种点云处理任务的基础。pct的编码器首先将输入坐标嵌入到新的特征空间中。然后将嵌入的特征输入到4个堆叠的注意模块中,学习每个点的语义丰富和有区别的表示,然后线性层生成输出特征。总的来说,PCT的编码器与原始Transformer的设计理念几乎相同,除了位置嵌入被丢弃,因为点的坐标已经包含了这些信息。

给定一个有N个点的点云,以及每个点有d维的特征(坐标或者坐标+RGB等),这N*d的矩阵首先经过网络最前面的输入嵌入层(input embeding,网络最前面那个灰色的方块),抽象每个点的特征,抽象之后变成N*de,然后经过级联+残差的四个注意力模块之后,或者四个注意力模块输出的特征N*Fi,这四个注意力模块的特征做拼接,拼接之后做一个线性变换,得到那个1024通道的特征图,这个过程的公式如下:

ATi表示第i个注意力层。

Wo表示一个线性变换的权重,乘这个权重表示进行了一次线性变换。

最后输出的Fo表示每个点的特征。

物体分类

对这个特征图做MA-Pool之后,得到一个特征向量Fg,对特征向量Fg持续降维,可以实现物体的分类。

(根据颜色我们知道,前两次变换都是LBRD的变换,最后一次变换是一个线性变换)

语义分割

将逐点标签Fo和全局标签Fg做拼接,使得每个点都具有局部和全局的特征表示。

(文章还说将独热向量类别信息编码成64维的表示并和全局特征Fg做拼接,我没看懂)

法线估计

采用和分割任务相同的架构,设置Ns=3.(没太看懂这个Ns=3是个啥)

Naive PCT

(朴素的PCT,点嵌入和Transformer原始的注意力计算方案)

在Naive PCT中,最简单的方法就是类比NLP任务,将点云视为一个句子,将点视为一个个单词。

Naive PCT采用了点嵌入(类比词嵌入)和原始的自注意力机制(Attention is all you need里面的)。

点嵌入忽略了点之间的交互,与词嵌入类似,点嵌入的目的是将语义相似的点在嵌入空间中放置得更近。

具体来说,是将一个d维度的点云(作者只是用了xyz坐标,所以这里d=3)嵌入到一个Fe∈N*de的空间里面(d→de,作者根据经验将de=128),方式是使用一个共享的神经网络,该神经网络由两个级联LBR组成,每个LBR的输出都为de维。

嵌入完成后,得到的是de维的向量。

将de维的向量作为接下来自注意力模块的输入,自注意力模块的输入记为Fin∈N*de。

自注意力的计算公式如下:

「论文阅读」PCT:Point Cloud Transformer_第2张图片 da和de可以不相等,为了兼顾计算效率,作者将de设为da的四倍。

得到Q和K之后,相乘得到注意力权重A~=a~ij:

 然后将这些注意力权重归一化,得到A=a ij:

「论文阅读」PCT:Point Cloud Transformer_第3张图片

 最后权重分数A点乘V矩阵,得到加权后的向量表示:

「论文阅读」PCT:Point Cloud Transformer_第4张图片

 以上这些过程都是置换不变的。

最后,利用上面计算到的自注意力特征Fsa经过一个LBR后和自注意力模块的输入特征Fin相加(借鉴了ResNet的思想?),最后得到注意力模块的特征。

SPCT

加入Offset-Attention(偏移注意力)

作者发现,在对点云应用Transformer时,如果用偏移注意(OA)模块替换原有的自注意(SA)模块来增强PCT,可以获得更好的性能。

如下图所示,偏移注意层通过逐元素减法计算自注意(SA)特征与输入特征之间的偏移(差)。这个偏移量提供给LBR网络,代替näıve版本中使用的SA特性:

 由(6)升级到了(7)

其中:

「论文阅读」PCT:Point Cloud Transformer_第5张图片

 PCT增强型版本中,还通过对式4进行改进,细化了归一化,如下所示:

「论文阅读」PCT:Point Cloud Transformer_第6张图片

即在第一维上使用了softmax,第二维上使用了l1正则化。

PCT

邻居嵌入来增强局部特征表示

「论文阅读」PCT:Point Cloud Transformer_第7张图片

 左边:是邻居嵌入模块,两个LBR和两个SG;

中间:分组采样层Nin个输入点以及din通道数,输出是Nout个输出点和dout个输出通道;(这里的通道数可理解为每个点的特征维数)

具有点嵌入的PCT是一种提取全局特征的有效网络。但是,它忽略了点云学习中同样重要的局部邻域信息。

作者借鉴PointNet++和DGCNN的思想设计了一种局部邻居聚合策略,即邻居嵌入,对点嵌入进行优化,以增强PCT的局部特征提取能力。

邻居嵌入模块包括两个LBR层和两个SG(采样分组)层。LBR层实现点嵌入,两个级联的SG层在特征聚合过程中逐步扩大感受野(SG层使用的是KNN算法)

说得更详细点,假设输入点云有N个点,每个点有特征F;输出点云有Ns个点,每个点的特征表示为Fs;

首先使用FPS算法将N个点采样到Ns个点,然后使用KNN算法,以Ns个点为中心点,从N个点中查找每个中心点的K个邻居,然后使用以下公式计算Fs(Fs就是每个中心点聚合邻居后的特征):

「论文阅读」PCT:Point Cloud Transformer_第8张图片

 

(上面这堆公式没太看懂,建议结合图片再仔细理解下)

你可能感兴趣的:(深度学习点云处理,transformer,自然语言处理,深度学习)