我是靠谱客的博主 故意大船,最近开发中收集的这篇文章主要介绍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论文中不仅仅是提出了一个处理三维点云的网络,其中的思想以及数学证明是比网络本身更具有价值,个人总结以下几方面:

  • 解决置换不变性

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

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

  • 解决点云稀疏性

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

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

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

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

二是在程序中体现的对输入的点云数据进行了归一化操作,解决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的全局特征。


源码 

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

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

最后

以上就是故意大船为你收集整理的PointNet:论文总结及pytorch源码详解的全部内容,希望文章能够帮你解决PointNet:论文总结及pytorch源码详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部