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

动态环境下的SLAM:DynaSLAM 论文学习笔记相关推荐

  1. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  2. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

  3. ERASOR:解决动态环境下的SLAM建图问题,有效过滤动态物体(ICRA2021)

    作者丨马赫WGH@知乎 来源丨https://zhuanlan.zhihu.com/p/409884870 编辑丨3D视觉工坊 一.算法解析 这篇论文致力于解决动态环境下的建图问题. 在以「城市开阔道 ...

  4. 动态环境下的slam问题如何解决?

    作者丨紫薯萝卜@知乎 来源丨htttps://www.zhihu.com/question/47817909/answer/110895292 编辑丨3D视觉工坊 躺了一年多的动态环境下激光定位的坑, ...

  5. 基于点云相关性的动态环境下RGB-D SLAM

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 标题:RGB-D SLAM in Dynamic Environments Using Point C ...

  6. 【python环境下Z3约束求解器学习笔记】And和Or的用法

    在Z3约束求解器中,我们可能需要寻找同时满足两个条件的模型,也可能需要寻找满足两个条件中一个条件的模型,这个时候,我们可以借助And方法和Or方法来实现 引入 我们先来举一个简单的例子 当我们想要查找 ...

  7. 【嵌入式环境下linux内核及驱动学习笔记-(11-设备树)】

    目录 1.设备树体系 1.1 DTS /DTSI / DTC / DTB 2.基础语法 2.1 节点语法 2.1.1 通用名称建议 2.2 属性语法 2.2.1 属性值 2.3 关于label 2.4 ...

  8. 【论文笔记】DP-SLAM:一种动态环境下基于移动概率的SALM系统A visual SLAM with moving probability towards dynamic environments

    Central Idea 本文提出了一种新的基于稀疏特征的视觉SLAM算法(DP-SLAM),该算法基于移动概率传播模型进行动态关键点检测.该概率表示一个关键点位于移动对象上的可能性.该方法结合几何约 ...

  9. 高动态环境下基于随机可及集的Path-Guided APF算法的Motion Planning

    文章目录 摘要 引言 相关工作 问题假设 动态障碍物 Relative robot-obstacle dynamics(运动学) SR Sets for Collision Avoidance 方法! ...

最新文章

  1. 【读书笔记】知易行难,多实践
  2. 把宝可梦搬到终端后,摸鱼也不会被老板发现了,收集对战玩法一应俱全|开源...
  3. easyui 下拉框用法
  4. GML-SVG-VML比较
  5. css属性 background
  6. idea下git log乱码问题
  7. 猜拳游戏php中Computer类,人机猜拳 (玩家、电脑、游戏、测试)四个类写法
  8. java ear和war_JAR、WAR、EAR的使用和区别
  9. 把博客园自己博客皮肤改了下
  10. centos7 安装btsync
  11. 11.4.2 内存映射的相关接口
  12. ubuntu安装词典goldendict
  13. 摄像头云台的设计,组装与使用方法
  14. 阿里褚霸专访-揭秘技术男开挂升级的职业路径(回帖有奖)
  15. 使用基于迭代的敏捷创建里程碑
  16. L9110H电机驱动模块 Arduino 小水泵小风扇
  17. 赠书 | 《网络威胁情报技术指南》
  18. SMTP 简单邮件传输协议
  19. 图片文件太大?缩小图片文件的2个小技巧
  20. DHCP以及DHCP中继

热门文章

  1. Python2 与 Python3 区别
  2. Git常见问题解决方案指北
  3. 分析两小段c++代码 关于unsigned运算的坑
  4. python版本控制神器Virtualenvwrapper的使用
  5. 运行一段时间后,RestTemplate请求报400错误
  6. TVM apps extension示例扩展库
  7. 【CV】OpenCV(基于Python)学习笔记
  8. 启动MySQL:net start mysql出现问题+本地Mysql忘记密码的修改方法
  9. Android 使用adb 命令截图 的方法
  10. Android 绘制同心圆 (2个圆叠加在一起)