赞
踩
置顶先贴上论文和代码的地址和链接,pointnet和pointnet++简直就是点云深度学习界的resnet呀,经典永流传。
pointnet++论文:1706.02413v1.pdf (arxiv.org)https://arxiv.org/pdf/1706.02413v1.pdf
本博文将结合论文和代码来详细地分析pointnet++网络,包括最远点采样方法,网络结构等。
如下图所示,Segmentation为分割网络结构,Classification为分类网络结构。主干网络由n个set abstraction(SA模块)构成,N表示点数,d表示维度,其中输入维度一般为xyz三维,或者xyzrgb等六维,分割网络和2D的分割网络一样,会有一个上采样过程,恢复到输入的N个点,并对n个点分别进行预测类别;而分类网络直接通过全连接网络输出整个点云的类别。
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这些库来可视化,因为感觉不方便。
最后是训练和测试的脚本,如下所示。
因为对部件分割网络比较熟悉,所以先来介绍部件分割网络:首先是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,直观上可以这么理解,代码上对张量进行批量化操作也是一样的道理。
顾名思义,假设有一个点的集合{A1,A2,A3...An}就是选取距离彼此最远的k个点,取两个最远点好选取,那么选取k个最远点如何选取呢,通过以下例子来说明最远点采样方法:
假设有7个点P0—P6,首先初始化第一个点为P0,则距离P0的最远点为P6,得到最远点的点集为{P0,P6};
第三个点选取步骤:先取最小值,再取最大值,至于为什么可以反过来想,如果我先取最大值,那么我可能选取的这个最大值可能离A远,但是离B近呀,这样就没办法保证我取得的是最远点了。(其实这里我也思考了很久才慢慢思考明白,这个最远点采样方法的思想和豪斯多夫距离(Hausdorff distance )是一样的)。
- (1)P1/P2/P3/P4/P5到P0和P6的最小值:
-
- P1—>(P0,P6)的距离min(L10,L16) L10
- P2—>(P0,P6)的距离min(L20,L26) L20
- P3—>(P0,P6)的距离min(L30,L36) L30
- P4—>(P0,P6)的距离min(L40,L46) L40
- P5—>(P0,P6)的距离min(L50,L56) L50
-
- (2)选取最短距离的最大值:
-
- max(L10,L20,L30,L40,L50)=L50
-
- (3)则第三个点为P5
代码详见\models\pointnet2_utils.py中的farthest_point_sample(xyz, npoint)方法,上面方法是基于torch写的,后面我会贴上基于numpy的代码,并且可视化一下最远点采样和随机采样,让大家直观感受一下这两种采样的区别,最远点采样简直就是对称美学呀!
未完待续,有没有人来催更呀。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。