Slip the surly bonds of earth, to touch the face of God

[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

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

卷积神经网络已经在图像领域取得了惊人的成果,经过了AlexNet、VGG、GoogleNet/Inception各个版本、ResNet的演进,性能越来越强,并且出现了MobileNet、ShuffleNet等一些应用于特定场景的“定制化”网络和类似空洞卷积、DepthWise卷积等巧妙的结构。可以说图像领域,卷积神经网络可以说是“近乎圆满”了。

但是推广到三维领域,卷积网络似乎发挥得没那么完美了。不难理解,在多了一个维度后,网络的体积成倍增长,如果直接将卷积核变成三维不论是计算量还是存储量都不是现有GPU能够承受的。虽然现阶段三维领域都是用一些tricky的方法提取特征,但总有一天硬件性能足够强大时直接对三维物体提取三维特征,就像平面卷积神经网络一样。

介绍

《[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》

这篇论文已经被CVPR2017收录。PointNet就是针对点云数据格式的三维网络,点云数据就是摄像机采到物体表面的一些采样点并获取到其三维坐标。不难理解,现实中的立体相机很多都是无法将全部的三维点采集起来的,只能得到一些采样点的信息,Apple的iphone X也是使用了深度相机,发射一些红外射线来提取面部的点云信息。因此点云数据的应用领域很广。

点云数据具有一些显著的特点——数据点无序性、数据点数量可变性等,无序就表示网络必须能够在改变数据点顺序的情况下输出相同的结果,数量可变就表示网络必须能够处理不同采样点的三维模型。

文章中pointnet主要应用于两种问题——分类(classification)问题和分割(segmentation)问题。分类问题就是判断三维模型属于哪一类,如汽车、桌子、书等。分割问题就是判断每一个采样点属于物体的那一部分或属于哪一个物体,例如一个人的四肢和躯干,或者路上的人还是车。

对称设计

文中提到该网络是通过使用MaxPooling作为对称函数设计来处理点云模型的无序性的,也就是说无论输入的顺序是怎样的,maxpooling都会输出相同的结果。对称函数就是类似自然数加法那样的操作,调换输入顺序输出不变。

《[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》

结构

网络结构还是很好理解的

《[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》

网络输入n*3的数据,n就是采样点的个数,3表示三维坐标。经过几步mlp(多层感知器)获得n*1024维的采样点特征,然后使用max pooling进行对称操作得到1024维的整体特征(global feature)。其中在分类模型(Classification)中直接经过几层降维输出softmax分类概率,而分割模型(Segmentation)中要将整体特征串接到采样点特征之后再进行多层网络输出。

在网络中间有两个T-net网络,用于对模型进行旋转不变性处理,T-net生成3*3的旋转矩阵对模型进行操作。分别用于旋转模型坐标和模型中间特征。

结果

简单的想法,结果很优秀

《[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》

《[论文解读] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》

不足

很容易想到的一点就是Pointnet的大部分或说几乎全部的处理都是针对单个采样点的,无论提多么精细的feature都是针对某一个采样点的,而整合所有采样点特征的网络只有那个maxpooling,没错,甚至连可训练的变量都没有,只有一个maxpool。因此,网络对模型局部信息的提取能力远不如卷积神经网络来的那么solid。

作者也提出了改进版本Pointnet++,就针对局部信息缺失的问题作了改进,而且思想跟卷积神经网络类似,非常值得一读。

点赞
  1. 依沃戴德说道:

    bzh 求教怎么自学深度学习啊

    1. MeteorsHub说道:

      :confused: 如果是传统的机器学习方法比如贝叶斯、svm那种可以找个斯坦福、网易之类的公开课看看。要是各种神经网络这种最新的成果还没进课程,我还是建议读最新的paper,看不懂的地方到网上搜索学习
      :idea:

  2. 匿名说道:

    搜噶,,看来任重道远啊,我还在照着书写mnist那个数字识别呢 :lol:

    1. MeteorsHub说道:

      嗯,mnist初学者必备啊 :biggrin: 然后不考虑用邮箱登录吗,你是叫依沃戴德还是匿名哈哈哈 :lol:

  3. 匿名说道:

    我还奇怪呢,刚分明用邮箱地址发表的评论啊,再登我的邮箱就不见了,连名字都变成匿名了

    1. MeteorsHub说道:

      哦,估计你浏览器没有缓存,按理说姓名和邮箱填过下次在格子里还会有的
      算了,身份不重要,不能强制用户登录 :neutral:

      1. 匿名说道:

        哈哈,这网站是你自己写的吗

        1. MeteorsHub说道:

          我在服务器上用wordpress搭的,不算我写的吧,只是有些细节功能要自定义

  4. 匿名说道:

    您好,对于T-Net您是怎么理解的呢?论文中说T-Net也相当于一个网络,有三层MLP和两层的全连接,那么最后是如何得到3*3的矩阵呢?求教

    1. MeteorsHub说道:

      输入是n*3(input T-net)或者n*64(feature T-net),经过二维卷积(把n看成常量)和maxpooling、全连接层等得到9或4094维向量,再reshape到3*3或64*64作为输出。虽然文中说可以应付点云点数不同的模型,但是在训练时n是固定的 :neutral:

      1. 匿名说道:

        解释的很棒!非常感谢!

  5. 匿名说道:

    请问T-net是如何实现对模型进行旋转不变性处理的,还有为什么经过max pool层之后得到的就是全局特?谢谢

    1. MeteorsHub说道:

      Tnet最后输出是3x3的矩阵,这个矩阵就是一个旋转矩阵,乘上点云的xyz坐标进行的就是对点云做旋转操作。而且训练过程中加了约束这个旋转矩阵趋向与单位阵的loss

    2. MeteorsHub说道:

      maxpool对点云所有点的特征进行的,所以过了就是全局特征了,类似cnn

      1. 匿名说道:

        那这个T-net网络内部构成是怎么样的呢?可以加下微信吗,我今年研一,不懂的地方需要向您请教一下,但绝对不会耽搁您多长时间。微信号:15129042003,谢谢您!

        1. MeteorsHub说道:

          可以看GitHub源码:https://github.com/charlesq34/pointnet。我微信号是MeteorHub,或者电脑板扫描右下角微信二维码

  6. 匿名说道:

    请问下T-net训练的时候是相当于CNN的卷积核那样训练么?比如3*3 T-net 就是训练9个参数,然后加上一个使他接近正交矩阵的正则化进loss

    1. MeteorsHub说道:

      Tnet本身也是多个卷积层和全联接层做的,可以看源码https://github.com/charlesq34/pointnet/blob/master/models/transform_nets.py

  7. 匿名说道:

    楼主有写++的评论么

    1. MeteorsHub说道:

      暂时还没有 :redface:

  8. winter2015说道:

    楼主有源码吗?或者从哪里能找到源码?谢谢啦

  9. 匿名说道:

    求问,输入是n个点,n*3,这个3应该是类似于xyz这样的channel,那请问怎么做2维卷积呢?我感觉这就是一维的输入呀?多谢楼主!

    1. MeteorsHub说道:

      输入看成[B, n, 3, 1]的tensor,1是channel,相当于二维图像的[B, h, w, c]

  10. 匿名说道:

    另外还有个疑问,就是在input transform后的那个mlp,卷积核是[1, 3],又没有padding,输出怎么能还保持是n*64呢?按说w方向不是会变小2个pixel吗?不懂了,求指教呀~~

    1. 匿名说道:

      还是说把n*3看做输入,channel是其他特征,对n*3做二维卷积,是这样理解嘛?~多谢哈~

      1. MeteorsHub说道:

        作者在实际处理时有些“小操作”,[B, n, 3, 1]经过filter为64卷积核[1,3]的valid卷积后变成[B,n,1,64],而这个tensor在论文中以n*64出现。也就是说理解上是n*64的特征,实际操作时把64看成channel,多加了个为1的第三维度

      2. MeteorsHub说道:

        可以去看源码,这种“技巧”还是很有意思的

  11. 匿名说道:

    你好,有个疑问请教。就是原始数据点在采样的时候,如果点本身小于采样数,比如不足1024,应该怎么处理呢?

    1. MeteorsHub说道:

      作者采样点据说很多,最后下采样出的1024个。如果不够的话可能要复制或者插值吧,或者定一个点数自己重新训练

      1. 匿名说道:

        为什么一定要1024个点呢?这个网络不是说可以适用于不同维度吗?也就是说点的个数多少无所谓吧?

  12. karl说道:

    博主你好,初学者相问个问题,tnet对点云做旋转处理的意义是什么呀?是对其么?如何做到对其的,另外可以直接maxpooling提特征么

    1. MeteorsHub说道:

      为了使模型具有旋转不变性,使分类结果不受输入点云视角影响。虽然很难理解,但maxpooling就是提出来了

  13. louxy126说道:

    博主,有个小小的请求,我现在刚开始学习点云识别,用的是win8+python+tensorflow,从Github上下了pointnet的源码,但是不会使用,网上面关于这方面的东西比较少。我想用provider.py下载数据集,但是运行程序显示乱码。所以想请问你有没有时间作一篇pointnet代码使用的教程。十分感谢!

    1. MeteorsHub说道:

      代码跟着项目readme跑就行,你的下载问题应该是系统原因,他的项目都是在linux上跑的,不过也就是下载这一块用了linux命令。你可以照着proveder里面的网址手动下载到相应路径下,数据处理好了应该就可以跑了

      1. louxy126说道:

        谢谢回复! :mrgreen:

  14. 匿名说道:

    博主,您对pointnet提取出的特征属于什么特征怎么理解的?

    1. MeteorsHub说道:

      什么意思,属于什么特征?

      1. 匿名说道:

        传统二维图像提取的特征可能是角点特征、特殊纹理特征,甚至是颜色特征,而pointnet对点云的坐标进行提取特征,我的疑问就是,这提取的属于什么特征,是位置特征?可是坐标的输入也是无序的

  15. louxy126说道:

    博主,有根问题想向您请教。在input_transform中,transform返回的矩阵是[B,3,3]。
    在 point_cloud_transformed = tf.matmul(point_cloud, transform)这个语句中,两个矩阵分别是[B,n,3,1]*[B,3,3],他们俩的维数不一样,怎么相乘?乘出的结果又是什么呢?十分感谢

    1. louxy126说道:

      我糊涂了 :exclaim: ,代码看错了,现在已经懂了

  16. 匿名说道:

    博主你好,想问一下分类和分割的本质区别是什么?

    1. MeteorsHub说道:

      分类是整图打标签,分割是每个像素打标签

  17. julyfire说道:

    博主你好,点云有无序性,那为什么不直接用点云在某个视角投影得到深度图作为输入呢, 这样就可以用传统的卷积网络处理图像的方式了,直接用点云作为输入,相比深度图,有什么优点呢?刚接触3D数据,对这个很迷惑 :lol:

    1. MeteorsHub说道:

      深度图得处理,不然有些像素位置没有点对应,有些有很多点对应。而点云可以由sensor直接得到,不浪费数据。当然现在也有很多直出深度图的sensor,使用点云还是深度图依数据形式而定

发表评论

电子邮件地址不会被公开。