当前位置:   article > 正文

Pointnet++网络详解

pointnet++网络

       置顶先贴上论文和代码的地址和链接,pointnet和pointnet++简直就是点云深度学习界的resnet呀,经典永流传。

         pointnet++论文:1706.02413v1.pdf (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/pdf/1706.02413v1.pdf

        pointnet++代码:yanx27/Pointnet_Pointnet2_pytorch: PointNet and PointNet++ implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS. (github.com)icon-default.png?t=N7T8https://github.com/yanx27/Pointnet_Pointnet2_pytorch

        本博文将结合论文和代码来详细地分析pointnet++网络,包括最远点采样方法,网络结构等。

1.pointnet++网络结构

1.1网络基本结构

        如下图所示,Segmentation为分割网络结构,Classification为分类网络结构。主干网络由n个set abstraction(SA模块)构成,N表示点数,d表示维度,其中输入维度一般为xyz三维,或者xyzrgb等六维,分割网络和2D的分割网络一样,会有一个上采样过程,恢复到输入的N个点,并对n个点分别进行预测类别;而分类网络直接通过全连接网络输出整个点云的类别。

1.2 项目基本结构

        data:存放数据的路径,详细可见下面这篇博客,有对几种任务的公共数据集的粗略解释,以及数据下载链接。Win10系统下复现Pointnet++(pytorch)_吃鱼不卡次的博客-CSDN博客

        data_utils:ModelNet、ShapeNet及S3DIS数据集的dataset组织形式,主要是对数据进行处理的,均含有__getitem__(self, index),__len__(self) 两个方法,getitem一般是用来返回数据和标签的,len返回数据的长度。

        log:用来记录训练的流程。

        models:定义了pointnet及pointnet++的网络结构。

         Visualizer:用来可视化的代码,我一般使用CloudCompare来进行可视化,不用open3d这些库来可视化,因为感觉不方便。

         最后是训练和测试的脚本,如下所示。

 2.pointnet++部件分割网络

         因为对部件分割网络比较熟悉,所以先来介绍部件分割网络:首先是SA模块,包含了sampling,grouping及pointnet三部分,其中sampling代表采样,是指从输入的点中使用最远点采样方法(farthest point sampling,FPS)采样n个点(下图1),grouping表示以采样的n个点为中心,聚合半径r内的点(下图2),pointnet是指将聚合的点的特征采用MLP及maxpooling操作提取特征。

        这里再解释一下下图,对于1中选取的每个中心点,都会进行一次grouping,每一个grouping都会送到pointnet网络中提取特征,所以2和3中会并行grouping和pointnet,直观上可以这么理解,代码上对张量进行批量化操作也是一样的道理。

2.1最远点采样

        顾名思义,假设有一个点的集合{A1,A2,A3...An}就是选取距离彼此最远的k个点,取两个最远点好选取,那么选取k个最远点如何选取呢,通过以下例子来说明最远点采样方法:

        假设有7个点P0—P6,首先初始化第一个点为P0,则距离P0的最远点为P6,得到最远点的点集为{P0,P6}

        第三个点选取步骤:先取最小值,再取最大值,至于为什么可以反过来想,如果我先取最大值,那么我可能选取的这个最大值可能离A远,但是离B近呀,这样就没办法保证我取得的是最远点了。(其实这里我也思考了很久才慢慢思考明白,这个最远点采样方法的思想和豪斯多夫距离(Hausdorff distance )是一样的)。

  1. (1)P1/P2/P3/P4/P5到P0和P6的最小值:
  2. P1>(P0,P6)的距离min(L10,L16) L10
  3. P2>(P0,P6)的距离min(L20,L26) L20
  4. P3>(P0,P6)的距离min(L30,L36) L30
  5. P4>(P0,P6)的距离min(L40,L46) L40
  6. P5>(P0,P6)的距离min(L50,L56) L50
  7. (2)选取最短距离的最大值:
  8. max(L10,L20,L30,L40,L50)=L50
  9. (3)则第三个点为P5

         代码详见\models\pointnet2_utils.py中的farthest_point_sample(xyz, npoint)方法,上面方法是基于torch写的,后面我会贴上基于numpy的代码,并且可视化一下最远点采样和随机采样,让大家直观感受一下这两种采样的区别,最远点采样简直就是对称美学呀!

        未完待续,有没有人来催更呀。。。

        

         

              

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/115848
推荐阅读
相关标签
  

闽ICP备14008679号