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

这篇文章

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

### 实现或复现DynaSLAM算法的方法 要成功复现DynaSLAM算法,需遵循特定的安装流程以及深入理解其核心原理。以下是详细的说明: #### 1. 环境配置 为了运行DynaSLAM源码,首先需要搭建合适的开发环境。推荐使用Linux操作系统(如Ubuntu),并确保已安装必要的依赖库,例如OpenCV3.x版本[^2]。 - **安装依赖项** 需要安装CMake、Eigen、Pangolin等工具包来支持编译过程。具体命令如下: ```bash sudo apt-get install cmake libeigen3-dev libpangolin-dev ``` - **下载与构建ORB-SLAM2框架** DynaSLAM基于ORB-SLAM2扩展而来,因此必须先完成ORB-SLAM2的基础设置。可以从官方仓库克隆代码,并按文档指示进行编译[^3]。 #### 2. 获取DynaSLAM源码 访问GitHub上的DynaSLAM项目页面,获取最新版本的源码文件。通过Git命令拉取存储库至本地目录: ```bash git clone https://github.com/BertaBescos/DynaSLAM.git cd DynaSLAM ``` #### 3. 数据集准备 实验验证通常采用公开数据集,比如TUM RGB-D Benchmark中的序列图像作为输入素材。这些资源包含了时间戳同步后的彩色图片和对应的深度图信息。 #### 4. 修改参数配置 针对不同场景调整系统内部参数至关重要。主要涉及以下几个方面: - 调整相机内参矩阵以匹配目标设备特性; - 设置动态对象检测阈值以便更精准地区分静态背景与移动前景[^1]; #### 5. 编译执行程序 利用CMake生成Makefile之后即可启动实际测试环节。典型的工作流包括加载视频帧、估计位姿轨迹、更新地图结构等功能模块。 ```bash mkdir build && cd build cmake .. make -j$(nproc) ./Examples/RGB-D/rgbd_tum ../Vocabulary/ORBvoc.txt ../Examples/RGB-D/TUM1.yaml ``` 以上步骤概述了从零开始重现整个系统的全过程。值得注意的是,在实践过程中可能遇到各种技术难题,建议查阅相关资料或者参与社区讨论解决疑惑之处。 ### 提供一段伪代码表示基本逻辑流程 ```python def main(): initialize_system() # 初始化摄像头校准参数及其他全局变量 while not is_done(): frame = capture_next_frame() if detect_dynamic_objects(frame): remove_moving_parts(frame) track_camera_pose(frame) update_map_representation() if __name__ == "__main__": main() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值