笔者是大二学生,理解比较浅薄,欢迎大家对文章问题进行指正。
一、Pointnet
(一)前提:
1、基于点云的置换不变性(无序性)使得其设计的网络必须是一个对称函数。
(置换不变性:点的排序不影响物体的性质)
2、某点与其邻域内点之间的相互关系构成了局部特征。
3、旋转,平移等变换不会影响点云的性质。
(二)框架:
首先输入一个n×3的原始点云(n个点3个维度x、y、z)通过一个inputtransform将点云旋转到正面,之后将每个点输入到mlp网络中,(一共n个点每个点都是一个[xi yi zi]的向量),进行上采样将3维特征映射到64维度上。之后重复上述步骤,点云旋转,将点云特征向高维度映射,最后原来n个具有三维特征的点,变为n个具有1024维特征的数据,最后采用对称函数--最大池化函数,将n个点每一维采用最大池,输出一个1×1024的全局特征向量。
如果是分类问题,直接进入mlp网络输出每一类的概率。如果是分割问题再将全局特征向量与64维的逐点特征向量上然后通过两次mlp输出逐点的分类概率。
(三)效果
二、Pointnet++
(一)背景
Pointnet++主要是为了克服在pointnet中存在的缺失局部特征的问题。(从上文中可以看出,Pointnet侧重于提取全局向量,即使在分割问题上也只是简单地将全局特征变量拼接在逐点的64维特征上,显然缺乏对局部特征的提取)
(二)框架
作者借鉴了CNN多层感受野的思想,首先通过(Sampling)随机采样选出一部分点作为局部特征的质心,然后(Grouping)将其邻域内的点划为一簇作为此部分的局部特征点,在局部范围内采用Pointnet提取出局部的全局特征向量,之后逐层进行上述过程,直到提取出全局特征为止。
如果是分类问题,直接进入全连接层输出分类概率即可。 如果是分割问题,则进行上采样(解码),采用线性插值的方法给点作填充最后输出每个点的分类概率。
(简单来说就是距离质心越远的点赋予的权重越小)
(三)改进
为解决上述提出的框架在点缺少时鲁棒性变得很差的情况,作者引入了多个尺度或者分辨率的Grouping,当点云稠密时尺度较小的Grouping与分辨率高的Grouping权重更大,当点云稀疏时,则相反。
(四)效果
三、PointSIFT
(一)背景
1、点云稀疏使得算法效率低下。
2、点与点之间的关系无法较好表示。
(二)框架
1、PointSIFT模块
作者借鉴了SIFT的思想,对于原始点云数据(n×d),以特征点p0为中心,将空间分割为八个方向,每个方向采用离f最近的点为该方向的特征点,如果在某一方向上在r半径内没有找到该方向上的特征点则用p0本身代替。这样以来,我们使得每一个点都有八个特征,数据变为n×8×d。之后对于x、y、z方向分别进行一次卷积,每次将八个特征两两结合。三次过后数据就从n×8×d变为n×d最后进入relu函数。
2、尺度感知
为了能扩大感受野,如同Pointnet++一样,采用多层PointSIFT进行卷积,用多个方向以增大感受野,最后将多个个方向的特征用残差进行拼接,采用卷积进行选择,最后输出n×d个特征。
(三)将PointSIFT穿插于Pointnet++中
作者首先将原始点云(n=8192,d=3 or 6)输入到 mlp网络中,输出8192×64维的数据,再经过PointSIFT进行特征提取,输出形状不变。之后进入Pointnet的SA层(Sampling、Grouping&Pointnet)输出1024×128维数据,之后修改参数重复过程变为64×512维数据。
之后,采用线性插值的方法进行上采样,然后进入PointSIFT。重复操作得到8192个点的128维特征,最后进入全连接层输出每个点的分类概率。
(四)效果
参考博客:
论文阅读PointSIFT_JiangZuning的博客-CSDN博客
【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码_小执着的博客-CSDN博客_pointnet