热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pointnet分割自己的点云数据_点云语义分割网络

基于点云的方法PointNet[4]其实多视角图片和体素化的方法都有着相似的中心思想,就是希望通过将点云变换成规则化的、可以通过CNN直接进行处理的形式。而直接对点云

基于点云的方法

PointNet[4]

其实多视角图片和体素化的方法都有着相似的中心思想,就是希望通过将点云变换成规则化的、可以通过CNN直接进行处理的形式。而直接对点云进行处理的深度学习方法跟上述两种方法最大的不同就是,它是可以直接使用这些三维点的位置信息的。在这方面比较有代表性的就是PointNet方法。

PointNet主要是解决了两个核心问题:点云的无序化和物体姿态变换的不变性。

1)由于点云是无序的,那么最基本的就是需要保证的就是网络对同一点云的不同输入顺序的不变性,PointNet的解决方案是使用一个比较简单的对称函数,如图4所示:

0dc33fce6196c8b2bd8cbaa57ac4aef8.png图4:PointNet对称函数(来源:[4])

其中h是特征提取函数,在PointNet中就是MLP,g就是对称函数,可以是max、average等函数,在PointNet中用的是max函数,γ则代表的是网络更高层的特征提取函数。

2)在解决点云的无序性问题之后,还有一个非常重要的问题,那就是点云的旋转不变特性,点云在旋转过后的类别是不会发生改变的,所以PointNet在这个问题上参考了二维深度学习中的STN[5]网络,在网络架构中加入了T-Net网络架构,来对输入的点云进行空间变换,使其尽可能够达到对旋转的不变性。

081478b828b6c1e663fa01019538a87e.png图5:PointNet网络架构(来源:[4])

图5就是PointNet的整体网络架构,整体的架构中主要使用了MLP层进行特征提取以及T-Net层进行空间变换,并且在求解全局特征(global feature)时使用对称函数g(max pool)。网络支持分类和分割任务,对于分类任务来说,就是输出整个点云的类别,而分割任务则是输出点云中每一个点的分类结果。PointNet在这两种任务中都取得了很好的结果。

PointNet的实验是非常详细的,其中个人对其中一个实验非常感兴趣,就是输入网络中的所有的点只输出了一个1*1024的全局特征向量,所以说只有不到1024个关键点的特征使用到了,而论文对全局特征进行了反求,找出了是哪些关键点的特征构成了这个全局向量,并将这些点绘制了出来,如图6。

2adba0ceaf8c0d3bd234c5021735a971.png图6:关键点可视化(来源:[4])

PointNet++[6]

虽然PointNet在分类和分割任务上都取得了很好的结果,但是论文指出PointNet存在着非常明显的缺点,那就是PointNet只使用了全局的点云特征,而没有使用局部点附近的特征信息,为了解决这个问题,PointNet++在网络中加入了局部信息提取的方案,并且取得了更好的结果。

2a48e69aba45332d5cbbe94b3f6e810b.png图7:PointNet++网络架构(来源:[6])

网络最主要的部分就是图7中的set abstraction部分,它首先是先寻找当前点云中的关键点,然后根据距离信息寻找关键点附近的点构成一个小的点集,最后使用PointNet进行特征求解,。

通过重复上面的set abstraction部分,便可以不断的对局部点云中进行特征提取,可以使网络更好的利用局部信息。并且实验也证明了PointNet++相对于PointNet有了不小的性能提升。当然网络也使用了MSG和MRG的方法来解决当点云密度不均匀时的采样距离需要改变的问题,具体细节可以查看原论文。

虽然PointNet++达到了更好的效果,但是由于网络加入局部信息之后的不再使用T-net,所以PointNet++有时候存在结果不稳定的情况,所以PointNet++的测试结果是对原始点云进行多次旋转求得的平均结果,可见网络还有很大的改进空间。

最近这段时间也陆续出现了很多不错的直接处理点云的深度学习论文,在这里就不一一介绍了,对这个方向有兴趣的同学可以去看看,应该会有很大的帮助,例如:PointCNN,PointSift,Graph CNNs等。

基于二维RGB图像与三维点云学习

Frustrum PointNet[7]

fea34483f5e66ca815fb460c41e21385.png图8:Frustrum PointNet物体定位流程(来源:[7])

由于无人驾驶技术的火热,大规模场景物体定位问题一直受到很大的关注,而传统的解决大规模场景物体定位的方法是在整个点云上进行滑动窗口然后对窗口进行物体分类来确定物体的三维边界,但是可想而知这种情况下的计算量太大,很难达到实时预测。

考虑到现在二维深度学习方向的技术已经非常成熟,同时使用RGB和点云信息在大规模三位物体定位中应该可以取得更好的成果,基于这个想法,Frustrum PointNet这篇文章就出现了。

上面图8就是Frustrum PointNet的物体定位的主要流程图,主要包含三个步骤:1)使用二维图像信息以及FPN网络在二维图像上找到物体边界框,2)使用相机的内参数信息将这个二维边界框投射到三维空间,形成一个Frustrum(截椎体),现在就只需要在这个Frustrum里面进行物体搜索,大大减少了搜索时间。3)将PointNet加入了进来,使用PointNet直接对Frustrum中的点云进行物体分割,而不是使用传统的滑动窗口操作,从而使得分割的速度更快。当然,网络还有一些其他的细节处理,比如对Frustrum里的点云进行坐标的变换处理。通过以上的操作,使得论文的方法既鲁棒又迅速,同时在KITTI 以及 SUN RGB-D 检测中取得了更好的性能。

论文当然也存在着一些问题,那就是论文的二维物体定位之后才能进行三维定位,一旦二维出错,那么三维定位也将出现问题,当然这也是基于现在二维定位效果比三维好的情况下设计的。

SPLATNet[8]

2035515fc4a6b96f84a94fee04ef2902.png图8:BCL过程(来源:[8])

91fe94c560cbe30d5452431faac7802a.png图9:BCL2D->3D过程(来源:[8])

这篇文章使用了一种比较特殊的点云处理方法。文章主要是使用了bilateral convolution layers(BCL)这种网络架构,可以对点云直接进行卷积操作,见图9。

BCL主要有三个基本操作:Splat、Convolve、Slice:Splat是将欧式空间通过使用一个变换矩阵转换成另外一个Permutohedral Lattice空间,并使用插值的方法将点的信息赋值给空间的顶点,从图中可以看出Permutohedral Lattice空间是由多个三角形构成的,分布在平面上,这个空间对于点云这种稀疏无序的数据,能够高效的进行组织和查找,并且方便各种运算的进行,如卷积运算。接下来就是Convolve,这就比较简单了,由于点云已经被投射到这个规格化的空间中,位置是比较规整的,只要按照哈希表做索引,进行卷积操作就可以了。Convolve结束之后使用Slice操作了,这是Splat的逆过程就是把卷积后的Permutohedral Lattice空间上的点的信息转换到原来欧式空间中的点上。

论文另一个吸引人的地方就是BCL2D->3D,可以将从多视图图像中提取的特征利用Permutohedral Lattice投射到三维空间,使得二维图像与点云以一种学习的方法结合在一起,论文也通过这种方法取得了非常好的语义分割性能。

不过由于这篇论文在BCL方面讲解的并不细致,所以要是想要深入了解这方面的的内容的话,需要参考另外论文中的参考文献1和25文献才能真正理解这方面的一些详细内容。

总结

三维方向的深度学习在过去几年里也已经发生了比较大的变化,已经从使用体素网格或者多视角图像转变为了直接使用点云进行学习,并且性能方面也有了很大的提高。不过,这个领域也是近期才快速的发展起来,并且随着三维传感器的进一步普及,这个领域的相关研究会得到更多的关注。而且现在的大规模数据集基本上是关于自动驾驶的,但是可以想象三维深度学习在三维医疗影像、智能机器人等也会发挥很大的作用。



推荐阅读
author-avatar
Dr-xuan_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有