【文献分享】动态环境下竟然能实现实时语义RGB-D SLAM??

news2024/11/14 1:38:22

论文题目:Towards Real-time Semantic RGB-D SLAM in Dynamic Environments

中文题目:动态环境下实时语义RGB-D SLAM研究

作者:Tete Ji, Chen Wang, and Lihua Xie

作者机构:新加坡南洋理工大学电气与电子工程学院 卡内基梅隆大学机器人研究所

论文链接:https://arxiv.org/pdf/2104.01316.pdf

大多数现有的视觉SLAM方法严重依赖于静态世界假设,在动态环境中很容易失效。本文提出了一个动态环境下的实时语义RGB-D SLAM系统,该系统能够检测已知和未知的运动物体。为了减少计算成本,其只对关键帧进行语义分割以去除已知的动态对象,并保持静态映射以实现稳健的摄像机跟踪。此外,文章还提出了一个有效的几何模块,通过将深度图像聚类到几个区域,并通过它们的重投影误差来识别动态区域,从而检测未知的运动物体。

1 前言

尽管现有很多的vSLAM系统都有很好的性能,但这些方法中的大多数严重依赖于静态世界假设,这极大地限制了它们在现实世界场景中的部署。

由于移动的人、动物和车辆等动态物体对姿态估计和地图重建有负面影响。尽管稳健的估计技术(如RANSAC)可以用于过滤掉一些异常值,但改进仍然有限,因为它们只能处理轻微的动态场景,当移动的物体覆盖大部分相机视图时,仍然可能失败。

由于计算机视觉和深度学习的最新进展,环境的语义信息已被集成到SLAM系统中,比如通过语义分割提取语义信息,预测被检测对象的标签并生成掩码。通过识别和去除潜在的动态目标,vSLAM在动态场景中的性能可以得到很大的提高。

然而,这些方法仍然存在两个主要问题:

  1. 强大的语义分割神经网络算法计算成本很高,不适用于实时和小规模机器人应用。
  2. 而对于轻量级网络,分割精度可能会降低,跟踪精度也会受到影响。另一个问题是,它们只能处理在网络的训练集中被标记的已知物体,面对未知的运动物体时仍然可能失败。

为了识别具有语义线索的动态对象,大多数现有方法对每个新帧进行语义分割。这将导致相机跟踪的显著放缓,因为跟踪过程必须等到分割完成。

本文主要贡献如下:

  • 提出了一种基于关键帧的语义RGB-D SLAM系统,能够减少动态环境中运动物体的影响。
  • 提出了一个有效和高效的几何模块,处理未知的运动物体,并结合语义SLAM框架。
  • 通过与最先进的动态SLAM方法对比实验,证明所提出的方法的准确性,同时能够在嵌入式系统上实时运行。

2 算法框架

整个算法的框架如下图所示:

2.1 语义模块

语义分割是预测像素标签,并使用基于深度学习的方法为输入RGB图像中检测到的对象生成掩码,语义模块采用了轻量级的语义分割网络SegNet

然后将分割网络在PASCAL VOC数据集上进行预训练,该数据集包含20类对象。在这些对象中,只处理那些高度移动或潜在动态的对象,如人、汽车、自行车等。这些目标将从分割图像中移除,与它们相关的特征点将不会用于相机跟踪和地图构建。

与大多数现有的基于学习的动态SLAM方法不同,该模型只在创建新的关键帧时执行语义分割,而不是对每个新帧执行语义分割。这大大降低了语义模块的计算成本,帮助实现语义信息的实时跟踪。此外,该进程在单独的线程中执行,因此对总体跟踪时间没有太大影响。

2.2 几何模块

由于单独的语义信息只能检测到训练集中被标记的固定数量的对象类,因此在存在未知运动对象的情况下,跟踪和映射仍然会受到影响,因此需要一个不需要先验信息的几何模块

首先使用K-Means算法将每个新的深度图像分割成N个簇,在3D空间中彼此接近的点被分组在一起。假设每个聚类都是一个物体的表面,并且聚类中的点共享相同的运动约束。因为单个对象可以被分割成几个簇,所以对象不需要是刚性的,而大多数语义SLAM方法都有这种刚性假设。

对于每个聚类 c j c_j cj,计算聚类内所有特征点 u i u_i ui相对于它们在三维空间中的匹配对应Pi的平均重投影误差 r j r_j rj,如(1)所定义,其中m为 c j c_j cj中匹配的特征数, T w c T_wc Twc为相机姿态,π表示相机投影模型,ρ为罚函数。
r j = 1 m ∑ ρ ( ∣ ∣ u i ′ − π ( T w c P i ) ∣ ∣ ) 2 r_j = \frac{1}{m}\sum \rho (||u'_i-\pi (T_{wc}P_i) ||)^2 rj=m1ρ(∣∣uiπ(TwcPi)∣∣)2

当一个集群的误差相对大于其他集群时,就将其标记为动态集群。动态聚类中的所有特征点将被移除,不再参与相机姿态估计。与识别单个特征点的动态状态相比,该聚类方法更加有效和高效。此外,它还可以防止由单点测量噪声引起的误检。它还允许我们通过几何聚类近似运动物体的大致形状。改方法的一些结果可以在下图的第三行中看到,其中动态集群用红色突出显示。该模块可以独立工作,不需要语义信息,因此可以检测未知的运动物体。

第一行显示了提议的语义模块(蓝色矩形点)和几何模块(红色点)检测到的动态特征。第二行是相应的语义分割结果。第三行显示深度图像的几何聚类结果,动态聚类以红色突出显示。(a)和(b)显示两个模块都检测到动态目标。©-(h)表示语义分割失败,而几何模块分割成功(几何模块可以在语义模块失效的情况下继续工作)。

作者在实验过程中发现了一个有趣的现象,一些半动态的物体也可以被识别出来。如上图(h)所示,其中左椅子被确定为动态的。原因是椅子目前是静态的,但当重新访问它时,它的位置发生了变化。这对于长期一致的地图构建是有帮助的。

2.3 关键帧和本地地图更新

只从关键帧中提取语义信息。因为新帧是用关键帧和局部地图跟踪的,我们只需要确保分割的关键帧和局部地图只包含场景的静态部分。关键帧选择策略继承自原ORB-SLAM2系统。当在跟踪过程中选择新的关键帧时,在单独的线程中执行语义分割并删除动态特征点。本地地图也通过删除相应的动态地图点来更新。

通过这种方式,维护了一个关键帧数据库和一个只包含静态特征和地图点的地图。

2.4 跟踪

继承于ORB-SLAM2对于每一个新帧都执行一个两阶段的跟踪。首先使用与当前帧重叠最大的最近关键帧进行初始跟踪,以获得初始姿态估计。由于关键帧已经经过了改进,删除了潜在的动态对象,因此这个初始估计将更加可靠。

然后在几何模块中使用初始姿态估计进行动态物体检测。几何模块去除当前帧中的动态点后,利用当前帧中观察到的所有局部地图点进行跟踪,利用局部束调整获得更精确的姿态估计。由于语义模块还在局部地图中删除了潜在的动态地图点,进一步降低了动态目标的影响,从而使姿态估计更加鲁棒和准确。

3 实验与结果

本文方法在广泛用于RGB-D SLAM评价的TUM RGB-D数据集上进行了测试。

评估指标:用于评估的误差指标是m的绝对轨迹误差(ATE)的常用均方根误差(RMSE),以及包含m=s的平移漂移和◦=s的旋转漂移的相对姿态误差(RPE)的RMSE。ATE测量轨迹的全局一致性,RPE测量每秒的里程漂移

3.1 不同模块的作用

ATE与基线ORB-SLAM2的RMSE比较如下表所示。

实验结果:

  1. 对于稍微动态的序列,提出的方法的结果与ORB-SLAM2相似,因为ORB-SLAM2可以通过RANSAC算法成功处理这些情况,因此改进幅度有限。

  2. 对于高度动态的序列,文中的语义模块和几何模块都取得了显著的精度提高,并且提出的组合系统取得了更好的结果。

下图为根据地面真值,ORBSLAM2和所提方法估算的轨迹对比

3.2 与最先进方法的比较

作者将所提出的方法与最先进的基于几何的动态SLAM方法MR-DVO、SPW、StaticFusion、DSLAM以及基于学习的方法MID-Fusion、EM-Fusion、DS-SLAM和DynaSLAM进行了比较。

ATE和RPE的比较分别总结于表2和表3。

可以看出,文中的方法在所有动态序列中都提供了具有非常好的的结果,并且优于所有其他动态SLAM方法,除了在语义框架中结合多视图几何的DynaSLAM。但是,DynaSLAM提供离线静态地图创建,由于其耗时的Mask-RCNN网络和区域增长算法,它无法实时运行。但是本文的方法在实现了实时操作的同时,提供了与之非常接近的结果。

3.3 真实环境下的鲁棒性检验

在真实的实验中,一个拿着书的人在相机前坐着走着,而相机几乎是静止的。下图是实时测试过程中动态点检测结果的几张截图,其中第二行和第三行分别是语义模块和提出的几何模块的分割结果。

书在网络模型中不是一个被标记的对象,因此它不能被识别,或者有时被语义模块错误地识别,如第二行所示。作为一个补偿过程,几何模块能够在测试中正确地将书作为移动对象提取出来,如第三行所示。这表明语义模块和几何模块都是动态环境下健壮的语义RGBD SLAM系统所必需的。该方法的平均弹道估计误差约为0:012m,而ORB-SLAM2由于运动物体引起的较大波动,误差约为0:147m。

4 总结

本文提出了一个实时语义RGB-D SLAM框架,该框架能够处理已知和未知的运动物体。

为了减少计算量,提出了一种基于关键帧的语义模块,并引入了一种基于几何聚类的有效几何模块来处理未知运动目标。广泛的评估表明,文中的系统提供了最先进的定位精度,同时仍然能够在嵌入式平台上实时运行。

未来改进:可以构建一个只包含静态部分的环境的长期语义地图,这对高级机器人任务很有用。

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

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

相关文章

用于WINDOWS的HACKRF ONE扫频分析仪

https://github.com/pavsa/hackrf-spectrum-analyzer GitHub - mutability/rtl-sdr: RTL-SDR *very* experimental branch - its probably broken! https://github.com/greatscottgadgets/hackrf hackrf_sweep 用于WINDOWS的HACKRF ONE扫频分析仪 几个星期前,Ha…

Java动态代理(全网最详细,没有之一)

首先你要明白为什么要创建代理??? 例如:我们看下面这张图我们发现,有很多重复的代码,我们就可以创建代理,让代理帮我们干这些事情。 1.想要创建代理,我们就要为这个类写一个接口 pu…

无涯教程-jQuery - Menu组件函数

小部件菜单功能可与JqueryUI中的小部件一起使用。一个简单的菜单显示项目列表。 Menu - 语法 $( "#menu" ).menu(); Menu - 示例 以下是显示菜单用法的简单示例- <!doctype html> <html lang"en"><head><meta charset"utf-…

基于Linux操作系统中的MySQL数据库备份(三十三)

目录 一、概述 二、数据备份的重要性 三、造成数据丢失的原因 1、程序错误 2、人为错误 3、运算失败 4、磁盘故障 5、灾难&#xff08;如火灾、地震&#xff09;和盗窃 四、备份类型 &#xff08;一&#xff09;物理与逻辑角度 1、物理备份 1.1、冷备份 1.2、热备…

人工智能-Dlib+Python实现人脸识别(人脸识别篇)

人脸识别流程 人脸检测,人脸数据提取:首先是检测到人脸保存人脸数据:可以保存到mysql数据库中mysql数据库连接mysql数据库安装mysql数据库操作设置人脸数据标签:(人脸名字),保存到数据库打开摄像头,检测到人脸,提取人脸数据:人脸数据与数据库中的数据对比,1、人脸检…

子组件未抛出事件 父组件如何通过$refs监听子组件中数据的变化

我们平时开发项目会使用一些比较成熟的组件库, 但是在极小的情况下,可能会出现我们需要监听某个属性的变化,使我们的页面根据这个属性发生一些改变,但是偏偏组件库没有把这个属性抛出来,当我们使用watch通过refs监听时,由于生命周期的原因还不能拿到,这时候我们可以这样做,以下…

03-高阶导数_导数判断单调性_导数与极值

高阶导数 前面学的是一阶导数&#xff0c;对导数再次求导就是高阶导数&#xff0c;二阶和二阶以上的导数统称为高阶导数。 导数与函数单调性的关系 极值定理 导数为我们寻找极值提供依据&#xff0c;对于可导函数而言&#xff0c;因为在极值位置必然有函数的导数等于 0。 …

深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)模拟实现正反向迭代器【容器适配器模式】

深入篇【C】手搓模拟实现list类(详细剖析底层实现原理&#xff09;&& 模拟实现正反向迭代器【容器适配器模式】 Ⅰ.迭代器实现1.一个模板参数2.两个模板参数3.三个模板参数 Ⅱ.反向迭代器实现1.容器适配器模式 Ⅲ.list模拟实现1.定义结点2.封装结点3.构造/拷贝4.迭代器…

【Python】Web学习笔记_flask(1)——模拟登录

安装flask pip3 install flask 第一部分内容&#xff1a; 1、主页面输出hello world 2、根据不同用户名参数输出用户信息 3、模拟登录 from flask import Flask,url_for,redirectappFlask(__name__)app.route(/) def index():return hello worldapp.route(/user/<uname…

linux_进程状态

目录 一. 概念铺设 状态是什么&#xff1f; 传统操作系统的状态转换图 二. 传统操作系统状态 1. 运行 2. 阻塞 3. 挂起 三. linux 中的进程状态 1. 总体介绍 2. R 3. S 4. D kill -9 D vs S 5. T kill T vs S 6. Z 什么是僵尸状态&#xff1f; 僵尸进程的危害 …

hadoop部署配置

端口名称 Hadoop2.x Hadoop3.x NameNode内部通信端口 8020 / 9000 8020 / 9000/9820 NameNode HTTP UI 50070 9870 MapReduce查看执行任务端口 8088 8088 历史服务器通信端口 19888 19888 端口名称Hadoop2.xHadoop3.xNameNode内部通信端口8020 / 90008020 / 9000/9820NameNode…

延长周末,获得高质量休息:工作与学习党的生活策略

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Linux】多线程的补充

1 线程安全的单例模式 1.1 什么是单例模式 单例模式是一种 "经典的, 常用的, 常考的" 设计模式. 1.2 什么是设计模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些…

从源码角度配合网络编程函数API 分析下 三握手四挥手都做了什么

首先我们先说下网络编程API&#xff1a; 数据在网络上通信&#xff0c;通信的双方一个是 客户端&#xff0c; 一个是 服务器 更具体来说&#xff0c;不是 客户端和服务器这两个机器在 经由互联网 进行通信&#xff0c; 而是 客户端上的某一进程 与 服务器端的某一进程 进…

Vue2 第七节 Vue监测数据更新原理

&#xff08;1&#xff09;Vue会监视data中所有层次的数据 &#xff08;2&#xff09;如何监测对象中的数据 通过setter实现监视&#xff0c;且要在new Vue时传入要监测的数据对象中后追加的属性&#xff0c;Vue默认不做响应式处理如果要给后添加的属性做响应式&#xff0c;使…

【笔记】PyTorch DDP 与 Ring-AllReduce

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 文内若有错误&#xff0c;欢迎指出&#xff01; 今天我想跟大家分享的是一篇虽然有点老&#xff0c;但是很经典的文章&#xff0c;这是一个在分布式训练中会用到的一项技术&#xff0c; 实际上叫ringallreduce。 …

Hyper-v 设置静态IP 搭建集群

背景 最近想在本机WIN11上创建几个Centos用于做几个试验&#xff0c;之前一直用VMWare&#xff0c;需要安装额外的软件&#xff0c;正好win自带虚拟机功能&#xff0c;只需要在功能中安装Hyper-v就可以使用。 新建虚拟机 虚拟机交换器 Hyper-V 虚拟交换机是基于软件的第 2 层…

P5691 [NOI2001] 方程的解数

题目 思路 暴搜显然会TLE&#xff0c;所以这时候就应该请出DFS的伙伴——折半搜索&#xff08;meet in the middle&#xff09;了 折半搜索的思路就是先搜完后一半后&#xff0c;借助这一半的数据来搜索前一半&#xff0c;效率是原来的2倍 这个题怎么才能折半搜索呢&#xff1…

链表OJ题目1 (移除链表元素)

力扣&#xff08;链接放这里喽&#xff09; 先贴代码再做讲解&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur head;struct ListNode* tail NULL;while(cur){if(cur->val val){if(cur head){head head->next…

【点云处理教程】01如何创建和可视化点云

一、说明 本文是系列教程&#xff0c;专门介绍点云处理的全流程&#xff0c;是一个入门工具。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 第1条&#xff1a;点云处理简介文章2&#xff1a;在Python中从深度图…