【论文阅读】NGD-SLAM: Towards Real-Time SLAM for Dynamic Environments without GPU

news2024/9/20 10:27:47

arxiv上一篇很新的视觉SLAM论文,能够在不使用GPU的情况下进行语义分割的辅助运算。

一、跟踪流程

作为一个语义结合的视觉SLAM,其基本的思路和以前看过的DynaSLAM基本类似,都是依赖语义分割模型对场景中动态的特征点进行剔除,这样子减少动态物体对里程计的干扰。传统的解决方案是传入的每一帧开两个线程,一个用于语义分割,另一个用于特征提取,之后根据语义结果过滤特征结果。由于特征提取速度一般要比语义分割快得多,所以经常会出现整个系统等待语义分割模型推理的现象。而NGD-SLAM通过巧妙的框架设计,让跟踪线程不需要完全等待语义分割。
在这里插入图片描述
从论文中的流程图可以看出,第一帧还是存在一个等待的过程,但是后续的过程中得益于语义跟踪的加入,并不需要每一帧都等待。

二、语义线程

整个框架选择使用YOLO-fastest来进行语义分割,而且作者设置了一个很独特的缓冲区用于传递模型的输入和输出。输入的部分会实时更新,推理的结果会保存到输出缓冲区。跟踪线程每处理一张图像,就把这张图放入输入缓冲区,之后模型推理完再放到输出缓冲区。这样跟踪线程就不会被迫等待语义分割线程。但这也使得两个线程不同步,也就是处理的图像并不是同一时刻的,这个问题NGD-SLAM使用掩码预测进行了修正。

三、掩码预测

所谓掩码预测,其实就是根据类似恒速模型的方法,推测一个可能动态物体的位置。作者将这个模块分为六步。
在这里插入图片描述

检测

对于上一帧的图像,首先使用YOLO进行目标检测,得到一个带有语义信息的bounding box。这一步和DynaSLAM的方法是一样的。

分割

bounding box一定程度上已经给出了动态物体的位置信息,但是不够准确,所以这里又对检测后的bounding box基础上,利用深度信息进行了一次分割。作者并没有提到深度信息哪里来的,但是如果是对整张图进行的分割,那么就要求每个像素都要有深度,这种情况下,估计作者使用的是深度相机来直接得到深度。

取样

分割完成后,我们得到了上一帧图像动态物体的掩码,之后为了完成掩码预测,作者对这部分归属于动态物体的像素进行了采样。标记为动态物体的像素划分为15×15的网格,每个网格内提取FAST特征点并选取响应值最高的一个,如果提取不到就随便选一个。这些点就会被认为是动态关键点。

跟踪

动态关键点之后使用光流法进行跟踪,这里的跟踪不是ORBSLAM里面的那种跟踪,而是利用光流法,通过最小化光度误差的方法,计算出动态关键点在当前帧的位置。我们也可以将其理解为是利用实际SLAM过程中图像之间差距不大的特点,让动态关键点也能像一般的关键点一样进行跟踪,但是由于动态物体和相机移动不一致,所以这里用光流法进行跟踪。

聚类

得到当前帧的动态关键点之后,作者又使用DBSCAN进行了一次聚类,这主要是区分出动态关键点分属于那些动态物体示例。

预测

聚类之后,我们基本可以得到每个动态物体的大体位置,但是由于是采样点,所以边缘位置存在一定的不稳定因素。作者又补充了一个深度信息的预测,具体来说也就是用大体位置指示出来的bounding box位置,通过深度信息进行聚类来修正掩码,以此得到边缘位置更加准确的掩码。

对于这个掩码预测机制,个人理解是除了第一帧,其余的每一帧实际上都是根据上一帧语义分割的结果进行的预测,而不是真正的语义分割结果,通过将分割线程后置,确实可以解决等待问题,但代价就是推理结果的时间不对等。实际上的运行过程应该是这样的,第一帧进入系统,先语义分割得到结果,然后进行跟踪以及关键帧初始化的内容,第二帧开始,用第一帧的语义分割结果产生预测掩码,这个掩码直接拿到跟踪线程使用,与此同时语义分割线程依然在进行推理,推理完可能赶不上第二帧的跟踪,但可以用于第三章预测掩码的生成。

四、双阶段跟踪

双阶段跟踪指的实际上是对动态物体和静态特征点采用两种策略的跟踪。其中动态物体跟踪和掩码预测的过程是一致的,但作者提到使用YOLO可能会导致图像出现旋转时分割失败,这种情况作者选择直接使用前一帧的预测掩码作为分割结果。而对于静态特征点,作者使用了光流法进行跟踪。

虽然跟踪过程使用的是光流法,但是框架依然保留了ORB关键帧的提取,当稳定跟踪的静态关键点数量不足时,就会用ORB特征点提取来补充。对于一般的ORBSLAM,基本流程是每一帧提取特征点然后计算描述子,稳定跟踪的情况下利用恒速模型计算出位姿,当出现关键帧的时候,就利用共视图找出共视关系最好的关键帧,对这些关键帧上没有匹配地图点的特征点进行描述子匹配并三角化。而在NGD-SLAM中,个人感觉基本流程保持一样,只不过跟踪过程的方法变了,不是投影找关键点,而是光流法跟踪,跟踪得到的点直接被认为是特征点。不理解的地方在于,光流法跟踪不提取特征点,这也就是说当前帧跟踪到的点并不是真正意义上用提取器提取出来的特征点,那么在提取特征点的部分这里会不会出现重复。

五、关键帧跟踪

NGD-SLAM保留了ORB相关的代码,这主要是用来维护共视关系等ORBSLAM3中用到的关键部件,当静态跟踪效果不好时也会使用这种方法进行跟踪。所以双阶段跟踪的部分计算出来的位姿在产生新的关键帧的时候叠加产生两个关键帧之间的位姿,用这个位姿进行ORBSLAM3中的新建地图点等内容。

总的来说文章掩码预测的部分是很有新意的,给推理速度过慢情况下的处理方法提供了一个很好的解决方法。网上说这是一个本科生的毕业论文,能做到这种程度已经贼厉害了,但是从实验和一些实现细节上来看,依然有改进的地方。

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

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

相关文章

【OSCP系列】OSCP靶机-Dawn1(原创)

OSCP系列靶机—Dawn1 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、主机发现 这个靶机需要放在virtualBox 上,那么有关virtualBox 与 VMware 的kali网络通讯方法请访问:【基础知识】…

嵌入式软件开发的面试题

一、硬件电路 1.为什么电路一般使用220uf和104电容并联滤波 220μF电容通常被称为大电容,它具有较高的电容值,能够提供较好的低频滤波效果。它可以有效地滤除较低频率的噪声和干扰信号。这种电容在稳定电源电压、降低纹波和噪声方面非常有用。 另一方面,104电容是指电容值…

[matlab]MATLAB实现MLP多层感知机minist手写识别预测

【测试环境】 matlab2023a 【源码文件截图】 【实现部分代码】 mlp_test.m %% MLP 2-layer to test XOR clear; clc;Mode MNIST %Mode XORif (strcmp(Mode,MNIST))% Load the digits into workspace (MNIST Test, from% http://yann.lecun.com/exdb/mnist/)num_train 100…

el-date-picker 设置值输出格式

el-date-picker 设置值输出格式 现象 在请求后端的时候因为日期格式不对导致后端请求报错 看到时间默认的格式为:2024-08-13T16:00:00.000Z 这个时间如果需要转换成时间格式还是比较费劲的 解决方案 方式1-对字符串进行处理 formatDate(date) {// 格式化为 YY…

Java:常用API:Math类,System类

文章目录 Math常用方法代码 System类常用方法代码 RunTime类常用方法代码 黑马学习笔记 alt回车抛出异常 Math 常用方法 这是static方法,直接Math打点调方法 代码 package com.zhang.math;/*** Author: ggdpzhk* CreateTime: 2024-08-25* Math工具类的基本用法…

build.grade.kts 如何定义插件及插件扩展

定义插件和应用插件 在build.gradle.kts文件内 这里要注意的是&#xff0c;最后一行的Project扩展函数名必须要和上面apply方法里面create的参数一致&#xff0c;然后project扩展函数定义之前必须先apply<>()也就是先使用apply让plugin apply方法运行起来&#xff0c;才…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面 程序员对函数调用栈是再熟悉不过了&#xff0c;无论是使用IDE…

printk的原理及使用

内核驱动调试的方法&#xff0c;先从我最常用的printk的使用方法开始讲起, printk在内核源码中用来记录日志信息的函数&#xff0c;方便我们调试追踪代码&#xff0c;只能在内核源码范围内使用。 本篇内核采用5.10版本。 很多内核开发者最喜欢的调试工具之一是printk(),printk(…

分享一个基于python新闻订阅与分享平台flask新闻发布系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【目标检测】AGMF-Net:遥感目标检测的无注意力全局多尺度融合网络

《Attention-Free Global Multiscale Fusion Network for Remote Sensing Object Detection》 遥感目标检测的无注意力全局多尺度融合网络 原文&#xff1a;https://ieeexplore.ieee.org/document/10371366 摘要 遥感目标检测&#xff08;RSOD&#xff09;在复杂背景和小目标…

设计模式篇(DesignPattern - 前置知识 七大原则)(持续更新调整)

目录 前置知识 一、什么是设计模式 二、设计模式的目的 七大原则 原则一&#xff1a;单一职责原则 一、案例一&#xff1a;交通工具问题 1. 问题分析 2. 解决思路 2.1 类级别单一职责 2.2 方法级别单一职责 3. 知识小结 二、案例二&#xff1a;待更新 原则二&…

本·阿弗莱克在与詹妮弗·洛佩兹离婚期间与孩子塞拉菲娜共度时光

在詹妮弗洛佩兹提出离婚申请期间&#xff0c;本阿弗莱克被发现与塞拉菲娜阿弗莱克一起在加州观看电影。 本阿弗莱克似乎将重心放在家庭时间上&#xff0c;最近有人拍到他带着孩子塞拉菲娜阿弗莱克在一起。此前&#xff0c;他的妻子詹妮弗洛佩兹 于 8 月 20 日星期二提出离婚。 …

小黄鸟九宫格切图丨教你如何将图片九宫格切图_照片分割成9张工具

图片九宫格怎么弄&#xff1f;怎么把1张图片切割称九宫图&#xff1f;如何将一张照片切成九宫格 微博九宫图怎么做&#xff1f;你还不知道电脑上如何做微博九宫格图片? 今天用小黄鸟九宫格切割工具&#xff0c;手把手教你,搞定九宫格切图 小黄九宫格切图丨小黄鸟教你如何九宫…

如何使用ssm实现基于web的药品管理系统+vue

TOC ssm175基于web的药品管理系统vue 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&…

五、Centos7-安装Jenkins--这篇废了

克隆了一个base的虚拟机&#xff0c;用来安装Jenkins 2023年11月&#xff0c;Jenkins不支持centos7了。我们只是学习用&#xff0c;先看看吧。 &#xff08; 另一个人用别的操作系统安装的jenkins&#xff0c;可以参考 版权声明&#xff1a;本文为博主原创文章&#xff0c;…

js第五天-对象

object let obj {uname: pink,age: 18,gender: w} 增 对象名.属性新值 这个和cpp不一样&#xff0c;可以在大括号外面新增属性 <script>let obj {uname: pink,age: 18,gender: w}obj.hobby footballconsole.log(obj);</script>删 delete delete obj.gender …

Spring Boot整合MyBatis-Plus的详细讲解

MyBatis Plus&#xff08;简称MP&#xff09;是一个在MyBatis基础上进行增强的工具&#xff0c;它保留了MyBatis的所有特性&#xff0c;并通过提供额外的功能和简化操作来提高开发效率。以下是对MyBatis Plus的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;MyBatis Plu…

【MATLAB学习笔记】绘图——设置次刻度线的数量、设置刻度线的宽度(粗细)和长度

目录 前言设置次刻度线数量函数示例基本绘图设置次刻度线数量函数的使用 设置刻度线的长度设置刻度线和轴线的宽度总代码总结 前言 在MATLAB中&#xff0c;将XMinorTicktrue或者YMinorTicktrue设置为true可以很方便地设置X轴或者Y轴次刻度线&#xff0c;但是次刻度线的数量是MA…

代码随想录DAY25 - 回溯算法 - 08/24

目录 非递减子序列 题干 思路和代码 递归法 递归优化 全排列 题干 思路和代码 递归法 全排列Ⅱ 题干 思路和代码 方法一&#xff1a;用集合 set 去重 方法二&#xff1a;先排序&#xff0c;再用数组去重 非递减子序列 题干 题目&#xff1a;给你一个整数数组 nu…

python动画:manim中的目标位置移动,线条末端和两条线相切的位置处理

一&#xff0c;Manim中目标的位置移动 在 Manim 中&#xff0c;shift 函数用于在三维空间或二维平面上对对象进行平移。通过 shift 方法&#xff0c;用户可以快速移动场景中的物体&#xff0c;指定移动的方向和距离。方向通常由预定义的常量&#xff08;如 UP, DOWN, LEFT, RI…