3D点云分割系列4:PointSIFT:SIFT算法在点云处理中的应用,从PointNet++的球查询扩展到8向查询

news/2024/5/18 23:14:10/文章来源:https://blog.csdn.net/yumaomi/article/details/129961741

PointSIFT

《PointSIFT: A SIFT-like Network Module for 3D Point Cloud Semantic Segmentation》2018年发布在arXiv上。

1 引言

PointNet和PointNet++成功实现point-base的3D点云分割。基于此,更多point-base的方法提出,这些方法普遍是对PointNet和PointNet++的改进。本文介绍的PointSHIT即对PointNet++的改进。

首先,我们需要引入SIFT的概念。SIFT即尺度不变特征转换(Scale Invariant Feature Transform)是图像处理领域中的一种局部特征描述算法。SIFT特征对于旋转和尺度均具有不变性,并且对于噪声、视角变化和光照变化具有良好的鲁棒性。

SIFT算法可以简要分成以下三步:

  1. 事先寻找一些关键点。
  2. 然后基于局部图像的梯度方向,为每个关键点位置分配一个或多个方向,后续所有对图像数据的操作都是相对于关键点的方向、尺度和位置进行变换,这些变换提供了不变性。
  3. 在每个关键点周围的区域内以选定的比例计算局部图像梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

这三个步骤对应了上图中淡灰色框线的三部分。

2PointSIFT

2.1 PointSIFT module

SIFT算法两个关键点分别是尺度不变检测器和旋转不变描述符。在关键点检测剪短,SIFT算法通过多尺度表示来实现尺度不变性。在特征描述阶段,SIFT检测旋转不变性的主导方向,并综合感知不同方向的图像模式。

2.1.1 Orientation-encoding

PointNet和PointNet++中均使用对称函数MaxPool(属于无序的运算符),但作者认为最大池化会抛弃邻域内除最大值以外的值,会损失部分信息。而使用有序的运算符可以提供更多信息,同时仍然能够保留输入点云的顺序不变性。这里引入了方向编码单元(Orientation-encoding unit),这是一个逐点局部特征描述符,对八个方向的信息进行编码。

OE 嵌入的第一阶段是 Stacked 8-neighborhood (S8N) Search,它在按三个坐标排序划分的八个八分圆中的每一个中找到最近的邻居(图3b)。由于远距离点提供的局部模式描述信息很少,当在某个八分圆的搜索半径 r 内不存在任何点时,复制 p0p_0p0 作为其自身的最近邻居。

为了更好的描述p0p_0p0点的特征,作者提出使用卷积来对2 × 2 × 2 立方体中的那些邻居的特征进行编码,作为以p0p_0p0为中心的局部模式描述。作者认为诸如卷积之类的有序运算符可以更好地利用数据的结构。因此,这里提出了方向编码卷积(OE convolution),它是一个三级运算符,依次沿 X、Y 和 Z 轴对 2 × 2 × 2 立方体进行卷积。形式上,相邻点的特征是一个形状为 2×2×2×d 的向量 V,其中前三个维度对应三个轴。向量M的切片是特征向量,例如M(1,1,1)M_{(1,1,1)}M(1,1,1)表示来自右上角八分圆的特征。三级卷积公式为

Vx=g(Conv⁡(Wx,V))∈R1×2×2×dVxy=g(Conv⁡(Wy,Vx))∈R1×1×2×dVxyz=g(Conv⁡(Wz,Vxy))∈R1×1×1×d\begin{aligned} V_{x} & =g\left(\operatorname{Conv}\left(W_{x}, V\right)\right) \in \mathbb{R}_{1 \times 2 \times 2 \times d} \\ V_{x y} & =g\left(\operatorname{Conv}\left(W_{y}, V_{x}\right)\right) \in \mathbb{R}_{1 \times 1 \times 2 \times d} \\ V_{x y z} & =g\left(\operatorname{Conv}\left(W_{z}, V_{x y}\right)\right) \in \mathbb{R}_{1 \times 1 \times 1 \times d}\end{aligned} VxVxyVxyz=g(Conv(Wx,V))R1×2×2×d=g(Conv(Wy,Vx))R1×1×2×d=g(Conv(Wz,Vxy))R1×1×1×d

这里Wx∈R2×1×1×d,Wy∈R1×2×1×d,Wz∈R1×1×2×dW_x\in {\mathbb{R}_{2 \times 1 \times 1 \times d}},W_y\in {\mathbb{R}_{1 \times 2 \times 1 \times d}},W_z\in {\mathbb{R}_{1 \times 1 \times 2 \times d}}WxR2×1×1×d,WyR1×2×1×d,WzR1×1×2×d为卷积模块的权重。ggg函数则用ReLUReLUReLU替代。OE卷积最后将输出重塑为Vxyz∈R1×1×1×dV_{xyz}\in {\mathbb{R}_{1 \times 1 \times 1 \times d}}VxyzR1×1×1×d。这个输出整合了来自八个方向空间的信息,是特征点p0p_0p0在八个空间方向上的方向编码信息。

2.1.2 尺度感知

为了能够提取多个尺度的特征,这里遵循了长期以来的多尺度表示方法,在PointSIFT模块中堆叠多个方向编码单元。

高层次的OE单元比低层次的OE单元获得更大的感受野,通过不同层次的OE单元的组合,PointSIFT模块能够获得点云局部区域的多尺度表示,通过多个identity连接这些特征,再通过一个逐点卷积(Pointwise Convolution)来输出d维的多尺度特征。在联合优化特征提取和集成多尺度特征的逐点卷积的过程中,神经网络将学会选择或关注适当的尺度,为模型添加不同尺度的感知。

2.2 PointSIFT模型

PointSIFT模型继承了PointNet和PointNet++的模型结构和一些模块,其中包括PointNet++中的set abstraction(SA)和feature propagation(FP),整体结构与PointNet++相同。

实验

作者设计实验证明球查询和s8N查询的效果差异,将s8N查询用于PointNet++。其余参数相同,结果证明s8N查询获得的效果最好。

结论

提出了一个新的PointSIFT模块。该模型两个关键在于:

  1. 方向编码单元捕获不同方向的信息。
  2. PointSIFT模块的多尺度表示能够处理各种尺度的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_658509.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件操作编程

这世间,青山灼灼,星光杳杳,秋风渐渐,晚风慢慢 文件操作编程文件操作编程1)熟悉Linux的C编程环境编译优化2)文件基本操作编程使用Linux系统调用编写一个完成文件拷贝的C程序。比较拷贝得到的文件与源文件的大…

最长****子序列

(在研读大佬写的博客后,打算记录下自己学习过程) 通过最长上升子序列的拓展了解到,其实这是一个系列的问题主要代表有: 1 最长上升子序列 2 最长不上升子序列 3 最长下降子序列 4 最长不下降子序列 就以最长上升子…

【创作赢红包】python学习——【第七弹】

前言 上一篇文章 python学习——【第六弹】中介绍了 python中的字典操作,这篇文章接着学习python中的可变序列 集合 集合 1: 集合是python语言提供的内置数据结构,具有无序性(集合中的元素无法通过索引下标访问,并且…

leetcode 删除链表的倒数第 n 个结点(3.)

题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3&…

反转字符串II(力扣刷题)

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符&…

图片怎么转PDF文件格式?推荐这五个免费无损转换方法!

如何将图片转换为PDF?图片格式文件经常用于每个人的日常生活中,但有时候。我们会将多张图片转换为一份PDF文件进行单个文件传输,但很多人不知道如何将图片转换为PDF格式。 今天,我将与大家分享五种简单免费的无损转换方法&#x…

【CVPR小目标检测】- ISNet红外小目标检测

ISNet:红外小目标探测的形状问题 ——从分割的角度完成小目标红外检测红外图像: 红外小目标使用红外热成像技术,使得红外目标检测能够全天候工作,可视距离远,抗干扰能力强。当像素距离较远时,目标所占比例…

记录如何把postman变成为中文版

首先点击下方这个链接,进入gitee,在里面下载一个插件 Releases hlmd/Postman-cn GitHub 进来是这个样子: 看一下自己的postman是什么版本的,然后在gitee下载对应的APP包 应该怎么查看我的postman版本号呢? ~~看下…

代理模式:JDK动态代理和静态代理回顾

背景:Spring主要有两大思想:IoC、AOP。对于IoC依赖注入不多说了,对于Spring的核心AOP来说,我们需要了解其底层的实现原理:java的动态代理机制。 本篇随笔就是对java的动态机制进行一个回顾。 代理模式的理解 类型&…

三甲医院手术麻醉系统源码, C# .net 桌面软件 C/S版源码

手术麻醉管理系统源码,手麻系统源码,大型医院手术麻醉系统源码 相关技术:C#语言 前端框架:Winform 后端框架:WCF 数 据库:sqlserver VS2019 文末获取联系 手术麻醉系统是面向医生实际工作情况开发的专…

Excel宏(VBA)密码破解

最近在研究一个Excel宏,想查看VBA代码但是有密码,于是想着能不能移除密码。网上查找一番资料后进行了尝试。 一,准备工具 ExcelHex Editor Neo 二,开始实践 首先将.xlsm后缀名的文件改为.zip文件 然后双击zip文件(不用解压文件…

字节跳动CVPR 2023论文精选来啦(内含一批图像生成新研究)

计算机视觉领域三大顶会之一的 CVPR 今年已经开奖啦。 今年的 CVPR 将于六月在加拿大温哥华举办,和往年一样,字节跳动技术团队的同学们收获了不少中选论文,覆盖文本生成图像、语义分割、目标检测、自监督学习等多个领域,其中不少…

AUTOSAR SecOC的CAN FD应用

20多年来,CAN一直是并且仍然是车辆中的主导通信系统。 随着车载功能日益复杂,传统CAN已无法满足对有效数据速率日益增长的需求。 因此,引入了CAN FD—它允许高达64字节的有效载荷以实现2 Mbit/s 和5 Mbit/s的数据速率。为了将这一主要优势用于…

【CocosCreator入门】CocosCreator组件 | Mask(遮罩)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中Mask组件可用于创建如圆形、矩形和任意形状的遮罩效果,以限制节点显示的范围。这对于创建具有复杂布局的UI元素非常有用,例如只显示图片的一部分或控制文本显示…

C++相关面试题总结一——内存、关键字、STL、指针、排序、Lambda

面试题总结 基础 C是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C支持多种编程范式:面向对象编程、泛型编程和过程化编程。其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强…

JavaSE——方法的使用

目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 3、递归练习 一、方法的概念及使用 1、…

【进阶C语言】内存函数(详解)

前言 上一期讲的函数都是和字符串相关的,但是我们在操作数据的时候,不仅仅是操作字符串的数据,还得需要内存函数的应用 内存函数的应用1. memcpy1.1 memcpy的介绍1.2 memcpy的使用1.3 模拟实现memcpy库函数1.4 我想在1,2后面打印1…

web学习---Vue---笔记(1)

该笔记是记录尚硅谷的Vue学习视频的笔记,视频地址为:学习视频地址 初始Vue Vue组件化的特点 组件化声明式编码虚拟DOMDiff算法,尽量复用DOM节点 H5的组件,是把某一个模块封装,里面写HTML\CSS\JS等,算是一…

关于软件发布等一系列注意事项

我们以VS for Qt 开发为案例 1、软件图标的使用: this->setWindowIcon(QIcon("写入路径"));注意这里的路径,一般需要你先添加图片到资源文件中 那么如何将图片添加到资源文件中呢? 1、打开qrc文件 2、添加前缀,添…

【Linux】八、Linux进程信号详解(一)

目录 一、认识信号 1.1 生活中的信号 1.2 将1.1的概念迁移到进程 1.3 信号概念 1.4 查看系统定义信号列表 1.5 man 7 signal 1.6 解释1.2的代码样例 1.7 信号处理常见方式概览 二、产生信号 2.1 signal函数 2.2 通过终端按键产生信号 2.3 调用系统函数向进程发信号…