动态场景下的slam

  • 动态场景下的slam的问题
  • 解决方法
    • 语义slam时间效率问题的方法
      • 方式一:将分割网络放在单独的线程
      • 方案二:目标检测与语义分割网络之间的切换
      • 方案三:只在关键帧上进行目标检测
  • 分析与总结

大神连接:https://blog.csdn.net/Yong_Qi2015/article/details/121484396

动态场景下的slam的问题

  如果在使用slam当中,输入的图片当中存在动态物体,或者可移动的物体,在修建地图的当中,那些从动态物体上提取的特征点,在环境当中可能是不稳定,一旦动态物体消失或者转移了位置,这样会对后面的定位和姿态的确定会造成很大的干扰,甚至直接造成slam失败,也会造成地图难以重复使用。

解决方法

  针对上述的问题,大体上的意思都是确定处于此刻动态物体上特征点,然后不在使用动态物体上特征点。这样仅仅使用静态场景下所提取的特征点的话,会使得地图能够被多次利用。精准化实现位姿的确定以及重定位。

针对动态场景下的SLAM问题,解决方法大致可以分为两大类:
 1、是使用多视图几何或者其他传统方法检测外点或者残差较大的动态区域,
 2、是使用深度学习的方法,包括目标检测和实例分割的一些网络,将一些先验的运动的物体分割出来进行剔除。

语义slam中的分割确定性和时间效率问题:

1、确定性问题:
 在特定使用的场景下,后者能够高效的剔除动态物体上的特征点,大大提升定位精度,但对一些没有先验注释的动态物体,或者对于标签为静态物体,但在此时此刻的场景中是动态的场景中。使用深度学习的方式难以实现这些动态物体上的特征点。
2、时间效率问题
 神经网络融合进SLAM后并不能实时运行,而且分割精度与准确度通常和时间效率成反比,要想得到更快的分割速度,往往需要以牺牲精度为代价。所以,在使用深度学习方法解决动态环境下的SLAM问题时,如何提高系统运行效率是一个亟待解决问题。

目前的趋势是将深度学习与传统方法结合,从而达到各种动态的物体特征点的精准去除。

语义slam时间效率问题的方法

方式一:将分割网络放在单独的线程

  例如1:清华大学的论文《DS-SLAM: A Semantic Visual SLAM towards Dynamic Environments》,论文地址。代码地址;
 在其中提出将语义分割网络放在一个单独运行的线程之中,这样语义分割可以和ORB特征提取、运动一致性检测并行运行,可以提高系统运行的效率。这种做法得到了之后很多人的采纳,但是在这里运动一致性检测不再能使用语义分割结果,而且所使用的语义网络运行速度也需要足够高,否则还是会成为提升性能的瓶颈所在。

论文中的主要图示如下:


主要工作包括:
1、基于ORB-SLAM2,提出了一个完整的动态环境下语义SLAM系统(DS-SLAM),可以减少动态对象对位姿估计的影响。
2、将实时语义分割网络置于独立的线程中,将语义分割与运动一致性检查方法相结合,过滤出场景中的动态部分。
3、DS-SLAM创建一个单独的线程来构建一个密集的语义3D八叉树映射。高密度语义三维八叉树映射采用对数比值分值法过滤不稳定体素,并更新这些体素的语义。

方案二:目标检测与语义分割网络之间的切换

  首先要知道目标检测是用方框将将图像中的每一个检测到的物体框起来,语义分割是像素级别的将图像中每一类物体进行分类,实例分割是像素级将图像中每一个物体进行分类。由此可见语义分割与实例分割的分割结果要优于目标检测,所以一般来说分割所需要的时间也更长一些
 故可以在特征点丰富的情况下,使用目标检测网络以提高系统运行的效率,而在特征点较少的情况下,使用像素级别的语义分割以提高分割精度来得到更多背景上的静态的特征点。
下面是目标检测、语义分割和实例分割的例子:

例如1: 论文《STEREO CAMERA VISUAL SLAM WITH HIERARCHICAL MASKING AND MOTION-STATE CLASSIFICATION AT OUTDOOR CONSTRUCTION SITES CONTAINING LARGE DYNAMIC OBJECTS》,论文地址;论文代码;
 在其中,为了解决平衡计算速度和mask准确度。提出了一种分层对象去除(Hierarchical Object Masking)的策略。具体的,首先使用EfficientDet网络进行目标检测,如果车辆检测框占图像面积比例超过一定的阈值,则认为背景上的特征点过少,需要使用像素级别的分割网络Mask-Rcnn得到更加精细的分割结果,从而得到更多的背景上的特征点。
 即利用语义信息结合对象级几何约束快速检测场景中的静态部分。然后,我们对静态部分进行两步粗到精的自我运动跟踪。形成了一种新颖的动态视觉SLAM形态。

论文中的主要图示如下:
1、总体系统流程:

2、两种不同的mask的技术

3、效果展示

主要工作包括:
1、基于语义-几何方法的静态物体和静态背景的立体vSLAM检测;
2、基于层次掩蔽的动态物体掩蔽技术;

方案三:只在关键帧上进行目标检测

  既然不能实时的在SLAM系统中运行神经网络,那就只在关键帧上进行检测,然后将结果传播到其他帧上去。

  例如1:2018年北京大学发表在WCACV的论文《Detect-SLAM: Making Object Detection and SLAM Mutually Beneficial》,论文地址;论文代码(暂无);
 在其中提出了一个在GPU加速的情况的可以实时运行的开源动态SLAM系统Detect-SLAM。具体的文中介绍到,将SLAM与目标检测算法相结合可以很好的弥补二者的不足,利用目标检测算法去除运动目标上的特征,可以提高动态环境下的SLAM系统定位性能,而利用SLAM系统建立的语义地图又可以帮助改善在具有挑战性条件下的目标检测效果。下面我们只讨论我们关心的部分,如何让融合目标检测网络实的SLAM系统实时运行?
论文图解如下:

 Detect-SLAM框架。它由运动物体去除、物体检测、slam增强检测器和映射物体组成。输入数据为RGB-D图像。移动对象移除包含了ORBSLAM的跟踪和局部映射线程。其中SSD运行在GPU上,其余运行在CPU上。

Detect-SLAM提出了两种策略克服时间效率问题:
1、只在关键帧中进行目标检测(SSD网络),然后对局部地图中地图点的更新运动概率。
2、通过特征点匹配和匹配点传播来传播运动概率,之后使用移动概率小的特征点进行跟踪。

更新运动概率方式:
 对关键帧In的RGB图像进行目标检测,由于目标检测需要较长时间,此时其他图像Tn+i通过上一帧图像的概率传播获得移动概率。当目标检测完成后(移动物体比如人上的特征点设为1,背景上的特征点设为0),对局部地图中对应特征点的概率进行更新,具体方法如下图:

传播运动概率方式
 对于除了关键帧以外的普通帧,需要通过帧与帧之间的概率传播得到当前帧各个特征点的运动概率。

具体包括特征匹配和匹配点扩散两种形式。
1、将当前帧的特征点与上一帧和局部地图中的特征点进行匹配,若匹配成功,则之间将其运动概率拷贝过来。
2、对于匹配失败的特征点,利用特征点的空间一致性得到运动概率。对于置信度高(分数过低或过高)的特征点设置影响半径,向影响到的未匹配到的特征点传播运动概率。

具体如下图所示:

  例如2:论文《RDS-SLAM: Real-Time Dynamic SLAM Using Semantic Segmentation Methods》,论文地址;
 以及后续的论文《RDMO-SLAM: Real-Time Visual SLAM for Dynamic Environments Using Semantic Label Prediction With Optical Flow》,论文地址;、

其总体上的思想为:
 新增了语义线程,只在关键帧中进行语义分割,并根据分割结果更新特征点的运动概率。其详细分析和对比了各种关键帧选择方案的语义延时,并给出了一种关键帧的选择策略,适用于各种速率的分割网络,可以最大限度的降低语义延迟、挖掘语义信息的潜力。

在 RDS-SLAM 中的流程图如下:橙色的模型是基于ORB-SLAM3修改的块。品红色是新增加的特点。蓝色的块是重要的数据结构。

假设每两帧选择一帧关键帧,使用Mask-Rcnn进行分割(每分割一张图片,slam可以处理10帧)。下面具体分析三种关键帧的选择策略所产生的语义延迟:(如下图:)

  方法1,按顺序对每一帧关键帧进行分割:首先对关键帧KF0(F0)进行分割,则10帧后F10得到分割结果,语义延迟为10。KF1(F2)在第11帧开始分割,20帧得到结果,此时F20的语义延迟为18。按此规律F30延迟为26,F40为34…语义延迟随时间呈线性增长。

  方法2,使用两个网络对图像按顺序同时进行分割:F12的语义延迟为10,F22的延迟为16。以次类推,语义延迟仍然随时间呈线性增长,故通过增加语义分割的线程数不能从根本上解决问题。

  方法3,使用两个网络,从队列的头和尾部进行分割,一个网络分割最近的关键帧。语义延迟为常数10。

  论文采用方法3进行分割,丢队列头部的关键帧进行语义分割的目的在于,语义线程是在跟踪线程之后的,导致前几帧是没有语义信息进行参考的(Mask-Rcnn为10),前期可能会积累很大误差,需要语义信息进行修正。

  以后新分割的语义信息通过贝叶斯理论融合到地图点中去,以更新移动概率,移动概率以权重的方式融合到位姿优化之中。

分析与总结

  方案一将分割网络放在一个单独的线程运行,通过系统并行运行提高效率,但是这种方案需要网络分割速度足够快,否则还是会成为提高性能的瓶颈。

  方案二在两个网络间切换的策略容易实现,一定程度上可以提高系统运行速度,但是受算法原理的限制,速度不可能提高到快,即最快情况下等于目标检测网络的速度,没有从根本上解决问题。

  方案三在关键帧中进行目标检测,能够保证系统高效的运行。但是关键帧的插入是由环境决定的,即关键帧之间的间隔是不稳定的,可能会因为关键帧间隔过大导致目标检测的能力没有充分发挥出来,也可能会因关键帧间隔过短导致目标检测速度跟不上。(Detect-SLAM想法还是非常非常巧妙和强大的)。

  方案四将创建了一个队列用来存储关键帧,同时分割队列头部和尾部的关键帧,适用于不同速率的网络,在极大缩短语义时延的同时,对前几帧没有语义信息的图像进行分割,一定程度上弥补了初始阶段的误差累积。

本文仅做学术分享,如有侵权,请联系删文。