- 写在前面
首先,本文是对PointNet的论文(这是一篇来自CVPR2017的一篇论文),以及对github的基于TF1.x版本的代码的理解。
如果有理解的不对的地方,还是希望各位大佬留言指正。谢谢。由于是基于Tensorflow1.x版本的,所以如果各位有不理解的地方还是请自己查阅官方文档(tf.compat.v1)。
对了,再提一点PointNet的正文部分内容并不全面,大部分其余的内容在它的supp中。
Supplement
1、简单介绍
首先,PointNet并没有使用实际场景中的点云数据,而是使用的CAD(Computer Assistant Design)模型,这一点可以从论文中发现,使用的是ModelNet40的数据集,所以这一点就成为了它的一大不足,就是无法与实际场景结合起来。其次,通过网络结构我们也可以看出,它没有考虑局部的特征,而是把注意力放在了全局上,这一点也对网络的设计和性能产生了很大的影响。
2、论文的贡献
- 设计了一个用于3D无序点云数据的神经网络。
- 展示了如何训练这样一个网络来执行三维形状分类、形状部分分割和场景语义分析任务。
- 论文中给出了相应的理论分析和证明。
- 通过实验对网络结构的性能进行了实验,并且展示了相应的实验结果进行对比分析。
3、 网络介绍
这里就不对论文中的推理和证明进行分析了,如果有兴趣可以下载论文仔细研究一下。首先,该论文是基于深度学习的网络设计,但是没有使用到卷积网络,不过仔细研究跟卷积网络的作用可以说类似。论文的作者使用到的网络结构的设计时,使用到的时MLP(Multiple Layers Perceptron),就是多层感知机,了解过感知机的可以很清楚的知道感知机的作用,可以笼统的把感知机认为是一个简单的不能再简单的神经元,但是,这样说也不太严谨,以后有机会可以再仔细讲解一下感知机。
第一部分:Classification Network
这一部分是一个分类网络,网络的设计将原始的CAD模型点云数据输入到网络,经过之前推理的将无序点云数据,转换为有序的处理之后,进行MLP和T-net(miniNet)的处理和转换,最终会得到K个分类,K个类别。这一部分先简单的这样讲,更多细节想在代码里给大家讲解。
第二部分:Segmentation Network
论文中就已经很清晰的说明了这部分网络的,是对分类网络部分的拓展(extension),我们可以看到这部分的网络使用到了在Classification中没有考虑的局部特征,并且将局部特征和全局特征进行结合使用。
然后使用一个参数定义为 mlp(512,256,128)其实类似于一个三层conv2D,类似进行了三次卷积操作。并且,在代码实现部分作者也确实使用到了卷积操作,如下
第三部分:网络的整体
上面分别对分类部分网络和分割部分的网络进行了单独的讲解,下面将整个网络结构说一下。
具体的步骤
1、论文选用n个点云作为输入数据,n代表的就是点云的数量,3代表的是(xyz)点云的三点坐标。因此,称之为 nx3
2、为了解决作者在此之前提到的点云数据的无序性,因此,我们可以清晰的看到,网络的结构在对刚输入进网络的点云数据进行了处理,也就是经过了下面的T-Net进行处理,这部分的操作具体在代码部分讲解。如果想了解详细的,可以留言问我要论文Supp部分,进行详细研究。
3、使用mlp多层感知机进行对数据特征的提取,在这里如果不理解mlp到底干了什么工作的小伙伴可以理解为Conv2D操作,例如,mlp(64,128,1024)就是首先将输入数据,卷积后数据到128维,然后,对128维的数据再次进行卷积操作,最终得到1024维的数据,然后对该部分数据进行max pooling操作,并且这里的max pooling和论文中理论推导部分的g函数是说的一个操作。
4、最终,经过多个mlp操作,以及全连接层的处理,并且各层均会使用BN和ReLU进行处理,以加快网络训练速度和防止过拟合等。最后,得到k个分数,k个分类,这就完成了网络的分类。
5、对于分割部分,类似更多内容可以在论文的supp中详细查看。
4、实验以及结果
1、分割结果展示
2、分类实验
对于这个对比表格,由于benchmark使用的是ModelNet40的数据集,因此分类的结果对比也是对,CAD模型进行对比。类似于图片中的IoU,这里也会使用mIoU来对分割结果的好坏进行评价。
5、最后总结
这篇论文,算是自己对点云的一个简单入门吧,当然完全不够,只是简单的对点云进行了简单的了解,接下来对点云感兴趣的大佬可以指正我。并且,接下来我会介绍这篇论文的代码部分,以及PointNet++ | PointRCNN | Frustum PointNet | VoxelNet | VoxelNet FPN 等基于真正的点云数据的,KITTI数据集上的卷积网络等。谢谢!