Liu, Yubao, and Jun Miura. “RDMO-SLAM: Real-Time Visual SLAM for Dynamic Environments Using Semantic Label Prediction With Optical Flow.” IEEE Access 9 (2021): 106981–97. https://doi.org/10.1109/ACCESS.2021.3100426.
1 Introduction
本文的贡献如下:
- 提出一个面向动态环境的实时语义vSLAM 算法——RDMO-SLAM,该算法使用Mask R-CNN(语义分割)和 PWC-Net(光流估计),可同时实现良好的跟踪表现以及实时特性;
- 利用光流法来预测Mask R-CNN 的语义结果,使得跟踪线程可利用尽可能多的语义信息;
- 实验验证了本算法的实时性能(30 Hz)。
3 Rigid Scene Assumption Problem
如Fig. 1所示,展示了动态物体对SLAM 算法的影响。
对于场景中的动态物体,正确的误差项应为:
其中,$H_{t-1}^t$ 表示地标的运动参数。据作者所言,有两种方法来解算该问题:方法一是使用多物体跟踪对物体的运动参数 $H$ 和相机位姿 $T(\epsilon)$ 进行联合优化(如VDO-SLAM、DynaSLAMⅡ),但该方法是基于刚性物体的假设,即假设物体及其表面的特征点拥有相同的运动模式,该假设不适用于人类等非刚性物体;而且,由于这些方法使用blocked model(如Fig. 3所示)导致无法做到实时。
第二种方法是将动态特征点进行剔除,构建的损失函数如下所示:
大部分算法都是根据特征点的动态属性将权重参数 $W_j$ 设置为0和1,而作者在其前作RDS-SALM 中将 $W_j$ 设置为静态概率(1-移动概率),作者不选择直接将动态地图点进行剔除,因为可以避免静态匹配点过少的场景;作者会随着时间更新每个地图点的移动概率来减少动态物体带来的影响。
4 System Overview
RDMO-SLAM 算法框架如Fig. 4所示,本系统是基于ORB-SLAM3 和 RDS-SLAM 开发的,本算法继续使用RDS-SLAM 中的语义线程,根据移动概率将地标分为三组:未知、静态以及动态,然后在跟踪线程中使用尽可能多的静态特征点。此外,作者新增了一个Label Prediction 模块,在等待语义分割结果的时候使用光流来预测语义标签;速度估计线程是利用光流来计算并更新地图点的速度,利用地图点的速度信息可作为额外的约束来滤除跟踪线程中的错误关联。最终,包含运动概率和速度的语义信息被用于滤除外点。
5 Optical Flow Thread
作者使用PWC-NET 进行光流估计,对1024*436分辨率的图片实现35FPS 的处理速度。每个像素的光流结果存储两个浮点数,分别表示像素在相邻两帧之间的位移,结果如Fig. 5所示,光流只检测身体的运动部位,如手臂与腿部。
光流的结果有两个用途:
- 在语义线程中协助预测关键帧的语义标签,来提高语义信息的生成速度;
- 在速度估计线程中计算地图点的速度。
6 Semantic Thread
Mask R-CNN 运行速度太慢,接近200ms,为了获取更多的语义信息,作者提出一个算法:在等待 Mask R-CNN 结果的同时,利用之前获取的语义标签和参考关键帧的光流模式来预测当前关键帧的语义标签。
6.1 Semantic Keyframe Selection
由于Mask R-CNN 的处理速度,如果所有的关键帧都经过语义分割处理,那么语义线程与跟踪线程之间的语义延迟会逐渐增大,导致跟踪线程无法实时获取丰富的最新语义信息。为了减少语义延迟,RDS-SLAM 的关键帧选取策略会导致许多关键帧无法获取语义结果,不充分的语义信息导致RDS-SLAM 处理速度较慢(15Hz)。
为解决该问题,作者提出了新的关键帧选取策略,如Fig. 6所示,每次使用Mask R-CNN 对最新的关键帧(如 $KF_0, KF_3, KF_7$ )进行处理,而之间未处理的关键帧(如 $KF_1, KF_2$ )使用预测方法处理。
6.3 Semantic Label Prediction
使用已分割关键帧(如 $KF_0$ )作为参考关键帧,利用参考关键帧的语义标签和目标关键帧的光流结果来对目标帧(如 $KF_1, KF_2$ )的语义标签进行预测,如下式所示:
其中,$I_r(x_r, y_r)$ 表示参考关键帧的语义分割标签;$(f_x, f_y)$ 表示光流向量;$I_p(x_p, y_p)$ 表示待预测的标签。
6.5 Moving Probability Update
作者定义地图点的移动概率 $p(m_t^j), m_t^j \in M=\{static(s), dynamic(d)\}$ 。本系统在语义线程中利用贝叶斯滤波器来更新移动概率:
其中,$p(m_0) = 0.5$ 是初始概率;$p(z_t | m_t)$ 是观测似然,根据语义标签进行设定。
6.6 Algorithm Implementation
语义线程的具体算法如下所示:
其中,各个指针代表的含义如Fig. 12所示,workId 指的是当前工作的指针,会遍历每一个关键帧;refId 指的是参考关键帧;reqId 是最新语义请求的关键帧;latestId 是当前最新的关键帧。
利用语义分割或者预测获取到语义标签后,更新语义信息、获取动态物体的掩码并更新地图点的移动概率。
7 Velocity Estimation Thread
语义分割只能识别出预定义的动态物体,且分割结果不一定都是准确的,因此,作者引入速度约束来进一步减少外点的影响。为了获取更为准确的速度估计,作者使用卡尔曼滤波器来更新速度:
8 Tracking
为了让vSLAM 实时运行,作者将语义线程、速度估计线程与跟踪线程分离开,利用地图中存储的地标移动概率和速度来滤除外点。实验中,作者设定 $\theta_d = 0.6, \theta_s = 0.4$ 。跟踪线程是用来进行初始位姿估计的,作者优先使用静态特征点;若不足,则进一步使用未知特征点;若还不足,进一步使用动态特征点。