pointnet网络结构详解
https://github.com/meder411/PointNet-PyTorch
https://github.com/fxia22/pointnet.pytorch
先来看网络的两个亮点:
- 空间变换网络解决旋转问题:三维的STN可以通过学习点云本身的位姿信息学习到一个最有利于网络进行分类或分割的DxD旋转矩阵(D代表特征维度,pointnet中D采用3和64)。至于其中的原理,我的理解是,通过控制最后的loss来对变换矩阵进行调整,pointnet并不关心最后真正做了什么变换,只要有利于最后的结果都可以。pointnet采用了两次STN,第一次input transform是对空间中点云进行调整,直观上理解是旋转出一个更有利于分类或分割的角度,比如把物体转到正面;第二次feature transform是对提取出的64维特征进行对齐,即在特征层面对点云进行变换。
- maxpooling解决无序性问题:网络对每个点进行了一定程度的特征提取之后,maxpooling可以对点云的整体提取出global feature。
二、点云存在的问题
- 无序性:点云本质上是一长串点(nx3矩阵,其中n是点数)。在几何上,点的顺序不影响它在空间中对整体形状的表示,例如,相同的点云可以由两个完全不同的矩阵表示。 如下图左边所示:
我们希望得到的效果如下图右边:N代表点云个数,D代表每个点的特征维度。不论点云顺序怎样,希望得到相同的特征提取结果。
我们知道,网络的一般结构是:提特征-特征映射-特征图压缩(降维)-全连接。
下图中x代表点云中某个点,h代表特征提取层,g叫做对称方法,r代表更高维特征提取,最后接一个softmax分类。g可以是maxpooling或sumpooling,也就是说,最后的D维特征对每一维都选取N个点中对应的最大特征值或特征值总和,这样就可以通过g来解决无序性问题。pointnet采用了max-pooling策略。
对特征空间每一个维度特征取mat,这样可以解决无序性的问题。
2.旋转性:相同的点云在空间中经过一定的刚性变化(旋转或平移),坐标发生变化,如下图所示:
我们希望不论点云在怎样的坐标系下呈现,网络都能正确的识别出。这个问题可以通过STN(spacial transform netw)来解决。二维的变换方法可以参考这里,三维不太一样的是点云是一个不规则的结构(无序,无网格),不需要重采样的过程。pointnet通过学习一个矩阵来达到对目标最有效的变换。
来自 https://blog.csdn.net/weixin_39475996/article/details/83538795
在本文中,我们探索了能够推理三维几何数据(如点云或网格)的深度学习架构。典型的卷积体系结构需要高度规则的输入数据格式,如图像网格或3D体素的格式,以便执行权重共享和其他内核优化。由于点云或网格不是常规格式,因此大多数研究人员通常将这些数据转换为常规3D体素网格或图像集合(例如视图),然后将其提供给深网络体系结构。然而,这种数据表示变换使得得到的数据不必要地大量 - 同时还引入了隐藏数据的自然不变性的量化伪像。 however, renders the resulting data unnecessarily voluminous—while also introducing quantization artifacts that can obscure natural invariances of the data.
突出体素化,多视角方法的不足。
下面让我们来看看网络的每一部分具体功能 ,网络共分为 个部分:
输入变换——>对齐输入点云(规范化canonical space)
点云处理——>MLP处理点云(升维到64)
特征变换——>对齐输入特征(规范化canonical space)
特征处理——>MLP处理特征(升维到1024)
对称函数处理——>全局特征(Max pooling)
出于这个原因,我们使用简单的点云专注于3D几何的不同输入表示 - 并命名我们生成的深网点PointNets。点云是简单而统一的结构,可以避免网格的组合不规则性和复杂性,因此更容易学习。然而,PointNet仍然必须尊重点云只是一组点并因此对其成员的排列不变的事实,这需要在网络计算中进行某些对称化。还需要考虑对刚性运动的进一步不变性。
我们的PointNet是一个统一的架构,直接将点云作为输入并输出整个输入的类标签或输入的每个点的每个点段/部件标签。我们网络的基本架构非常简单,因为在初始阶段,每个点的处理方式相同且独立。在基本设置中,每个点仅由其三个坐标(x; y; z)表示。可以通过计算法线和其他局部或全局特征来添加附加维度。
我们的方法的关键是使用单个对称函数,最大池化
a single symmetric function, max pooling。有效地,网络学习一组优化函数/标准,其选择点云的有趣或信息点并编码其选择的原因
select interesting or informative points of the point cloud and encode the reason for their selection。
网络的最终完全连接的层将这些学习的最优值聚合到如上所述的整个形状的全局描述符(形状分类)中或者用于预测每个点标签(形状分割)。
我们的输入格式很容易应用刚性或仿射变换,因为每个点都是独立变换的。因此,我们可以添加一个依赖于数据的空间变换器网络,该网络尝试在PointNet处理数据之前对数据进行规范化,以便进一步改善结果。
图1. PointNet的应用程序。我们提出了一种新颖的深网络架构,它消耗原始点云(点集)而无需体素化或渲染。它是一个统一的架构,可以学习全局和局部点功能,为许多3D识别任务提供简单,高效和有效的方法。
我们为我们的方法提供理论分析和实验评估。我们表明我们的网络可以近似任何连续的集合函数。更有趣的是,事实证明我们的网络学习通过一组稀疏的关键点来概括输入点云,这些关键点根据可视化大致对应于对象的骨架。理论分析提供了理解为什么我们的PointNet对输入点的小扰动以及通过点插入(异常值)或删除(丢失数据)的损坏具有高度鲁棒性。
在从形状分类,零件分割到场景分割的许多基准数据集中,我们通过实验将PointNet与基于多视图和体积表示的最先进方法进行比较。在统一的架构下,我们的PointNet不仅速度更快,而且还具有与现有技术相当甚至更好的性能。
我们工作的主要贡献如下:
我们设计了一种新颖的深网络架构,适用于消耗consuming 3D中的无序点集;
我们展示了如何训练这样的网络来执行3D形状分类,形状部分分割和场景语义分析任务;
我们对方法的稳定性和效率进行了深入的实证和理论分析;
我们演示了网络中所选神经元计算出的3D特征,并对其性能进行了直观的解释。
通过神经网络处理无序集合的问题是一个非常普遍和基本的问题 - 我们希望我们的想法也可以转移到其他领域。
2.相关工作
点云功能点云的大多数现有功能都是针对特定任务手工制作的。点特征通常编码点的某些统计特性,并且被设计为对某些变换不变,这些变换通常被分类为内在的[2,24,3]或外在的[20,19,14,10,5]。它们还可以归类为本地特征和全局特征。对于特定任务,找到最佳特征组合并非易事。
深入学习3D数据
3D数据具有多种流行表示形式,从而导致各种学习方法。
Volumetric CNNs 体积CNN:[28,17,18]是在体素形状上应用3D卷积神经网络的先驱。
然而,由于数据稀疏性和3D卷积的计算成本,体积表示受其分辨率的限制。 FPNN [13]和Vote3D [26]提出了处理稀疏性问题的特殊方法;但是,他们的操作仍处于稀疏数量,因此处理非常大的点云具有挑战性。
多视图CNN:[23,18]尝试将3D点云或形状渲染为2D图像,然后应用2D转换网对它们进行分类。通过精心设计的图像CNN,这一系列方法在形状分类和检索任务方面取得了主导作用[21]。然而,将它们扩展到场景理解或其他3D任务(例如点分类和形状完成)是非常重要的。
光谱CNN:一些最新的作品[4,16]在网格上使用光谱CNN。然而,这些方法目前被限制在诸如有机物体之类的歧管网格上,并且如何将它们扩展到诸如家具之类的非等距形状并不明显。
基于特征的DNN:[6,8]首先通过提取传统的形状特征将3D数据转换为矢量,然后使用完全连接的网络对形状进行分类。我们认为它们受到所提取特征的表示能力的约束。
无序集的深度学习
从数据结构的角度来看,点云是一组无序的向量。
虽然大多数深度学习工作都集中在常规输入表示,如序列(语音和语言处理),图像和体积(视频或3D数据),但在点集的深度学习中并没有做太多工作。
Oriol Vinyals等人最近的一项研究[25]研究了这个问题。他们使用具有注意机制的读进程编写网络来使用无序输入集,并显示他们的网络具有对数字进行排序的能力。
但是,由于他们的工作重点是泛型集和NLP应用程序,因此缺少几何体在集合中的作用。
4.关于点集的深度学习
我们网络的体系结构(第4.2节)的灵感来自Rn(第4.1节)中的点集属性。
4.1。 中点集的性质
我们的输入是来自欧氏空间的点的子集。
它有三个主要属性:
无序。
与图像中的像素阵列或体积网格中的体素阵列不同,点云是一组没有特定顺序的点。换句话说,消耗N个3D点集的网络需要对N不变!数据馈送顺序中输入集的排列。
点之间的相互作用
这些点来自具有距离度量的空间。这意味着点不是孤立的,相邻点形成一个有意义的子集。因此,模型需要能够捕获附近点的局部结构,以及局部结构之间的组合相互作用。
变换中的不变性。
作为几何对象,点集的学习表示应该对某些变换不变。例如,一起旋转和平移点不应该修改全局点云类别,也不应该修改点的分段seg。
4.2。 PointNet架构
我们的完整网络架构在图2中可视化,其中分类网络和分段网络共享很大一部分结构。请阅读管道的图2标题。
我们的网络有三个关键模块:最大池层作为聚合来自所有点的信息的对称函数,局部和全局信息组合结构,以及两个对齐输入点和点特征的联合对齐网络。
如何消除点云数据的无序性
我们将在下面的单独段落中讨论这些设计选择背后的原因。
无序输入的对称函数为了使模型对输入排列不变,存在三种策略:
1)将输入排序为规范顺序; 先排序
2)将输入视为训练RNN的序列,但通过各种排列来增加训练数据;
3)使用简单的对称函数来聚合来自每个点的信息。这里,对称函数将n个向量作为输入,并输出对输入顺序不变的新向量。例如,+和运算符是对称二进制函数。
虽然排序听起来像一个简单的解决方案,但在高维空间中实际上并不存在稳定的排序w.r.t.一般意义上的点扰动。这可以通过矛盾很容易地显示出来。如果存在这样的排序策略,则它定义高维空间和1d实线之间的双射映射。不难看出,要求排序是稳定的,因为点扰动等同于要求该图在尺寸减小时保持空间接近度,这是在一般情况下无法实现的任务。因此,排序并不能完全解决排序问题,并且由于排序问题仍然存在,因此网络很难从输入到输出学习一致的映射。如实验中所示(图5),我们发现直接在排序点集上应用MLP表现不佳,但稍微好于直接处理未排序的输入。
使用RNN的想法将点集视为顺序信号,并希望通过用随机置换序列训练RNN,RNN将变得对输入顺序不变。然而,在“OrderMatters”[25]中,作者已经证明秩序确实很重要,不能完全省略。虽然RNN对于具有小长度(数十个)的序列的输入排序具有相对良好的鲁棒性,但是难以扩展到数千个输入元素,这是点集的常见大小。根据经验,我们还表明基于RNN的模型的表现不如我们提出的方法(图5)。
我们的想法是通过对集合中的变换元素应用对称函数来近似在点集上定义的一般函数:
根据经验,我们的基本模块非常简单:我们通过多层感知器网络来近似h,并通过单个变量函数和最大池函数的组合来近似g。通过实验发现这很好。通过h的集合,我们可以学习一些f来捕获集合的不同属性。
虽然我们的关键模块看起来很简单,但它具有有趣的属性(参见5.3节)并且可以在一些不同的应用程序中实现强大的性能(参见第5.1节)。由于我们模块的简单性,我们也能够提供第4.3节中的理论分析。
局部和全局信息聚合
上面部分的输出形成一个向量[f1; ::: ;; fK],它是输入集的全局特征。我们可以在形状全局特征上轻松训练SVM或多层感知器分类器以进行分类。但是,点分割需要本地和全球知识的组合。我们可以通过简单而高效的方式实现这一目标。
我们的解决方案可以在图2(分段网络)中看到。
在计算全局点云特征向量之后,我们通过将全局特征与每个点要素连接起来将其反馈回每点要素。然后我们基于组合点特征提取新的每点特征 - 这次每点特征知道本地和全局信息。
通过这种修改,我们的网络能够预测依赖于局部几何和全局语义的每个点数量。例如,我们可以准确地预测每点法线(图中的补充),验证网络能够汇总来自该点的本地邻域的信息。在实验环节中,我们还表明我们的模型可以在形状部分分割和场景分割方面实现最先进的性能。
联合对齐网络
如果点云经历某些几何变换(例如刚性变换),则点云的语义标记必须是不变的。
因此,我们期望我们的点集的学习表示对这些变换是不变的。
一种自然的解决方案是在特征提取之前将所有输入集对齐到规范空间。 Jaderberg等。 [9]介绍了空间变换器通过采样和插值对齐2D图像的想法,通过在GPU上实现的专门定制的层实现。
与[9]相比,我们的点云输入形式使我们能够以更简单的方式实现这一目标。我们不需要发明任何新图层,也不会像图像情况那样引入任何别名。我们通过迷你网络(图2中的T-net)预测仿射变换矩阵,并直接将该变换应用于输入点的坐标。 mininetwork本身类似于大型网络,由点独立特征提取,最大池和完全连接层的基本模块组成。关于T-net的更多细节在补充中。
这个想法可以进一步扩展到特征空间的对齐。我们可以在点要素上插入另一个对齐网络,并预测要素转换矩阵以对齐来自不同输入点云的要素。
然而,特征空间中的变换矩阵具有比空间变换矩阵高得多的维度,这极大地增加了优化的难度。因此,我们在softmax训练损失中增加了一个正则化项。我们将特征变换矩阵约束为接近正交矩阵:
其中A是由迷你网络预测的特征对齐矩阵。正交变换不会丢失输入中的信息,因此是期望的。我们发现通过添加正则化项,优化变得更加稳定,我们的模型实现了更好的性能。