文章目录
最近看了PointSIFT这篇文章,写一下笔记,有些地方还不是很明白,会回来补充。另外按照作者提供的方法,在服务器上用了10天才完成了整个网络的训练,感觉时间还是很长的。
题目:PointSIFT: A SIFT-like Network Module for 3D Point Cloud Semantic Segmentation
文章地址:https://arxiv.org/abs/1807.00652
代码地址:https://github.com/MVIG-SJTU/pointSIFT
摘要
we design a PointSIFT module that encodes information of different orientations and is adaptive to scale of shape.
Specifically, an orientation-encoding unit is designed to describe eight crucial orientations.
通过堆叠多个orientation-encoding单元,能够得到多次度的表征,
介绍
- 问题: 2D convolution misses out the 3D geometry information (normal and shape), while 3D convolution requires heavy computation.
- pointnet:It not only accelerates the computation but also notably improves the segmentation performance.
- SIFT:SIFT considers two fundamental features of shape representation, namely orientation-encoding and scale-awareness.具体而言,尺度感知意味着SIFT可以选择最具代表性的目标形状尺度,而方向编码可以全面地感知不同方向的图案。
- pointSIFT最重要的部分是一个方向编码单元,它将8个方向的最近点的特征进行卷积。进一步的堆叠OE单元能够提供不同的尺度,使得具有多尺度感知。
PointSIFT基本结构
- 合适的尺度
- 方向编码
PointSIFT模型
pointSIFT会计算以点p为中心的一组点的描述。
overview
- 输入输出都是n∗d
- n∗d的特征。
- 有多个堆叠单元,每个单元表示不同的尺度(除了最后一个单元),最后一层通过快捷方式连接汇总有短信息,来启用比例感知。每个单元都是一个方向编码卷积处理。
方向编码卷积
为了捕获形状模型,我们希望不同方向的形状信息能够被明确的编码。因此,针对所有的点提出了方向编码卷积,p0
p0和其具有的特征f0f0,3D空间以 p0p0为中心划分为8个octant(子空间),便是8个不同的方向。在每个点,搜寻距离p0
p0最近的点,用他的特征表征这个octant。因为远离p0的某些点无用于表示p0。在八分圆中,如果我们在搜索半径r内找不到任何点云,则使用特征f0来表示该八分圆。
为了使卷积具有方向意识,我们沿着三个轴即X,Y和Z执行三级卷积。将搜索点的特征放入张量M∈R2×2×2×d,其中前3个维度表示8个八分圆。例如(1,1,1)表示top-front-right八分圆的特征。三阶段定向卷积:
M1=g[Convx(Ax,M)]∈R2∗2∗d
M1=g[Convx(Ax,M)]∈R2∗2∗d
M2=g[Convy(Ay,M1)]∈R2∗dM2=g[Convy(Ay,M1)]∈R2∗d
M3=g[Convz(Az,M2)]∈R1∗dM3=g[Convz(Az,M2)]∈R1∗d
Ax,Ay,AzAx,Ay,Az是要优化的卷积权重,Convx(Convy,Convz)
Convx(Convy,Convz)是沿X(Y,Z)方向的卷积。g是ReLU(Batch_norm()).经过方向编码卷积,每个点被表示为d维度的矢量。该矢量以方向编码方式表示p0周围的形状图案。
- 计算复杂度和球查询搜索一样。
- 空间复杂度要小于pointnet++,因为只需要搜索最近的点。
- 相比于随机点搜索,我们的方案能够提出更可靠和稳定的表征点。
- 对于K近邻搜索,它可能遇到所有K个最近邻集中在一个小区域并降低表示能力的挑战。如下图所示:使用K近邻,所有选择点都来自一个方向(红点)。 如果我们选择不同方向的点(绿点),表示能力会更好。
多尺度意识
一个OE单元仅仅捕获了8个近邻的小尺度信息。但是如多堆叠多个OE单元来搭建深度网络,最后一个可以观察到如图1所示的大规模3D区域,并且不同的堆叠单元代表不同的尺度。理想情况下,在第i个堆叠单元中,神经元可以观察到8i
8i个点。 因此,我们有机会选择合适的比例。 我们的策略是通过快捷方式连接不同堆叠单元的输出。 因此,我们将比例选择留给整体网络优化。 为了优化性能,网络应选择非常适合定位形状的比例。
类似于SIFT尺度不变设计的原理,我们保持不同的尺度,从而选择最具代表性的尺度。 当然,网络可能不仅仅选择单一的规模,而是稀疏地关注一些规模。
整体架构
网络由编码和解码两部分组成。
- 输入是3D坐标(或者串联RGB值)的点,数量n=8192,
- MLP用作将输入的3D(6D)向量转变为64维的特征。
- 在编码阶段,同样用Pointnet++中的SA(set abstraction)模型。这一部分包括三步降采样操作,点的数量分别为1024,256,64。
- 解码阶段,使用FP(feature propagation)模型进行上采样操作,三步的点数为256,1034,8192.
- 我们的PointSIFT模块插在所有相邻的编码器和解码器层之间。 最后,最后一个解码器层中的所有特征都通过完全连接的层并转换为每个类别的概率。 请注意,PointSIFT是适用于各种体系结构的通用附加模块。
实验部分就不写了。
结论
- 方向编码单元捕获不同方向的信息。
- 网络可以自动从多尺度单位中选择合适的尺度并将它们组合在一起。
- PointSIFT模块可以轻松集成到不同的点输入网络中。