【全文翻译】PointRNN: Point Recurrent Neural Network for Moving Point Cloud Processing

在这里我给出我在pytorch框架下实现的计算CD和EMD的cuda加速代码,本人正在求学,需要在github页面刷刷经验,觉得代码有用的同学麻烦再github给个星星吧!
https://blog.csdn.net/taifengzikai/article/details/106994972
https://github.com/FengZicai/shape-measure
后续我会把我实现的pytorch版本的pointlstm完整工程放到github上。
实验的翻译也会补上,
谢谢大家了!


摘要

在本文中,介绍了用于移动点云处理的点递归神经网络(PointRNN)。在每个时间步长,PointRNN都将点座标P∈Rn×3和点特征X∈Rn×d作为输入(n和d分别表示点数和特征通道数)。 PointRNN的状态由点座标P和点状态S∈Rn×dl(dI表示状态通道的数量)组成。同样,PointRNN的输出由P和新的点特征Y∈Rn×dll(dII表示新特征通道的数量)组成。由于点云是无序的,因此无法直接操作两个时间步的点特征和状态。因此,采用基于点的时空局部相关来根据点座标聚合点特征和状态。还提出了PointRNN的两种变体,即点门控循环单元(PointGRU)和点长短期记忆(PointLSTM)。将PointRNN,PointGRU和PointLSTM应用于移动点云预测,该移动点云预测旨在根据给定的点的历史运动来预测点在集合中的未来轨迹。实验结果表明,PointRNN,PointGRU和PointL-STM能够在合成数据集和真实数据集上产生正确的预测,证明了它们对点云序列建模的能力。
论文链接:https://arxiv.org/pdf/1910.08287.pdf
代码链接:https://github.com/hehefan/PointRNN

主要贡献:

大多数现有的工作都集中在静态点云分析上,例如分类,分割和检测[22、23、15、20]。很少有作品研究动态点云。智能系统不仅需要了解周围的静态场景,还需要了解环境中的动态变化的能力。在本文中,提出了点递归神经网络(PointRNN)及其两个用于移动点云处理的变体。
在常规设置中,点云是3D空间中的一组点。通常,点云由点的三个座标P∈Rn×3及其特征X∈Rn×d(如果提供了特征)表示,其中n和d分别表示点数和特征通道。点云不规则格式的数据结构大大增加了挑战,使得图像和视频上的深度神经网络的许多现有成就无法直接处理点云。
循环神经网络(RNN)及其变体,例如长短期记忆(LSTM)[10]和门控循环单元(GRU)[5],非常适合处理时间序列数据。通常,(原始)RNN在时间步t处查看向量xt,将其内部状态(内存)st-1更新为st,然后输出新的向量yt。 RNN的行为可以表示如下:
在这里插入图片描述
其中θ表示RNN的参数。由于移动点云是一种时间序列,因此可以利用RNN对其进行处理。
然而,传统的RNN在处理点云序列上有两个严重的限制。一方面,RNN从一维向量中学习,其中输入,状态和输出高度紧凑。向量很难代表整个点云。尽管P和X可以展平为一维向量,但是这种操作严重破坏了数据结构,并增加了神经网络理解点云的难度。而且,该操作不独立于点排列。如果使用全局特征表示点云,则局部结构将丢失。为了克服这个问题,PointRNN直接将(P,X)作为输入。类似地,RNN中的一维状态s和输出y扩展到PointRNN中的二维S∈Rn×dl和Y∈Rn×dll,其中每行对应一个点。此外,由于S和Y取决于点座标,因此P被添加到PointRNN的状态和输出中。 PointRNN的行为可以表述为:
在这里插入图片描述
在图1中说明了RNN和PointRNN单元。
在这里插入图片描述
图1. RNN和PointRNN之间的比较。 在时间步t,RNN将向量xt作为输入,将其状态st-1更新为st,并输出向量yt。 PointRNN将点座标P t和点特征Xt用作输入,将其状态(P t-1,St-1)更新为(P t,St),并输出P t和新的点特征Y t。

另一方面,RNN基于连接操作将先前状态st-1和当前输入xt进行汇总(图2(a))。但是,由于点云是无序的,因此无法将串联直接应用于点云。为了解决这个问题,根据点座标采用时空局部相关来聚合Xt和St-1(图2(b))。具体来说,对于P t中的每个点,PointRNN首先在P t-1中搜索其邻居。其次,对于每个邻居,将查询点的特征,邻居的状态以及从邻居到查询点的位移连接起来,然后由共享的全连接(FC)层进行处理。最后,通过合并将处理后的串联简化为单个表示。

本文的主要贡献是:
PointRNN提供了点云序列处理的基本组件。由于它可能会遇到与RNN相同的爆炸和消失梯度问题,因此通过将PointRNN与GRU和LSTM相结合,为PointRNN提出了两种变体,即点门控循环单元(PointGRU)和点长短期记忆(PointLSTM),分别。将PointRNN,PointGRU和PointLSTM应用于移动点云预测。给定点云的历史运动,此任务的目标是预测其点的未来轨迹。预测未来点云的移动方式可以帮助机器人和自动驾驶汽车计划其行动并做出决策。而且,移动点云预测具有先天优势,即不需要人工注释的监督。基于PointRNN,PointGRU和PointLSTM,建立了序列到序列(seq2seq)[28]模型来预测移动点云。在合成的运动MNIST点云数据集和两个大型自动驾驶数据集,即Argoverse [3]和nuScenes [2]上的实验结果表明,PointRNN,PointGRU和PointLSTM产生正确的预测,证实了它们处理运动点云的能力。

在这里插入图片描述
图2. a)RNN通过连接操作,然后是全连接(FC)层,聚合输入xt∈Rd和状态st-1∈Rdl。 b)PointRNN通过时空局部相关性根据点座标将Xt∈Rn×d和St-1∈Rn×dl聚合。 首先,对于P t∈Rn×3中的每个点,PointRNN搜索P t-1中的k个邻居。 其次,对于每个邻居,将Xt中查询点的特征,St-1中的邻居状态以及从邻居到查询点的位移连接在一起。 第三,由FC层处理k个级联表示。 最后,合并用于合并k个表示。

算法框架:

一、PointRNN
在本节中,首先回顾标准(普通)RNN,然后详细描述的PointRNN。RNN是一类深层神经网络,它使用其状态来处理输入序列。这使其具有时间动态行为。 RNN依靠串联操作汇总过去和当前,在本文中称为rnn函数,
在这里插入图片描述
其中▪表示矩阵乘法,而[▪,▪]表示串联。W∈Rdl×(d + dl)和b∈Rdl是要学习的RNN的参数。可以通过深度神经网络中的全连接(FC)层来实现此操作(如图2(a)所示)。通常,RNN使用其状态st作为输出,即yt = st。
传统的RNN从一维向量中学习,从而将其应用于过程点云序列。为了保持空间结构,建议直接将座标Pt∈Rn×3和特征Xt∈Rn×d作为输入。类似地,RNN中的状态st和输出yt扩展到PointRNN中的St∈Rn×dl和Yt∈Rn×dll。等式(2)中表示了第t步PointNNN点状态的更新。
在这里插入图片描述
其中W∈Rdl×(d + dl + 3),b∈Rdl和N(▪)是邻域查询。将此基于点的时空局部相关称为point-rnn。与RNN类似,默认情况下,PointRNN使用St作为输出,即Y t = St.
point-rnn函数的目标是根据点座标汇总过去和当前(如图2(b)所示)。给定(Pt,Xt)和(Pt-1,St-1),point-rnn根据Pt和Pt-1合并Xt和St-1。具体地,对于Pt中的每个点,以第i个点Pit为例,point-rnn首先在Pt-1中找到其邻居。邻居可能共享有关查询点Pit的相同几何形状和运动信息。其次,对于每个邻居,以邻居P jt-1为例,将查询点的特征Xit,邻居的状态Sj t-1,以及从邻居到查询点的位移Pit - Pjt-1进行级联,随后由共享FC层进行处理。第三,将处理后的串联合并为单个表示。point-rnn的输出,即St,包含Pt中每个点的过去和当前信息。
采用两种方法进行邻域查询。第一个直接为查询点(kNN)找到k个最近的邻居。 第二个方法是,首先找到距查询点半径范围内的所有点,然后从这些点采样k个邻居(球形查询[23])。 由于点云是一组无序点,因此同一行上两个时间步的点状态或特征可能对应于不同点。如果没有点座标,则独立的St或Y t毫无意义。因此,将点座标P t添加到PointRNN的状态和输出中。
PointRNN提供了一个原型,该原型使用RNN来处理点云序列。 PointRNN中的每个组件都是必需的。 但是,可以设计出更有效的时空-局部相关方法来代替point-rnn,这在以后可以进一步研究。
二、PointGRU和PointLSTM
因为PointRNN继承了RNN,所以它可能会遇到与RNN相同的爆炸和消失梯度问题。因此,提出了两种变体,分别将PointRNN与GRU和LSTM结合起来以克服这些问题。将GRU中的级联运算替换为时空局部相关运算,即point-rnn,形成PointGRU单元。第t步中PointGRU的更新公式如下:
在这里插入图片描述
其中Zt是更新门,Rt是复位门。 σ(▪)表示sigmoid函数,⊙表示Hadamard乘积。与PointRNN相似,PointGRU的输入为(P t,Xt),状态为(P t,St),默认情况下,输出为(P t,St)。注意,除了point-rnn函数之外,GRU和PointGRU之间的另一个区别是,PointGRU还有一个附加步骤Sˆt-1。此步骤的目标是根据当前输入点P t加权和置换St-1。只有在此步骤之后,才能在先前状态Sˆt-1和当前复位门Rt之间执行Hadamard积。
类似地,LSTM中的串联操作被替换为point-rnn函数,从而形成PointLSTM单元。第t步对PointLSTM的更新的公式如下:
在这里插入图片描述

其中,It是输入门,F t是忘记门,Ot是输出门,Ct是单元状态,Ht是隐藏状态。 PointLSTM的输入为(P t,Xt),状态为(P t,Ht,Ct),默认情况下,输出为(Pt,Ht)。 像从GRU到PointGRU一样,与LSTM相比,PointL- STM还有一个附加步骤Cˆ t-1,它根据当前输入点P t加权和置换Ct-1。
三、移动点云预测框架
运动点云提供了场景中的大量几何信息以及运动中的深刻动态变化。了解场景并想象3D空间中的运动是机器人和自动驾驶汽车平台的基本能力。毫无疑问,能够预测云中点未来轨迹的智能系统将具有这些能力。在本文中,作者将PointRNN,PointGRU和PointLSTM应用于移动点云预测。由于此任务不需要外部人工注释的监督,因此可以无监督的方式训练模型。
基于seq2seq框架设计了一个基本模型和一个高级模型。基本模型(如图3(a)所示)由两部分组成,即,一部分用于编码给定点云序列,另一部分用于预测。具体而言,编码PointRNN,PointGRU或PointLSTM单元会逐个监视输入点云。观察最后一个输入P t后,其状态将用于初始化预测PointRNN,PointGRU或PointLSTM单元的状态。然后,预测单元将P t作为输入并开始进行预测。预测模型不是直接生成预测的点座标,而是预测当前步骤和下一步之间将发生的位移ΔPt,可以看作3D场景流[17,9]。
可以堆叠多个PointRNN,PointGRU或PointLSTM单元,以构建用于分层预测的多层结构。但是,由于所有点都在每一层中进行处理,因此此结构的主要问题是计算量大,尤其是对于高分辨率点集。为了缓解这个问题,提出了一个高级模型(如图3(b)所示)。该模型借鉴了PointNet ++ [23]的两个组件,即1)下采样点及其特征的采样操作和分组操作,以及2)用于将与中间点相关联的表示上采样到原始点的特征传播层。通过这种向下采样结构,高级模型可以利用分层学习的优势,同时减少每层中要处理的点。
在这里插入图片描述
图3.移动点云预测的架构。 a)基本模型(具有一个PointRNN层)。 PointRNN将给定的点云序列编码为状态(P t,St),然后将其用于初始化预测PointRNN的状态。 可以沿输出方向堆叠多个PointRNN层。 通过P t +ΔPt达到预测P~t + 1。 b)预测高级模型的一部分(具有三个PointRNN层)。 采样(S)和分组(G)分别用于对点和组要素进行下采样。 PointRNN汇总过去和当前,并输出特征以进行预测。 特征传播(FP)层用于将特征从子采样点传播到原始点。 全连接(FC)层使特征回归到预测位移∆P t。

四、训练
有两种训练循环神经网络的策略。第一个方法是在预测过程中使用ground truths作为输入,这称为teacher-forcing训练。第二种方法使用网络生成的预测作为输入(图3(a)),称为free- running训练。当使用teacher-forcing训练时,发现模型很快陷入了局部最优状态,其中对于所有输入而言,∆P t趋于为0。因此,采用free- running的培训策略。
由于点云是无序的,因此point-to-point损失函数无法直接应用于计算预测值与ground truths之间的差。损失函数应不变于输入点的顺序。在本文中,采用倒角距离(CD)和搬土距离(EMD)。点集P和P I之间的CD定义如下:
在这里插入图片描述
基本上,此损失函数是最近邻距离度量标准,可以双向测量两组误差。 P中的每个点都映射到P I中的最近点,反之亦然。 从P到P I的EMD定义如下:
在这里插入图片描述
其中φ:P-> P I是双射。 EMD计算两个点云之间的点对点映射。 总损失如下
在这里插入图片描述
其中超参数α,β≥0。

在这里我给出我在pytorch框架下实现的计算CD和EMD的cuda加速代码,本人正在求学,需要在github页面刷刷经验,觉得代码有用的同学麻烦再github给个星星吧!
https://blog.csdn.net/taifengzikai/article/details/106994972
https://github.com/FengZicai/shape-measure

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章