SLAM在ARM上的加速(3)- Neon在SLAM中的应用

news2024/9/22 21:13:02

SLAM在ARM上的加速:

SLAM在ARM上的加速(1)- ARM加速基础

SLAM在ARM上的加速(2)- Neon

SLAM在ARM上的加速(3)- Neon在SLAM中的应用

视觉SLAM通常可以分为前端和后端两个部分:
(1)、前端主要负责在实时场景中提取特征点、跟踪相机运动和估计相机姿态。它的任务是通过分析输入的图像序列或点云数据,提取有意义的特征并将它们与地图进行对齐,从而得到相机的运动轨迹和局部地图。前端算法通常包括特征提取与描述子生成、特征匹配和运动估计等步骤。
(2)、后端负责优化前端产生的轨迹和地图,消除估计误差并提高精度。它的任务是使用优化技术(例如图优化和非线性优化)对前端产生的相机轨迹和地图进行优化,从而最小化误差并提高整个系统的一致性。后端通常使用梯度下降等方法对大规模非线性最小化问题进行优化,以获得更准确的相机轨迹和地图。

前端任务需要在实时环境下执行,因为SLAM系统通常需要即时地定位相机并生成地图,因此对前端的加速很有必要,可以从以下几个方面使用NEON完成加速:
(1)、特征提取:从输入的相机图像中提取有意义的特征点,这些特征点通常是图像中明显的角点或纹理丰富的区域。
(2)、特征跟踪:在连续的图像帧之间追踪特征点,这通常涉及到使用特征描述子将初始特征点与后续帧中的对应点匹配起来。
(3)、相机姿态估计:根据特征点的运动信息来估计相机的姿态变化,这包括相机的位姿(位置和方向)和运动速度。
(4)、深度估计:通过特征点的视差或其他视觉几何方法,估算相机观察到的场景中物体的深度信息。
(4)、其他:一些图像的处理操作。

1 特征提取

SLAM中最常见的特征点提取有以下两种:
(1)orb-slam采用的fast角点
(2)vins-mono采用的Shi-Tomasi角点

1.1 fast角点加速

1.2 Shi-Tomasi角点加速

cv::goodFeaturesToTrack(也称为shi-Tomasi角点检测)是一种角点检测算法,用于在图像中检测重要的地方或角点。这个算法最初由J. Shi和C. Tomasi在1994年的论文中提出。

goodFeaturesToTrack算法旨在找到最显著的角点,它假定角点周围的像素在各个方向上都会产生较大的像素变化。它通过计算每个像素周围窗口的协方差矩阵的特征值来度量每个像素的显著性。一个像素被认为是角点当且仅当它的最小特征值大于某个阈值,并且它的最小特征值比其周围像素的最小特征值大。

具体来说,goodFeaturesToTrack算法可以分为以下几个步骤:

  1. 计算图像梯度:用Sobel算子计算图像在x和y方向上的梯度。这个步骤可以帮助我们找到图像中每个像素周围的像素变化情况。

  2. 计算协方差矩阵:对于每个像素,计算在其周围的固定大小的窗口中像素值的协方差矩阵。这个步骤可以帮助我们度量像素周围像素变化的方向和大小。

  3. 计算特征值:计算协方差矩阵的特征值,并根据特征值计算特征值比,从而得到每个像素的显著性。特征值比等于最小特征值除以最大特征值。

  4. 检测角点:遍历所有像素,如果一个像素的特征值比大于某个阈值,并且它的特征值比大于周围像素的特征值比,那么它就被认为是一个角点。

  5. 过滤角点:对于所有检测到的角点,通过对它们进行排序和去重等操作,最终得到最显著的角点。

总的来说,goodFeaturesToTrack算法是一种基于协方差矩阵的特征检测算法,它通过计算像素周围像素变化的方向和大小,来找到最显著的角点。这个算法在计算量方面较小,并且对各种图像类型都有很好的鲁棒性。

2 特征跟踪

3 相机姿态估计

4 深度估计

5 其他

5.1 RGB加载de-interleave与存储interleave

ps:交织(interleave)和解交织(de-interleave)是与图像数据处理相关的两个概念。
交织(RGB存储)是指将RGB通道的数据按照特定的顺序组合在一起,形成一个连续的像素数组。每个像素数组包含红(R)、绿(G)、蓝(B)三个通道的数据。这种存储方式可以用于保存图像数据或传输图像数据。交织存储的目的是将各个通道的数据正确组合起来,以还原出原始图像的颜色信息。
解交织(RGB加载)是指将存储在不同通道中的像素数据重新合并为一个连续的图像帧。通过按照特定的顺序从各个通道提取像素数据,并将它们按顺序置于一个像素数组中,可以还原图像的完整信息。解交织常用于从RGB图像数据中提取各个通道的数据,以便对每个通道进行独立处理。

 使用 vld3q 以解交织的方式加载 RGB 图像,输入地址为 in_ptr, 输出向量为 vec

uint8x16x3_t vec = vld3q(in_ptr);

vst3q 以交织的方式存储 RGB 图像,输出地址为out_ptr, 输入为 uint8x16x3_t 类型的 RGB 向量
vst3q(out_ptr, vec);

5.2 查表操作

快速找到特征点的值TBL/TBX。

a表示table,向量类型的表,最多可以有 4 个寄存器向量值。
b表示index,向量类型的下标,通过下标向量到表中查找对应的元素。
c表示结果
uint8x8_t c = vtbl2_u8(a, b)

5.3 边缘处理

处理图像边缘时,经常会有使用常数填充边界的情况。

NEON 开发中,可以使用DUP指令将常数填充到向量中,然后使用EXT指令组建新向量。例如 7x7 的 boxfilter,处理边界时需要填充 3 个像素的值EXT指令还常常用于滤波向量的重组操作。

// 构造边界填充向量
uint8_t c_0 =0;
uint8x8_t v_c0 = v_dup_n_u8(c_0);

// 构建v_1
uint8x8_t v_1 = vext_u8(v_c0, v_0, 5)

// 使用 vext 构建边界向量,v0 表示从纵坐标为 0 起始的向量
uint8x8_t v_border = vext_u8(v_1, v_c0, 3)

5.4 SAD

SAD(sum of absolute difference) 运算可以使用 NEON 指令来加速。

首先使用vabd做差的绝对值计算,然后使用vdot将上面的结果做累加。

// 初始化 v_sum 和 v_c1  
uint32x4_t v_sum = vmovq_n_u32(0);
uint8x16_t v_c1  = vmovq_n_u8(1);

// v_src0, v_src1为两幅图的输入
// 将做差的绝对值计算
uint8x16_t v_abd_res = vabdq_u8(v_src0, v_src1);

// 做 vdot操作
v_sum = vdotq_u32(v_sum , v_abd_res, v_c1);
...
// 将最后的结果累加
uint32_t res = vaddvq_u32(v_sum);

未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)是一种基于能量模型的人工神经网络。它只有一个隐层,将输入层和隐层中的每个神经元互相连接,但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

09_Linux内核定时器

目录 Linux时间管理和内核定时器简介 内核定时器简介 Linux内核短延时函数 定时器驱动程序编写 编写测试APP 运行测试 Linux时间管理和内核定时器简介 学习过UCOS或FreeRTOS的同学应该知道, UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟…

Vue生态及实践 - 优化实践

目录 目标 keep alive util/vue.js【vue里面常用的函数】 src/components/UKeepAlive.vue 无限加载列表优化的实现方案 src/util/throttle.js src/components/UInfiniteList.vue src/module/topic/views/UTopic.vue 献上一张ai生成图~ 目标 Keep Alive实践长列表优化…

基于pytorch的神经网络与对比学习CL的训练示例实战和代码解析

目录 对比学习原理解析构建一个对比学习模型(代码详解)导入库构建简单的神经网络构建对比学习的损失函数开始训练 完整代码 对比学习原理解析 对比学习(Contrastive Learning)是一种无监督学习方法,用于从未标记的数据…

3 STM32标准库函数 之 窗口看门狗(WWDG)所有函数的介绍及使用

3 STM32标准库函数 之 窗口看门狗(WWDG)所有函数的介绍及使用 1. 图片有格式2 文字无格式三 库函数之窗口看门狗(WWDG)所有函数的介绍及使用前言一、IWDG库函数固件库函数预览1.1 函 数 IWDG_WriteAccessCmd1.1.1 IWDG_WriteAcces…

string模拟实现

文章目录 1.回顾库函数strcpymemcpystrcmpstrstr 2.回顾类和对象哪些函数里会有this指针?this指针调用方法结论:只要是不修改this指针指向的对象内容的成员函数,都可以加上const自己写了构造函数,编译器不会自动生成默认构造2.1构…

代码随想录第21天 | 回溯理论基础 77. 组合

回溯理论基础 回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构! 因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的…

MySQL面试题总结(部分)

一.介绍MySQL为什么在面试中会提及 1.为什么要在面试时MySQL会被提及? 在面试中问MySQL问题有几个主要原因: 1. 数据库管理系统的重要性:MySQL作为一种常用的关系型数据库管理系统(RDBMS),在互联网和企业应用中得到广泛使用。对数…

Conda安装及使用方法(常用命令)

系列文章目录 文章目录 系列文章目录前言一、Conda下载安装1.下载2.安装3.配置国内源 二、Conda安装Python环境1.创建虚拟环境2.激活虚拟环境3.虚拟环境安装Python库 三、Conda环境环境执行脚本四、PyCharm配置Conda环境五、Conda迁移环境1.方式一:拷贝环境2.方式二…

Modbus通信从入门到精通_1_Modbus通信基础

关于Modbus通信的相关知识比较零碎,此处对查找到的知识点从理论,通信协议、使用方法方面进行整理。 值得学习的博文:Modbus及调试用软件介绍;Modbus协议和上位机应用开发介绍 文章目录 1. Modbus通信理论1.1 Modbus通信特点1.2 存…

多线程(1): 线程的创建、回收、分离

1. 多线程概述 多线程在项目开发过程中使用频率非常高,因为使用多线程可以提高程序的并发性。提高程序并发性有两种方式:(1)多线程 (2)多进程。但是多线程对系统资源的消耗会更加少一些,并且线程和进程执行效率差不多。 在执行系统应用程序时&#xff…

2023/7/8总结

Tomcat 启动:双击bin目录下的startup.bat文件停止:双击bin目录下的shutdown.bat 文件访问 :http://localhost:8080(默认是8080,可以修改) git的使用 打开git bash git config --global user.name "名…

Vue3---什么是路由缓存问题

使用带有参数的路由时需要注意的是,当用户从 /users/johnny 导航到 /users/jolyne 时,相同的组件实例将被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩…

500万PV的网站需要多少台服务器?

1. 衡量业务量的指标 衡量业务量的指标项有很多,比如,常见Web类应用中的PV、UV、IP。而比较贴近业务的指标项就是大家通常所说的业务用户数。但这个用户数比较笼统,其实和真实访问量有比较大的差距,所以为了更贴近实际业务量及压力…

什么是提示工程?

原文链接:芝士AI吃鱼 理解大规模人工智能模型为何如此行事是一门艺术。即使是最有成就的技术专家也会对大型语言模型 (LLM) 的意想不到的能力感到困惑,大型语言模型是ChatGPT等人工智能聊天机器人的基本构建模块。 因此,提示工程成为生成式 …

特征选择算法 | Matlab 基于最大互信息系数特征选择算法(MIC)的分类数据特征选择

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab 基于最大互信息系数特征选择算法(MIC)的分类数据特征选择 部分源码 %--------------------

python 常用数据结构-列表

list 列表 列表定义与使用列表常用方法列表嵌套列表推导式 列表定义 列表是有序的可变元素的集合,使用中括号[]包围,元素之间用逗号分隔 列表是动态的,可以随时扩展和收缩 列表是异构的,可以同时存放不同类型的对象 列表中允…

阶乘后的零(力扣)数学 JAVA

给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * … * 3 * 2 * 1 示例 1: 输入:n 3 输出:0 解释:3! 6 ,不含尾随 0 示例 2: 输入:n 5 输出&…

WSL2 及 docker开发环境搭建

WSL2 及 docker开发环境搭建 1.使能WSL 控制面板->程序->程序和功能->启动或关闭Windows功能->勾选红框中选项->确认后重启电脑  2.下载Linux Kernel Update安装包 下载地址如下, 附件已将下载的安装包作为附件形式上传,…

ITIL 4服务连续性管理实践

一、目的和描述 关键信息 服务连续性管理实践的目的是确保灾难发生时,服务的可用性和性能能够保持在足够的水平。本实践提供了一个框架机制,利用产生有效响应的能力来构建组织的弹性,以保障关键利益相关者的利益,还有组织的声誉…