上一篇(pointnet网络 <https://blog.csdn.net/qq_15332903/article/details/80224387>
)主要引入了三维深度学习相关的一些背景知识,并介绍了pointnet整体思想和框架,那这一篇来介绍出自同一团队的基于pointnet改进的pointnet++。同样,
以下所有的解读基于点云分类。

一、pointnet存在的问题


二、pointnet++网络结构详解

三、pointnet++代码详解


一、pointnet存在的问题

pointnet只是简单的将所有点连接起来,只考虑了全局特征,但丢失了每个点的局部信息,如下图(以点云分割为例):




所以继pointnet之后,很多人的着重点都在提取局部区域特征
方面。为了解决这个问题,pointnet++的整体思想就是:首先选取一些比较重要的点作为每一个局部区域的中心点,然后在这些中心点的周围选取k个近邻点
(欧式距离的近邻)。再将k个近邻点作为一个局部点云采用pointnet网络来提取特征。


二、pointnet++网络结构详解


网络的两个亮点:


    1.改进特征提取方法:pointnet++使用了分层抽取特征的思想,把每一次叫做set
abstraction。分为三部分:采样层、分组层、特征提取层。首先来看采样层,为了从稠密的点云中抽取出一些相对较为重要的中心点,采用FPS(farthest
point
sampling)最远点采样法,这些点并不一定具有语义信息。当然也可以随机采样;然后是分组层,在上一层提取出的中心点的某个范围内寻找最近个k近邻点组成patch
;特征提取层是将这k个点通过小型pointnet网络进行卷积和pooling得到的特征作为此中心点的特征,再送入下一个分层继续。这样每一层得到的中心点都是上一层中心点的子集,并且随着层数加深,中心点的个数越来越少,但是每一个中心点包含的信息越来越多。



    2.解决点云密度不同问题:由于采集时会出现采样密度不均的问题,所以通过固定范围选取的固定个数的近邻点是不合适的。pointnet++提出了两个解决方案。




    方案一:多尺度分组

        如上图左所示,比较直观的思想是,在每一个分组层都通过多个尺度来确定每一个中心点的邻域范围,并经过pointnet提取特征之后将多个特征联合
起来,得到一个多尺度的新特征。


    方案二:多分辨率分组


        很明显,通过上述做法,对于每一个中心点都需要多个patch的选取与卷积,计算开销很大,所以pointnet++提出了多分辨率分组法解决这个问题。
如上图右所示,类似的,新特征通过两部分连接起来。左边特征向量是通过一个set abstraction后得到的,右边特征向量是直接对当前patch中所有点
进行pointnet卷积得到。并且,当点云密度不均时,可以通过判断当前patch的密度对左右两个特征向量给予不同权重。例如,当patch中密度很小,左边向量得到的信息就没有对所有patch中点提取的特征可信度更高,于是将右特征向量的权重提高。以此达到减少计算量的同时解决密度问题。

三、pointnet++代码详解
FPS和邻域点确定的方法都是c语言编程的并混编成.so文件的,下面以pointnet2_cls_ssg模型为例解释代码。
整体网络结构:



特征提取pointnet_sa_module:









友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信