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

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

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

这篇文章

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

论文摘要

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

系统流程

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

相关环节的实现方法

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

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

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数据集上的普遍使用的判断条件)
 使用这个方法完成的图像分割结果如下:
动态环境下的SLAM:DynaSLAM 论文学习笔记_第3张图片
 从图中可以看出,格子衫男孩和他触碰的物体都被很好的识别了。但后面的那位老哥逃过了这个算法。原因是这位老哥离相机太远,或他那里没有提取到特征点(大众脸)。这是这个方法所存在的不足。此外,从步骤中可以看出,该方法需要至少两帧来实现判断,而神经网络只需一帧。所以这个方法还要考虑帧的选取和相对位姿精度的问题。
 由于这两种方法存在着互补的关系,所以作者将它们联合在了一起。实际的效果图如下:
动态环境下的SLAM:DynaSLAM 论文学习笔记_第4张图片
 第三张图就是两种方法结合后的图像分割结果。联合后的方法能将图中所有的动态物体给分辨出来。为了方便,将这种联合的方法记为N+G

跟踪与建图(Tracking and Mapping)

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

图像背景修复(Background Inpainting)

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

其他

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

实验

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

结尾

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

你可能感兴趣的:(动态环境中的VSLAM,计算机视觉,多视图几何,计算机视觉,slam)