一、背景
点云是三维坐标系统中的一组三维向量的集合,是表示物体外表的一个形状,接近物体原始特征
我们的卷积神经网络通常需要规则的数据形式作为输入,但由于点云是非规则数据类型所以通常的做法大都先对点云进行规则化的处理。
相关工作之一就是把点云进行体素化处理,具体就是把点云数据在三维空间中划网格,这种方法比较依靠我们对网格大小的划分,称之为分辨率大小的设置
他的优点是体素化后的点云数据将在内存中有序存储,有利于减小随机内存访问,增加数据运算效率;但缺点是体素化过程将不可避免的带来信息丢失,信息丢失程度与选择的分辨率紧密相关,而且3D卷积运算量和复杂度非常大。
相关工作之二是将3D的点云数据映射到2D平面,不直接处理三维数据,而是对二维数据进行CNN网络进行处理,在分类和检索任务上有较好的效果。但是,3D到2D的转化是会损失信息的,而且投影的角度选择也是个问题。
原文还有很多工作(相关引用文献有21篇)
二、本论文提出了什么?
要解决什么问题:
基于以上的种种工作,都势必会改变点云数据的原始特征,造成不必要的数据损失。
作者做的就是设计一个可以直接处理3d点云数据的深度学习框架。
具体做法是:
提出了PointNet,它可以直接将3d点云作为输入,进而输出预测的类别。
不过由于这个网络直接以点云作为输入,而最大的难点在于点云的点数是不确定且无序的,三维的点坐标是没办法排序的,输入网络的是点云形成的一个个点坐标,怎么保证模型对这些点以不同顺序排列都能做出同样的判断?
核心方法是巧妙地使用了一个Max Pooling,解决了这个问题。
效果如何:很好
存在的问题:
1、只关注了3D点云的全局信息,对于局部信息的利用不够充分
点云数据表示:
这是点云的一个数据表示,N表示有N个点数据,D表示的是维数,这里我们就是(x,y,z)
用这个点云数据可以干什么?这篇论文主要讨论两点:
1:分类检测 输入N*3的矩阵,输出1*M的矩阵,M是各个分类的概率
2:部件分割/语义分割 输入N*3的矩阵,输出n*M的矩阵
下图是PointNet的应用:
点云的三个属性:
1、排列无序性:与图像的像素或者体素不同,点云是一系列没有特定顺序的点,但这些点不论怎么乱序又能组成同一个点云。因此,我们的网络需要保证面对 n 个点的3D点云的各种顺序置换的可能情况具有不变性。
2、点之间的相互作用: 这些点来自具有距离度量的空间,这意味着点不是孤立的,相邻的点形成一个有意义的子集。因此,我们的模型需要能够从邻近的点捕获局部结构,以及局部结构之间的组合相互作用。(待改进)
3、旋转(平移)不变性:作为一个几何对象,我们学到的点集特征不应该受到位姿变化的影响,旋转和平移不应该影响到全局点云类别或点的分割。
三、PointNet网络结构
为了解决第一个问题,作者提出过以下几种思路:
1、将输入排序成一个标准的顺序(很难找到一个稳定的排序)
2、用RNN处理输入,去学习一个顺序(我们的点云里数据量太多,很难学到顺序)
3、使用一个对称函数来将所有点的信息聚合
所谓对称函数就是指对输入顺序不敏感的函数
在max pooling作用下,取出每个维度上最大值,每一维特征都与其顺序无关
这样不管点云数据以什么样的顺序输入,都不会影响到我们最终提取结果,但这样会导致大量数据丢失,所以要做一些改进
也就是对其进行升维(利用MLP处理点云),例如最后升到1024维,升维过程中会产生很多冗余信息,个人感觉是用以抵消最大池化造成的数据丢失。
以上是对点云无序性的处理
对于问题三,作者引进一个T-Net网络来解决:
如图,T-Net用来生成变换矩阵,作用是用来对齐特征,使特征更利于提取。输入是n × 3 ,那么第一个T-Net生成的就是一个3 × 3 的仿射变换矩阵;
由于第二个T-Net的输入时n × 64 ,那么生成的变换矩阵就是一个64 × 64 的变换矩阵。
通过T-Net学习一个矩阵,就是把输入的矩阵数据进行一个旋转,校正成一个准确的方向,再进行之后的处理。
问题二的话,体现在分割问题上,在计算得到全局点云特征向量后,将其与前面的点特征拼接在一起。随后再从拼接后的特征向量中提取特征,这时既有局部信息也有全局信息。
这是整体网络结构图,总体就是两部分,用以处理两个不同任务
四、实验结果
相比体素输入,我们的PointNet表现更好
靠着这些主干点可以保证网络的鲁棒性
五、总结
论文创新:
设计了一种适合在3D中处理无序点集的新型深层网络体系结构
展示如何训练这样的网络来执行3D形状分类,形状部分分割和场景语义分析任务;
对方法的稳定性和效率提供全面的经验和理论分析;
举例说明由网络中所选神经元计算出的3D特征,并为其性能提供直观的解释。