zoukankan      html  css  js  c++  java
  • 论文笔记:(NIPS2017)PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space


    PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

        Charles R. Qi*    Li Yi    Hao Su    Leonidas J. Guibas    时间:2017
    Stanford University

    论文下载地址:https://arxiv.org/abs/1706.02413
    代码:https://github.com/charlesq34/pointnet2
    论文中文翻译:https://blog.csdn.net/weixin_40664094/article/details/83902950、
    https://blog.csdn.net/qq_40196164/article/details/85264803

    一、 存在的问题

    1、提取局部特征的能力

      PointNet不会捕获由度量空间中的点所引发的局部结构,从而限制了识别细粒度模式的能力以及对复杂场景的普遍性。

    2、点云密度不均问题

      由于采集时会出现采样密度不均的问题,所以通过固定范围选取的固定个数的近邻点是不合适的。

    二、解决方案

    1、改进特征提取方法:

      受到CNN的启发,作者使用了分层提取特征的思想,利用所在空间的距离度量将点集划分(partition)为有重叠的局部区域(可以理解为patch)。在此基础上,首先在小范围中从几何结构中提取局部特征(浅层特征),然后扩大范围,在这些局部特征的基础上提取更高层次的特征,直到提取到整个点集的全局特征。可以发现,这个过程和CNN网络的特征提取过程类似,首先提取低级别的特征,随着感受野的增大,提取的特征level越来越高。

      作者把每次局部特征提取称为set abstraction。但是需要解决两个问题:

    (1)如何将点集划分为不同的区域;
    (2)通过什么样的特征提取器获取不同区域的局部特征;

      这两个问题是相关的,因为点集的分区必须跨分区产生公共结构,因此可以共享局部特征提取器的权重,如卷积操作。作者选择PointNet作为局部特征提取器。正如之前工作所证明的那样,PointNet是一种有效的架构,用于处理语义特征提取的无序点集。此外,该架构对输入数据损坏很稳健。作为一个基本构建模块,PointNet将一组局部点或特征抽象为更高级别的表示。在此文中,PointNet ++以递归方式将PointNet应用于输入集的嵌套分区。
      因此,set abstraction 分为三部分:采样层、分组层、特征提取层,网络通过多个set abstraction,最后进行分类和分割。

    (1)采样层(sampling)

      激光雷达单帧的数据点可以多达100k个,如果对每一个点都提取局部特征,计算量是非常巨大的。因此,作者提出了先对数据点进行采样。作者使用的采样算法是最远点采样(farthest point sampling, FPS),相对于随机采样,这种采样算法能够更好地覆盖整个采样空间。

    (2)分组层(grouping)

      这一层使用Ball query方法生成N'个局部区域(patch),根据论文中的意思,这里有两个变量 ,一个是每个区域中点的数量K,另一个是球的半径。这里半径应该是占主导的,会在某个半径的球内找点,上限是K。球的半径和每个区域中点的数量都是人指定的。这一步也可以使用KNN来进行,而且两者的对于结果的影响并不大。

    (3)特征提取层(feature learning)

      用PointNet对分组层给出的各个局部进行卷积和pooling,得到的特征作为此中心点的局部特征。虽然分组层给出的各个局部可能由不同数量的点构成,但是通过PointNet后都能得到维度一致的特征。值得注意的是,在输入到网络之前,会把该区域中的点变成围绕中心点的相对坐标。作者提到,这样做能够获取点与点之间的关系。

      上述各层构成了PointNet++的基础处理模块set abstration。如果将多个这样的处理模块级联组合起来,PointNet++就能像CNN一样从浅层特征得到深层语义特征。对于分割任务的网络,还需要将下采样后的特征进行上采样,使得原始点云中的每个点都有对应的特征。这个上采样的过程通过最近的k个临近点进行插值计算得到。

    2、解决点云密度不均问题:

      不同于图片数据分布在规则的像素网格上且有均匀的数据密度,点云数据在空间中的分布是不规则且不均匀的。虽然PointNet能够用于对各个点云局部提取特征,但是由于点云在各个局部均匀性不一致,很可能导致学习到的PointNet不能提取到很好的局部特征。比如说,在越远的地方激光雷达数据通常变得越稀疏,因此在稀疏的地方应该考虑更大的尺度范围来提取特征。为此,作者提出了两种组合策略来保证更优的特征提取。

    (1)多尺度分组(MSG)

      对于同一个中心点,如果使用3个不同尺度的话,就分别找围绕每个中心点画3个区域,每个区域的半径及里面的点的个数不同。对于同一个中心点来说,不同尺度的区域送入不同的PointNet进行特征提取,之后concat,作为这个中心点的特征。也就是说MSG实际上相当于并联了多个hierarchical structure,每个结构中心点数量一样,但是区域范围不同,PointNet的输入和输出尺寸也不同,然后几个不同尺度的结构在PointNet有一个Concat。

    (2)多分辨率分组(MRG)

      MSG方法计算成本很高,因为它在每个质心点的大规模邻域运行局部PointNet。特别是,由于质心点的数量通常非常大(在lowest level),因此时间成本很高。MRG避免了大量的计算,但仍然保留了根据点的分布特性自适应地聚合信息的能力。某个层Li的区域的特征是两个矢量的串联。通过使用设置的set abstraction从较低级别Li-1汇总每个子区域的特征来获得一个向量。另一个向量是通过使用单个PointNet直接处理本地区域中的所有原始点而获得的特征。

      当局部区域的密度低时,第一矢量可能不如第二矢量可靠,因为计算第一矢量的子区域包含更稀疏的点并且更多地受到采样不足的影响。在这种情况下,第二个矢量应该加权更高。另一方面,当局部区域的密度高时,第一矢量提供更精细细节的信息,因为它具有以较低水平递归地表达较高分辨率检查的能力。MRG方法在某一层对每个局部提取到的特征由两个向量串联构成,如下图(b)所示。第一部分由其前一层提取到的特征再次通过特征提取网络得到,第二部分则通过直接对这个局部对应的原始点云数据中的所有点进行特征提取得到。避免了在最低级别的大规模邻域中的特征提取。

    三、网络结构

      PointNet++的基本思想:首先,我们用基础空间的距离度量将点集划分为重叠的局部区域。与CNN相似,我们从小区域内提取点云得局部特征,捕捉精细的几何结构;这些局部特征被进一步分组成更大的单元,并被处理用来产生更高级别的特征。重复这个过程直到我们得到整个点集的特征。

      PointNet++按照任务也分为 classification (C网络)和 segmentation (S网络)两种,输入和输出分别与PointNet中的两个网络一致。首先,比较PointNet++两个任务网络的区别:在得到最高层的 feature 之后,C网络使用了一个小型的 PointNet + FCN 网络提取得到最后的分类 score;S网络通过 skip link connection 操作不断与底层 low-level 信息融合,最终得到逐点分分类语义分割结果。

      注意:分割中的上采样过程,点特征传播过程理解不清(后续补充)

    四、实验

    4.1欧式度量空间中的点云分类

      首先,我们的分层学习架构比非分层PointNet实现了更好的性能[20]。 在MNIST中,我们看到从PointNet(vanilla)和PointNet到我们的方法的错误率降低了60.8%和34.6%。 在ModelNet40分类中,我们还看到使用相同的输入数据大小(1024点)和特征(仅限坐标),我们的功能明显强于PointNet。 其次,我们观察到基于点集的方法甚至可以实现与成熟图像CNN更好或相似的性能。 在MNIST中,我们的方法(基于2D点集)实现了接近网络CNN中的网络的准确度。 在ModelNet40中,我们的有法向量信息的方法明显优于以前最先进的方法MVCNN [26]。

    采样密度变化的稳健性

      我们在测试时间内随机丢弃点(见图4左侧),以验证我们的网络对非均匀和稀疏数据的鲁棒性。 在右图4中,我们看到MSG + DP(在训练期间具有随机输入丢失的多尺度分组)和MRG + DP(在训练期间具有随机输入丢失的多分辨率分组)对于采样密度变化非常稳健。 从1024到256个测试点,MSG + DP性能下降不到1%。 此外,与替代品相比,它在几乎所有采样密度上都实现了最佳性能。 PointNet vanilla [20]在密度变化下相当稳健,因为它专注于全局抽象而不是精细细节。 然而,与我们的方法相比,细节的丢失也使其不那么强大。 SSG(在每个级别中使用单一尺度分组的消融PointNet ++)无法推广到稀疏采样密度,而SSG + DP通过在训练时间中随机丢弃点来修正问题。

    4.2语义场景标注的点集分割

      为了验证我们的方法适用于大规模点云分析,我们还评估了语义场景标记任务。 目标是预测室内扫描中点的语义对象标签。

    采样密度变化的稳健性

      为了测试我们训练的模型在非均匀采样密度的扫描中的表现,我们合成了类似于图1中的Scannet场景的虚拟扫描,并根据这些数据评估我们的网络。

      由于采样密度从均匀点云向虚拟扫描场景的转变,我们发现SSG性能大大下降。 另一方面,MRG网络对采样密度偏移更加稳健,因为它能够在采样稀疏时自动切换到描绘较粗粒度的特征。 即使在训练数据(具有随机丢失的均匀点)和具有非均匀密度的扫描数据之间存在域间隙,我们的MSG网络仅受到轻微影响并且在比较方法中实现最佳准确度。 这些证明了我们的密度自适应层设计的有效性。

    4.3非欧几里德度量空间中的点集分类

      比较我们的方法的第一和第二设置,我们看到内在特征对于非刚性形状分类非常重要。 XY Z特征未能揭示内在结构,并且受姿势变化的影响很大。 比较我们的方法的第二和第三设置,我们看到使用测地邻域是有益的欧几里德邻域。 欧几里德邻域可能包括远离表面的点,当形状提供非刚性变形时,该邻域可能会发生显着变化。 这引入了有效的重量分配的困难,因为局部结构可能变得组合复杂。 另一方面,表面上的测地线邻域摆脱了这个问题并提高了学习效率。

    4.4特征可视化

    五、总结及存在的问题

      从PointNet的结构可以看出,由于没有local context信息,因此对复杂的点云没办法处理,也是PointNet结尾总结的future work,即在PointNet++中进行了升级。由于使用了max-pooling这个具有强对偶性和特征筛选的操作,使得PointNet只能处理较为简单的点云,这些点云都有一个特征:属于同一物体或者处于某个局部空间内。在点云中属于同一个物体和处于某一局部空间内可看作等价。因此,从PointNet的应用目的角度,使用PointNet的点云分割和检测网络主要有以下两种:

    • 放在网络前部,作为局部点云特征提取器(feature extractor)
    • 放在网络后部,作为具体任务的refine或语义分割,如局部点云语义分割或3D BBox等目标的回归

      至于为什么使用PointNet而不是使用PointNet++,从结构上可以看出PointNet++会有一个邻域中心和邻域点云索引的过程,会使速度下降严重,另外对于局部点云这些简单的数据组成,使用PointNet也足够胜任。

      不管点云网络的任务是什么,对于复杂场景点云一般采用PointNet++进行处理,而简单场景点云则采用PointNet。如果只从点云分类和分割两个任务角度分析,分类任务只需要max pooling操作之后的特征信息就可完成,而分割任务则需要更加详细的local context信息。

      在未来,如何通过在每个局部区域共享更多计算来考虑如何加速我们所提出的网络的推理速度,特别是对于MSG和MRG层,这是值得的。

    六、代码解读

    (略)后续补充

    参考:https://zhuanlan.zhihu.com/p/88238420
    https://www.jiqizhixin.com/articles/2019-05-10-13
    https://cloud.tencent.com/developer/article/1640702

  • 相关阅读:
    设计模式
    设计模式
    设计模式
    设计模式
    【Sublime】许可证 及 相关设置
    【Linux】跳过ubuntu grub2引导,使用Windows引导ubuntu
    【Linux】Windows 7下硬盘安装Ubuntu 14.10图文教程
    【ACM】连连看 hdu1175
    【算法】约瑟夫环 C++源代码
    【Java】配置JAVA的环境变量
  • 原文地址:https://www.cnblogs.com/wangchangshuo/p/13853246.html
Copyright © 2011-2022 走看看