当前位置: 首页 > 编程日记 > 正文

动态环境下的SLAM:DynaSLAM 论文学习笔记

动态环境下的SLAM:DynaSLAM 论文学习笔记

  • 这篇文章
  • 论文摘要
  • 系统流程
  • 相关环节的实现方法
    • 神经网络检测图中动态物体(Mask R-CNN)
    • Low-Cost Tracking
    • 使用多视图几何的方法检测图中动态物体(Multi-view Geometry)
    • 跟踪与建图(Tracking and Mapping)
    • 图像背景修复(Background Inpainting)
    • 其他
  • 实验
  • 结尾

这篇文章

最近看了篇关于在动态环境下工作的视觉SLAM论文–DynaSLAM,感觉论文中使用的方法还有点意思,所以就写篇博客来记录一下。论文可以在百度学术中搜到,也能在这里下载。
【转载声明】本篇文字均为原创,如转载请注明出处

论文摘要

这篇论文提出了DynaSLAMDynaSLAM是基于ORB-SLAM2建立的,它使用深度学习和多视图几何的方法检测画面中存在的动态物体,并将他们从图像中剔除,以降低动态物体对相关算法的影响。之后使用图像中剩余的静态部分完成跟踪定位和局部建图。此外,作者还提出了一个背景修复的方法。该方法能修复图中之前被动态物体挡住的静态背景,合成出只包含静态物体的图像。下面介绍系统中各方法的实现。

系统流程

首先看 DynaSLAM 系统的流程图:
在这里插入图片描述
 图中黑色实线是使用单目或双目相机时系统的工作流程,黑色虚线则是使用RGB-D相机时的处理流程。而红色虚线表示“跟踪和建图”环节在工作时与稀疏地图之间的数据交换(利用稀疏地图进行跟踪,同时不断更新地图)。
 因为DynaSLAM系统的优化之处在于添加了动态物体检测和图像背景修复,所以在整个流程图重点体现了这两个部分。系统其余部分与ORB-SLAM2相似,在流程图中用简单的(Tracking and Mapping)表示。
 从图中可以看出,系统会根据相机类型使用不同工作方式,动态对象检测的方法也不同。系统用于动态物体检测的方法有两种:1、卷积神经网络,2、多视图几何。在使用单目或双目相机时,只有神经网络在工作;在使用RBG-D相机时两种方法会同时工作。(个人认为这样做的原因在于多视图几何的方法需要知道像素点的深度信息,而三种相机中只有RGB-D能够较精确地做到这一点)
 上述就是整个系统的大致流程,下面介绍相关环节的实现。

相关环节的实现方法

神经网络检测图中动态物体(Mask R-CNN)

DynaSLAM使用Mask R-CNN来进行图像的语义分割(虽然Mask R-CNN还能完成实例分割,但是在这里不采用)。通过神经网络分割出图片中的动态物体,如:人、车、猫狗等。可以根据不同情况的需求,来训练网络,使其能判断出自己认为的实际环境中大概率会出现的动态物体。
 采用这个方法所分割后的图片是这个样子的:
在这里插入图片描述
 从图中可以看出,使用神经网络能够将图片中的“人”给分割出来。但图中被人触碰到的书本和椅子并没有被准确地分辨出。这是因为这些物体并不在神经网络的分辨范围内(在训练网络时这些物体被认定为静态的)。这个不足使得图的动态物体没有完全去除,会影响到之后工作的精度。所以作者又提出了多视图几何的判别方法。

Low-Cost Tracking

这部分是一个耗时短,计算量少的跟踪计算任务,主要是为了获得在多视图几何判断时所需要的相机位姿估计值。这部分跟踪使用是经过之前神经网络处理,去除掉了动态物体的图像。此时图像中的信息变少,所以在跟踪定位时能使用的特征也变少,相应的计算量也减少了。

使用多视图几何的方法检测图中动态物体(Multi-view Geometry)

这个方法为了分辨出之前神经网络方法漏掉的动态物体。方法的步骤如下:
 1、选择五个(这是作者在精度和计算量上做的权衡)与当前帧共视程度最高的关键帧。
 2、将关键帧中的关键点 Xkf 根据计算的相对位姿投影到当前帧中,获得匹配的关键点 Xcur ,以及 Xcur 在当前帧的深度 Zproj
 3、根据当前帧对应的深度图获得 Xcur 实际测得的深度值 Zcur。计算 ΔZ=Zproj-Zcur 。如果 ΔZ 大于某个阈值 threshold ,则认为关键点 Xcur 是在动态物体上,需要将其剔除。(作者权衡了判断的准确率和召回率,将阈值 threshold 设为0.7)
 4、此外还有个判断方法:如果关键点 XkfXcur 之间的视差角大于30°,则也会将 Xcur 从图像中剔除。(这也是在TUM数据集上的普遍使用的判断条件)
 使用这个方法完成的图像分割结果如下:
在这里插入图片描述
 从图中可以看出,格子衫男孩和他触碰的物体都被很好的识别了。但后面的那位老哥逃过了这个算法。原因是这位老哥离相机太远,或他那里没有提取到特征点(大众脸)。这是这个方法所存在的不足。此外,从步骤中可以看出,该方法需要至少两帧来实现判断,而神经网络只需一帧。所以这个方法还要考虑帧的选取和相对位姿精度的问题。
 由于这两种方法存在着互补的关系,所以作者将它们联合在了一起。实际的效果图如下:
在这里插入图片描述
 第三张图就是两种方法结合后的图像分割结果。联合后的方法能将图中所有的动态物体给分辨出来。为了方便,将这种联合的方法记为N+G

跟踪与建图(Tracking and Mapping)

这部分使用经过N+G方法处理后的图像完成跟踪定位和建图任务。实现方法和ORB-SLAM2是相似的(因为处理后的图像只剩下了静态部分)。

图像背景修复(Background Inpainting)

这个方法是基于几何变换实现的。在完成动态物体剔除后,整个图片会出现一些窟窿。这样的图片既不美观也不利于跟踪定位等操作(因为可能导致匹配特征点过少)。所以通过背景修复的方法,将这些窟窿填补好,修复出之前被动态物体所挡住的背景图像。这个方法的大致步骤如下:
 1、在获得当前帧位姿后,选取出部分(论文中使用最新的20个关键帧来做修复的参考)与当前帧距离最近的关键帧。
 2、然后计算各关键帧与当前帧的相对位姿,并在关键帧中寻找当前帧里需要修复的背景图像信息。
 3、最后使用关键帧观测到的信息来修复当前帧。如果使用RGB-D相机,那么会在恢复当前帧的深度图之后,再修复彩色图(因为要使修复的彩图部分有对应的深度信息)。
 但在修复之后还是会有一些缺口。原因在于两点:1、可能所有关键帧都未观测到这些位置对应的静态背景;2、在修复时无法获得此部分对应的有效深度信息。
 下面是该方法的效果图:
在这里插入图片描述
 可以看到图中确实还留有一些空白。此外,在第三列效果图中,那张被格子衫小伙挡住的墙纸在修复之后,它的边界处发生了断痕。这是因为修复十分依赖估计的位姿,如果估计的位姿不准确,修复的结果和实际情况差距会很大。这点在后续的实验中也有体现。
 不过论文中没提到这个问题:在当前帧中的一个待重建区域被多个关键帧观察到时,这个位置的像素值和深度值该如何选取(感觉可以通过取平均值的方法来选取)。

其他

剩余的一些工作部分比如闭环检测之类的,都和ORB-SLAM2相似,所以论文中也就没做详细地讲解。想了解这部分内容,博友可以去参考ORB-SLAM2的原论文以及源代码。(在这里安利一波自己写的ORB-SLAM2源码注释)

实验

作者做了两类实验:1、对比使用不同方法的DyanSLAM;2、对比DynaSLAMORB-SLAM2的跟踪精度。
 第一个实验的结果如下:
在这里插入图片描述 图中N代表神经网络,G代表多视图几何,BI代表背景修复。前三个方法不用介绍,最后一个是作者做的尝试:使用修复后的图进行跟踪和建图(因为修复后的图像中只包含了静态背景,所以之后的定位、建图工作会轻松很多)。这个方法的流程如下:
在这里插入图片描述
 从结果来看这个方法并不好。原因就是之前所说的,修复的效果依赖于帧的估计位姿,可是只使用 Low-Cost Tracking 很难获得精度较高的位姿。所以修复的图与实际不符,导致最后定位效果不太理想。但是如果把 BI 放在最后,可以提高稠密点云地图或八叉树地图的构建效果。
 最后就是使用N+GDynaSLAMORB-SLAM2的对比实验。结果当然是装备更加优良的DynaSLAM获胜:
在这里插入图片描述

结尾

这篇博客介绍了针对动态环境设计的DynaSLAM系统。其中多视图几何和图像修复的方法是我觉得比较有意思的地方,所以想着写篇博客记录下来。之后也会再写一些关于文献理解的博客,以加深自己对文章的理解,同时和大家分享自己觉得有意思的论文。如果博客中有不足的地方,劳烦各位博友指出,十分感谢!

相关文章:

用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?

自己写的&#xff0c;感觉挺有成就感的&#xff0c;就展示出来吧&#xff01; 判断一个≥2的整型数是否存在于斐波那契数列中&#xff1f; 若存在&#xff0c;则返回第几项&#xff1b;若不在&#xff0c;则返回-1 #include <stdio.h> long generate(long n);//函数声…

团队作业8——第二次项目冲刺(Beta阶段)--第六天

会议照片&#xff1a; 燃尽图&#xff1a; 项目进展&#xff1a; 练习模式能够给出正确的答案&#xff0c;部分模块正在正在测试。 团队贡献比&#xff1a; 队员 角色 团队贡献比 陈麟凤 PM 17% 张志杰 DEV 18% 黄海鸿 TEST 16% 康建灿 TEST 16% 许明涛 DEV…

2021年中国工业互联网安全大赛核能行业赛道writeup之隐写

附件题&#xff1a;隐写 题目描述&#xff1a;隐写 附件下载&#xff1a; 2021-10-12T15_44_19.17491400_00scene.jpg.zip-网络攻防文档类资源-CSDN下载 ​ 先用 010Editor 查看这个图片&#xff0c;能直接看到图片的头部是否完整正常&#xff0c;能直接看到是否隐藏了fla…

SVO 学习笔记(深度滤波)

SVO 学习笔记&#xff08;深度滤波&#xff09;这篇博客论文中的深度滤波深度滤波的代码流程更新Seed对象初始化Seed对象结尾这篇博客 这篇博客将介绍SVO论文中的Mapping部分&#xff0c;主要介绍深度滤波器在获取新的图像帧后&#xff0c;更新相应地图点深度的过程。&#xff…

寻找孪生素数(当p为素数时,p+2也为素数)

数学家希尔伯特在1900年国际数学家大会的报告上提出一个“孪生素数猜想”&#xff0c;即&#xff1a; 存在无穷多个素数p&#xff0c;使得p 2是素数。p和p2这一对差为2的素数&#xff0c;被称为“孪生素数”。 看起来&#xff0c;这个猜想是成立的&#xff0c;我们总能找到很多…

C++利用cin输入时检测回车的方法

今天做TJU的OJ &#xff0c;其中一道题是先读入一个字符串&#xff0c;再读入一个整数&#xff0c;循环往复&#xff0c;直到字符串是空&#xff0c;也就是说回车键结束循环。 但是cin对空格和回车都不敏感&#xff0c;都不影响继续读入数据&#xff0c;所以需要一种新的方式检…

使用grep过滤make的输出内容

make的输出内容其实分为两种&#xff0c;有些是到标准输出&#xff0c;有些是到标准错误&#xff0c;由于标准输出和标准错误默认都是屏幕&#xff0c;所以平时区分不出来&#xff0c; 实际上一般是error和warning信息到标准错误&#xff0c;其余的到标准输出。 如果要过滤erro…

2021年中国工业互联网安全大赛核能行业赛道writeup之机房密码

附件题&#xff1a;机房密码 题目描述&#xff1a; &#xff08;具体描述忘记了&#xff09; 经过黑客人员的不屑努力&#xff0c;在上位机上发现了登录密码的一半信息&#xff0c;剩下的一半要靠你们继续努力辣&#xff01;&#xff01;&#xff01; ZmxhZyU3Qmgwd19hX0M 附件…

ORB-SLAM2系统的实时点云地图构建

ORB-SLAM2系统的实时点云地图构建这篇博客点云地图构建的流程代码介绍点云地图构建类对象小调整获取关键帧点云地图构建与叠加在地图中设置当前相机位置点云地图到Octomap的转换地图效果结尾这篇博客 &#xff08;PS:修改于2020-9-21&#xff0c;添加了关于System和Tracking类…

使用maven导入jar包

我们都经历过自己写代码时有时就要引用一些第三方的jar包&#xff0c;这个我们都会&#xff0c;但在公司里进行团队开发时&#xff0c;是不允许我们自己导入jar包的&#xff0c;是由项目组长之类的统一导入jar包&#xff0c;我们在这里来了解一下这个过程&#xff1a; a、先创建…

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于&#xff1a;2012-09-15 19:09:28 浏览&#xff1a;164次0Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活…

关于CSS的长度单位及颜色表示

长度单位 1.q 1/4mm. 2.px 计算机语言中的像素。大多数网页制作常用图片分辨率为72&#xff0c;即每英寸像素为72,1英寸等于2.54cm。那么通过换算可以得出每厘米等于28像素。 3.em 它是描述相对于应用在当前元素的字体尺寸&#xff0c;所以它也是相对长度单位。一班浏览器字体大…

2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏

目录 一、尝试 二、Writeup 附加题 鱿鱼游戏&#xff08;来自最近一部很火的韩剧&#xff09; 题目描述&#xff1a; 小王由于操作不规范&#xff0c;误将不明U盘插入到上位机中&#xff0c;导致上位机中的某些关键文件被加密&#xff0c;但攻击者在U盘中还留下了一个可执行…

视觉惯性SLAM: VI ORB-SLAM

视觉惯性SLAM: VI ORB-SLAM这篇博客视觉惯性SLAM预备知识符号说明&#xff1a;相机投影变换矩阵IMU数据更新方程IMU数据的预积分VI ORB-SLAM各环节工作方式InitializationTrackingLocalMappingLoop ClosingFull BAIMU初始化估计bgb_{g}bg​估计尺度sss和重力向量gWg_{W}gW​&am…

AEC、AGC、ANS在视音频会议中的作用?

AGC是自动增益补偿功能&#xff08;Automatic Gain Control&#xff09;&#xff0c;AGC可以自动调麦克风的收音量&#xff0c;使与会者收到一定的音量水平&#xff0c;不会因发言者与麦克风的距离改变时&#xff0c;声音有忽大忽小声的缺点。ANS是背景噪音抑制功能&#xff08…

Java中的拆箱与装箱

我们先来了解一下拆箱与装箱的概念&#xff1a; 装箱&#xff1a;将基本数据类型转换为包装类&#xff1b; 拆箱&#xff1a;将包装类转换为基本数据类型 我们来看两串代码&#xff1a; Integer b1 127;Integer b2 127;System.out.println(b1b2);//trueInteger b3 128;Inte…

WannaCry的UWP版,哈哈哈

转载于:https://www.cnblogs.com/R00R/p/6916731.html

2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录

附件题&#xff1a;数据库登录&#xff08;一道MISC、流量分析类型题目&#xff09; 题目描述&#xff1a; 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包&#xff0c;找到flag。流量涉及到 MySQL 数据库了。 附件下载&#xff1a; https://download.csdn.n…

学生管理系统(用maven来导入jar包)

不废话&#xff0c;直接上 先看一下项目列表&#xff1a; 首先创建一个maven工程&#xff0c;然后导入相应的jar包&#xff0c;请参考&#xff1a;使用maven导入jar包 接着在Source Folder创建具体的项目&#xff1a; Main类&#xff08;客户端&#xff09; package com.z…

视觉惯性SLAM:VINS-Mono

视觉惯性SLAM&#xff1a;VINS-Mono这篇博客一些符号说明IV 测量数据的预处理A.视觉处理前端B.IMU预积分V. 初始化A.Vision-Only SfM in Sliding WindowB.Visual-Inertial AlignmentVI.TIGHTLY COUPLED MONOCULAR VIOA.公式介绍B.IMU误差C.视觉误差D.边缘化E.位姿优化F.以IMU采…

mysql 0x80004005 unable to connect to any of the specified mysql hosts

语言&#xff1a;c# 问题&#xff1a;偶尔会出现连不上mysql 报标题的这个错误。 解决方法&#xff1a;把server localhost 改为 127.0.0.1 或者静态IP &#xff0c;按着改暂时没出现了&#xff0c;继续观望&#xff01; 转载于:https://www.cnblogs.com/wdw31210/p/9857514…

iOS开发-自己定义重用机制给ScrollerView加入子视图

iOS开发-自己定义重用机制给ScrollerView加入子视图 事实上这个问题我非常早就想过&#xff0c;仅仅是没有通过去写程序实现&#xff0c;昨天有人提起&#xff0c;我就巧了一下 不知道大家打印郭tableview&#xff1a;cellforrow中cell初始的次数&#xff0c;也就是重用池中的c…

2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

附件题&#xff1a;Webshell密码 题目描述&#xff1a; 某次攻防演练中&#xff0c;抓到了一个webshell的流量&#xff0c;请分析出密码&#xff0c;flag形式&#xff1a;flag{密码} 附件下载&#xff1a; https://download.csdn.net/download/qpeity/33675356https://downlo…

关于python3与python2同时存在情况下导入pyqt失败解决记录

最近感觉tkinter功能还是比较不适合新手做出高大上的界面&#xff0c;故开始使用pyqt&#xff0c;通过pip安装好了之后&#xff0c;利用qt设计师设计好界面之后&#xff0c;cmd运行之&#xff0c;报错提示没有找到pyqt5模块&#xff0c;IDE运行能正常加载 查找资料后发现&#…

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas&#xff1a;多地图SLAM这篇博客ORBSLAM-Altas这个系统系统方法两类子地图新地图的构建相机位姿的可观测性子地图融合系统线程结尾这篇博客 最近ORB-SLAM3横空出世&#xff0c;马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这…

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService&#xff1a;会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员…

数据库--事务

我们知道数据库中的SQL语句分为DDL(数据定义语言)、DQL(数据查询语言)、DML(数据操纵语言)、DCL(数据控制语言)&#xff0c;详情请看SQL语句 当数据库的表中数据执行完添加、删除、和修改等数据操纵语言&#xff08;DML&#xff09;后&#xff0c;需要执行commit(提交)数据控制…

2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

附件题&#xff1a;传统流量取证 题目描述&#xff1a; 在某次攻防演练中&#xff0c;小王发现流量探针平台突然告警&#xff0c;小王第一时间下载了告警流量包&#xff0c;并进行分析&#xff1a;发现攻击队攻击在攻入内网后&#xff0c;利用了一个内网OA的一个漏洞&#xff…

ORB-SLAM3 论文笔记

ORB-SLAM3 论文笔记这篇博客ORB-SLAM3系统相机模型的抽象(Camera Model)重定位的问题图片矫正的问题视觉惯性SLAM的工作原理相关公式IMU初始化跟踪和建图系统对跟踪丢失的应对多地图的闭环检测和地图融合位置识别视觉地图融合方法视觉惯性地图的融合方法单个地图中的闭环融合结…

为什么需要 外键 呢?

生活现象&#xff1a; 不知你们是否遇到过这样的现象&#xff0c;就是你辛辛苦苦花了几十块钱注册一个会员&#xff0c;结果家里的七大姑&#xff0c;八大姨都要拿去用&#xff0c;而且完全可以用。还有就是一个淘宝账号里却可以添加好多个收获地址(里面包括收货人的姓名&#…