3P-RNN实现点云场景分割
《3D Recurrent Neural Networks with Context Fusion for Point Cloud Semantic Segmentation》论文笔记
一、论文摘要
基于3D点云的语义分割是一个非常开放的话题,基于神经网络的3D语义分割很难实现是因为3D点云所包含的内容信息太少。该论文作者构建了一个新的3P-RNN来实现点云的语义分割(之所以叫3P是因为其中有一个关键的步骤叫作Pointwise Pyramid Pooling)。首先,论文构建了一个高效的金字塔池化模型(pyramid pooling module)来提取3D点云的局部信息,再通过一个双向的RNN提取空间的点云全局依赖性。两个RNN通过不同的方向扫描3D空间提取信息,最终达到良好的3D语义分割的效果。
二、模型概述
以往的3D语义分割都现将3D点云体素化(voxelization),但是由于3D点云的稀疏性,体素化往往会导致很大的计算量。但自从Pointnet的出现,点云数据可以直接放入网络进行训练。Pointnet首先通过多层网络将原本三维的点云数据扩充到1024维,再通过一个对称函数max pooling使得其提取到全局的信息。但Pointnet同样在进行复杂点云的语义分割时具有许多的局限性:第一,其在max pooling的时候只考虑到了全局的信息(虽然后面Pointnet++中有部分解决这个问题,但是繁杂的步骤使其计算量很大);第二,其没有考虑到邻近点云的相互关系。(例如椅子总是贴近桌子等)作者针对第一个问题建立了一个金字塔池化模型(其利用的多步长的单窗口池化),而面对第二个问题其利用了一个双向RNN捕捉邻近点之间的关系(即对堆叠的feature map以x和y两个方向构建RNN网络)。
三、模型结构
作者在点云的处理上依然沿用了Pointnet的处理方法,Pointnet的具体细节可以查看 这里。简要来说,pointnet就是对点云数据逐个点的提取特征,经过了一系列的MLP(多层网络感知器),将本来三维的点云数据(n是点云中点的个数)映射到1024维的空间中,再通过一个对称的运算maxpooling提取其点云的全局信息将其压缩至。其具体的公式可以由下述公式表示:
其中C是channel通道的拼接操作,从1:N也能看出逐点计算特征。
在Pointnet出现后,有很多的网络试图改善其没有办法获取局部特征的缺陷——例如Pointnet++,首先选取一些比较重要的点作为每一个局部区域的中心点,然后在这些中心点的周围选取k个近邻点(欧式距离的近邻),再将k个近邻点作为一个局部点云采用pointnet网络来提取特征。其虽然有作用,但是却十分地繁杂并很耗费计算量,而本篇作者提出了一个逐点的金字塔池化模型(Pointwise Pyramid Pooling,简称3P)。
3P的表达式如下:
其中表示步长为1的不同尺寸的maxpooling的窗口大小,表示经过MLP的高维点云特征
作者认为以往stride大于1的pooling其主要目的在于压缩特征,故会损失掉很多有用的信息。作者的处理方法简单却有效,就是用了不同尺寸的步长为1的maxpooling来进行这一步对称运算。然后将其得到的特征再拼接起来形成新的特征输入后面的网络中(在实验中作者采用的pooling size是N,N/8和N/64)。其主要的优点在于没有在这些pooling操作中不需要训练参数,因此速度非常得快,效果也不错。
这里还需要解释一下其pyramid pooling和Pointnet中pooling的区别,可以先看下图(Pointnet的结构图),在Pointnet中,池化的作用实际上是将N个点云中的点的高维特征在N的维度上进行了max pooling,输出的结果是,其作用是归纳全局特征;而在3P模型中,其max pooling是在D的维度上进行的,输出的结果是,其中是经过了第i个尺寸的max pooling后的某个点的高维特征,因此它的作用对应的是Pointnet++中利用不同尺寸的k近邻归纳局部特征的那一步,而并非全局特征。全局特征的提取交给了剩下的RNN和MLP网络。