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

论文笔记:(NIPS2017)PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space的更多相关文章

  1. 论文笔记(1):Deep Learning.

    论文笔记1:Deep Learning         2015年,深度学习三位大牛(Yann LeCun,Yoshua Bengio & Geoffrey Hinton),合作在Nature ...

  2. 论文笔记: Dual Deep Network for Visual Tracking

    论文笔记: Dual Deep Network for Visual Tracking  2017-10-17 21:57:08  先来看文章的流程吧 ... 可以看到,作者所总结的三个点在于: 1. ...

  3. 【论文笔记】多任务学习(Multi-Task Learning)

    1. 前言 多任务学习(Multi-task learning)是和单任务学习(single-task learning)相对的一种机器学习方法.在机器学习领域,标准的算法理论是一次学习一个任务,也就 ...

  4. 论文笔记之: Deep Metric Learning via Lifted Structured Feature Embedding

    Deep Metric Learning via Lifted Structured Feature Embedding CVPR 2016 摘要:本文提出一种距离度量的方法,充分的发挥 traini ...

  5. 论文笔记之:Deep Reinforcement Learning with Double Q-learning

    Deep Reinforcement Learning with Double Q-learning Google DeepMind Abstract 主流的 Q-learning 算法过高的估计在特 ...

  6. 论文笔记之:MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching

    MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching CVPR  2015 本来都写到一半了,突然笔记本死机了 ...

  7. (论文笔记Arxiv2021)Walk in the Cloud: Learning Curves for Point Clouds Shape Analysis

    目录 摘要 1.引言 2.相关工作 3.方法 3.1局部特征聚合的再思考 3.2 曲线分组 3.3 曲线聚合和CurveNet 4.实验 4.1 应用细节 4.2 基准 4.3 消融研究 5.总结 W ...

  8. 论文笔记之:Deep Recurrent Q-Learning for Partially Observable MDPs

    Deep Recurrent Q-Learning for Partially Observable MDPs  摘要:DQN 的两个缺陷,分别是:limited memory 和 rely on b ...

  9. 论文笔记之:Deep Attention Recurrent Q-Network

    Deep Attention Recurrent Q-Network 5vision groups  摘要:本文将 DQN 引入了 Attention 机制,使得学习更具有方向性和指导性.(前段时间做 ...

随机推荐

  1. Pandas高级教程之:处理text数据

    目录 简介 创建text的DF String 的方法 columns的String操作 分割和替换String String的连接 使用 .str来index extract extractall c ...

  2. 学习JDK源码(二):Integer

    最近没有好好保持学习的好习惯,该打. 天天忙,感觉都不知道在干嘛.真的厌倦了普通的Java代码,还是想学点新技术. 用了这么久的Java,最常用的数据类型肯定是Int了,而他的包装类Integer用的 ...

  3. Binding(三):资源和ValueConverter

    这节讲资源和值转换器(ValueConverter). 资源 在XAML中,我们想要使用外部的数据或者类,需要引入其命名空间,然后将其定义为XAML页面的资源,供给控件使用,或者我们需要封装一个共用的 ...

  4. Java-学习日记(Java8异步)

    今天用到的中异步操作:异步编程与异步处理数据 //里面返回其他接口服务使用CompletableFuture CompletableFuture.runAsync(()->{ driverNoR ...

  5. 机械革命z2安装ubuntu20

    为了性能买了个游戏本机械革命z2,但还是想用上linux,身为程序员习惯了linux的开发环境有点离不开.但是之前尝试安装deepin或者linux都失败了,一是N卡条件下安装过程和安装之后的显示有问 ...

  6. 一致性hash原理 看这一篇就够了

    ​ 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓 ...

  7. Kubernetes隔离pod的网络

    本章介绍如何通过限制pod可以与其他哪些pod通信,来确保pod之间的网络安全. 是否可以进行这些配置取决于集群中使用的容器网络插件.如果网络插件支持,可以通过NetworkPolicy资源配置网络隔 ...

  8. NuGet微软官方中国镜像地址

    https://nuget.cdn.azure.cn/v3/index.json

  9. rsync 基本使用

    基本参数 # rsync -P test.tar.gz ./ test.tar.gz 395,706,368 48% 377.34MB/s 0:00:01 Or # rsync -avPh test. ...

  10. 25 Linux中的信号

    Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...