从点到面:解密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

相关文章

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req