PointNet:论文总结及pytorch源码详解

PointNet:

论文地址:https://arxiv.org/abs/1612.00593

pytorch源码地址:https://github.com/fxia22/pointnet.pytorch.git

个人详细注释源码地址:https://github.com/Dir-b/PointNet.git


前言

point_base方法的开山之作,本篇主要对PointNet论文谈谈个人理解,并详细注释了pytorch版本的源码,很适合像我一样初入这个方向,对pytorch、python不熟悉的朋友,欢迎star,如有注释不当的地方,欢迎指正。

PointNet:论文总结及pytorch源码详解_第1张图片


主要思想

PointNet论文中不仅仅是提出了一个处理三维点云的网络,其中的思想以及数学证明是比网络本身更具有价值,个人总结以下几方面:

  • 解决置换不变性

在之前的三维点云处理(深度学习方法)综述中,提到了点云具有无序性,这就要求对点云的处理方法需要满足置换不变性:即处理的结果不能随着点云顺序的改变而改变。

在PointNet中,作者想到了使用对称函数来实现。在对称函数中,函数的输出值不随输入变数的排列而改变,例如最简单的加法运算。PointNet作者很巧妙的和网络中的最大池化操作联系起来。池化本身是为了降低特征维度,以加快运算速度,是在神经网络中常用的方法。同时,最大池化操作本身就是一个对称函数,因而完美的解决了这个问题。

PointNet:论文总结及pytorch源码详解_第2张图片

  • 解决点云稀疏性

点云数据的稀疏特性使得直接使得直接使用3D卷积操作变得困难,PointNet作者没有使用卷积操作,而是使用了MLP进行点云特征的提取。每个点都经过多级的MLP操作进行数据特征提取。当然,MLP的方式虽然避开了点云稀疏性的问题,但也缺失了局部信息的特征。PointNet作者在后续的改进版本PointNet++改进了这个问题。

PointNet:论文总结及pytorch源码详解_第3张图片

  • 解决点云的几何变换问题

以我个人的理解,作者从两个方面来解决这个问题。

一是在论文表现出来的T-Net网络,通过在网络中添加T-Net子网络进行点云的变换。T-Net网络其实本身就是一个PointNet网络,只不过网络输出的是一个三维的旋转矩阵。当然这部分的作用似乎并不是很大,在后续的一些论文中,这部分已经见不到了。至于为什么作用不大,个人理解是点云的置换不变性质是不是已经包含了旋转的情况那?

PointNet:论文总结及pytorch源码详解_第4张图片

二是在程序中体现的对输入的点云数据进行了归一化操作,解决transform的尺度问题。

 

  • 从数学上证明网络设计的合理性

一个已经被证明的定理:MLP能够拟合任意的函数。PointNet作者从数学上证明了经过max pooling后,PointNet依旧可以拟合在点云上的任意函数。证明这个是因为经过max pooling的操作是有信息损失的,如下:


网络设计

PointNet的分类网络设计如下:

  • 输入n x 3数据
  • 经过一个T-Net进行原始点云数据的旋转
  • 经过第一次MLP,输出n x 64特征
  • n x 64再次经过一个T-Net进行特征旋转
  • 经过第二次MLP,n x 64 -> n x 128 -> n x 1024
  • 最大池化,得到1 x 1024的全局特征
  • 经过第三次MLP,1 x 1024 -> 1 x 512 -> 1 x 256 -> 1 x k,k为最终的分类类别

PointNet的分割网络结合n x 64局部特征和1 x 1024的全局特征。

PointNet:论文总结及pytorch源码详解_第5张图片


源码 

pytorch源码地址:https://github.com/fxia22/pointnet.pytorch.git

个人详细注释源码地址:https://github.com/Dir-b/PointNet.git

你可能感兴趣的:(三维点云处理)