从点到面:解密PointNet++如何让点云处理更智能

2024-08-26 23:20

本文主要是介绍从点到面:解密PointNet++如何让点云处理更智能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈喽,大家好,我是Sunny。

在点云处理领域,PointNet++是一篇非常有影响力的论文,它提出了一种新的方法来处理3D点云数据。相比于它的前作PointNet,PointNet++在捕捉局部结构和上下文信息方面做出了重要改进。本文将详细介绍PointNet++的主要思想,重点解释其网络结构。

背景:点云数据与挑战

点云是3D空间中数据的集合,其中每个点都包含空间坐标和可能的附加特征(如颜色、法向量等)。点云广泛用于自动驾驶、3D扫描、机器人导航等领域。然而,点云数据的处理有几个挑战:

  • 无序性:点云中的点是无序的,网络需要在输入顺序变化时保持不变性。
  • 稀疏性与不均匀性:不同区域的点云密度可能差异很大,某些局部区域的点分布较密,而其他区域则可能较稀疏。
  • 局部结构的捕捉:在点云处理中,如何有效捕捉和表达局部区域的几何信息至关重要。

PointNet回顾

在PointNet中,作者提出了一种直接处理点云的端到端网络结构,通过应用对称函数(如max-pooling)来实现对输入点顺序的不变性。然而,PointNet在捕捉局部几何结构时存在局限性,因为它只关注全局特征,忽略了局部区域内的特征关系。

PointNet++的创新

PointNet++针对上述问题提出了一种基于分层结构的改进方法。其核心思想是通过递归地应用PointNet在不同的空间尺度上提取特征,从而在保留全局特征的同时,逐层捕捉局部几何信息。

网络结构

在这里插入图片描述
P o i n t n e t + + Pointnet++ Pointnet++ 的网络结构分为三个模块。

  • 主干模块:分层点集特征学习
  • 分割模块:用于点云的语义分割任务
  • 分类模块:用于三维点云物体分类

主干模块的输出特征输入给分割模块和分类模块,这样构成了 P o i n t N e t + + PointNet++ PointNet++ 的整体网络结构。

其中主干模块类似于编码器,分割模块类似于解码器。

主干模块

主干模块包含多个集合抽象层,该层主要是从特征中提取抽象信息。每一个集合抽象层都由采样、分组、 p o i n t n e t pointnet pointnet 编码三个部分组成。

分割模块

分割模块可以看做编码器的一个逆过程,不断的通过插值和跳跃链接拼接编码器中对应的层来还原所有点。最终得到(N,k)的矩阵,获取每一个点的得分。

分类模块

分类模块将特征送入pointnet得到一个全局特征,接着送入全连接神经网络进行特征映射,最后获得k个类别上的得分。

分层特征提取

集合抽象层(SA层)由三个关键层组成:采样层、分组层和PointNet层(特征提取)。采样层从输入点中选择一组点,用于定义局部区域的质心。然后,通过在质心周围查找“相邻”点,对层进行分组来构造局部区域集。PointNet层使用mini-PointNet将局部区域模式编码为特征向量。

一个集合抽象层将 N × ( d + C ) N×(d+C) N×(d+C) 矩阵作为输入,包含 N N N个点,每个点有 d d d维坐标和 C C C维特征向量。它的输出是 N ′ × ( d + C ′ ) N'\times({d+C'}) N×(d+C) 的矩阵,其中 N ′ N' N 是二次采样后的点,具有 d d d维坐标和总结了局部上下文信息的 C ′ C' C维特征向量。

集合抽象层的几个关键步骤:

  • 采样(Sampling): 使用FPS(Farthest Point Sampling)方法从输入点云中选择一个较小的子集,作为当前层的关键点。FPS确保采样点尽可能均匀地分布在整个点云中,这对捕捉全局特征尤为重要。

  • 分组(Grouping): 对于每个采样点,基于欧氏距离定义一个局部邻域,形成一个点集。这个点集包括了当前采样点及其周围的若干近邻点。这样可以在局部区域中捕捉到更细粒度的几何特征。

  • 特征提取(Feature Extraction): 在每个分组后的点集中,应用一个小型的PointNet网络来提取局部特征。该过程可以理解为在每个局部邻域内学习一个特征表示,类似于传统卷积神经网络中的局部卷积操作。

  • 特征聚合(Feature Aggregation): 通过对每个局部特征进行池化操作(如max-pooling),提取出该局部区域的特征表示,并将其与采样点关联。经过几层处理后,网络逐渐从小尺度局部特征聚合到大尺度的全局特征。

多尺度特征学习

一个重要的改进在于,PointNet++引入了多尺度特征学习(Multi-Scale Grouping, MSG)和自适应特征学习(Multi-Resolution Grouping, MRG)。这些机制通过在不同尺度上进行特征提取,增强了模型对不同粒度几何结构的捕捉能力。
具体来说,MSG在每一层中使用多个不同半径的邻域,而MRG则通过在不同层次中逐渐调整采样密度,使网络更灵活地适应数据的稀疏性变化。
在这里插入图片描述

特征传播(Feature Propagation)

在点云分割和分类任务中,通常需要恢复到原始点云的分辨率。
PointNet++通过一个特征传播模块来逐步将分层中提取到的特征映射回原始点集。
这个模块通过插值操作和残差连接将特征逐级传播,确保高分辨率点云的特征信息得以保留。

实验

作者在4个数据集上训练,包括2D物体(MINST),3D物体(ModelNet40 刚性物体,SHREC15 非刚性物体),真实的3D场景(ScanNet)。

  • MNIST:手写数字图像,60k训练样本和10k测试样本。
  • ModelNet40:40个类别的CAD模型(主要是人造的)。我们使用9843个形状的官方分割用于训练,2468个用于测试。
  • SHREC 15:50个类别的1200种形状。每个类别包含24个形状,其中大部分是非刚性的,具有各种姿势,如马,猫等,我们使用五折交叉验证,以获得在这个数据集上的分类精度。
  • ScanNet:1513个扫描和重建的室内场景。我们遵循中的实验设置,使用1201个场景进行训练,312个场景进行测试。

在欧式度量空间的点集分类

M I N S T MINST MINST M o d e l N e t 40 ModelNet40 ModelNet40 上的表现

使用面法线作为额外特征并使用更多的点的方法在 M o d e l N e t ModelNet ModelNet上表现最好,超越了 C N N CNN CNN的方法。
在这里插入图片描述

对采样密度变化的鲁棒性

在这里插入图片描述

如左图所示,在测试期间随机丢弃点,以验证网络对非均匀和稀疏数据的鲁棒性。图中 D P DP DP 是在训练期间随机丢弃输入点。

如右图所示,在采样密度变化时, M S G + D P MSG+DP MSG+DP M R G + D P MRG+DP MRG+DP 表现的比较鲁棒。

1024 1024 1024到$25 6 个测试点, 6个测试点, 6个测试点,MSG+DP$ 性能下降不到 1 1 1%。和其他方法相比,在几乎所有采样密度上实现了最好的性能。

P o i n t N e t PointNet PointNet v a n i l l a vanilla vanilla 在密度变化下相当鲁棒,因为它专注于全局特征而不是精细细节。

部分方法在丢失细节后表现不好。 S S G SSG SSG(每个级别具有单尺度分组的消融 P o i n t N e t + + PointNet++ PointNet++)在稀疏采样密度下表现不佳,而 S S G + D P SSG+DP SSG+DP 通过在训练时间中随机丢弃点来修正该问题。

基于点集分割的语义场景标注

在这里插入图片描述

为了进行公平的比较,我们在所有实验中删除了RGB信息,并按照ScanNet论文中将点云标签预测转换为体素标签。

与体素化的方法相比,直接在点云上学习可以避免额外的量化误差。为了测试我们的训练模型在非均匀采样密度的扫描上的表现,我们合成了扫描网络场景的虚拟扫描,并在此数据上评估我们的网络。

我们看到,由于采样密度从均匀的点云到虚拟扫描的场景,SSG的性能大大下降。MRG网络对采样密度偏移更具鲁棒性,因为当采样稀疏时,它能够自动切换到描绘较粗粒度的特征。MSG网络仅受到轻微影响,并且在比较中达到了最佳精度。这些都证明了密度自适应层设计的有效性。

在这里插入图片描述

由于引入了分层特征学习,并在不同尺度上捕获几何特征。这对于理解多层次的场景和标记各种大小的对象非常重要。在图6中可视化示例场景标记结果。

非欧度量空间中点集分类

本部分主要测试在非欧几里得空间上的泛化性。

在非刚性形状分类中(图7),一个好的分类器应该能够正确地将图7中的(a)和(c)分类为相同的类别,即使考虑到它们的姿态差异,这需要内在结构的知识。

在这里插入图片描述

测试结果如表3所示。

在这里插入图片描述

总结

PointNet++在PointNet的基础上,通过引入分层结构、局部特征提取、多尺度特征学习和特征传播模块,有效地解决了点云处理中局部几何信息捕捉的挑战。它的设计思想与传统卷积神经网络中的分层特征提取类似,但针对点云数据的稀疏性、不均匀性和无序性做了优化。因此,PointNet++在多个3D点云任务中表现出色,如3D目标检测、语义分割和场景理解。


我是Sunny,你也可以叫我萨宁,一个热爱分享编程知识的程序员。我的昵称是Sunny不要停,寓意是美好的晴朗日子不要停下来,希望大家都能每天开开心心的。我的频道主要分享编程知识,生活,大学计算机学科学习,考研经验。目前有大学学习,考研相关的问题,欢迎关注我,同名公众号[Sunny不要停]可以找到我的联系方式。

这篇关于从点到面:解密PointNet++如何让点云处理更智能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109979

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密