1.传统视觉SLAM技术的局限

  大部分视觉定位与建图(SLAM)算法假设环境中的物体是静态或者低运动的,对应用环境有严格的限制,这种假设影响了视觉SLAM 系统在实际场景中的适用性,当环境中存在动态物体时,例如走动的人,反复开关的门窗等,都会给系统带来错误的观测数据,降低系统的精度和鲁棒性。通过RANSAC算法(随机采样一致性)的外点处理机制能够解决部分异常点对算法的影响,但是如果动态对象占据大部分图像区域时,依然会影响位姿跟踪。所以需要检测运动的物体、剔除动态区域的特征点(或者降低其在优化位姿时的权重),以减少物体运动对视觉定位的影响。



图1 去除动态的特征点

2.常用算法:

  随着深度学习的发展,动态场景下SLAM问题受到了广泛的关注,并涌现除了很多优秀的方法,尤其在17年之后陆续发布了很多开源的系统(DS-SLAM、Dyna-SLAM、Co-Fusion)。目前大部分的动态SLAM系统都是在ORB-SLAM2或者KinectFusion基础上改进得到的,很少部分会涉及到边缘SLAM的方法。
  用于检测动态区域或者特征点的常用方法有以下几种:

2.1基于深度学习的分割方法

  利用深度学习技术能够很好地识别图像中特定的物体,结合运动物体的先验知识(汽车、行人、动物),能够很好的去除潜在的动态区域,实验结果证明该方法是最为简单高效的方案,也是目前主流的技术方案。需要注意的是,对于移动的椅子、停在路边的汽车,该方法往往会做出错误的判断。
  深度学习在动态SLAM中的应用有两种形式:目标检测与实例分割(语义分割)。



图2 目标检测与实例分割

2.1.1目标检测(Object Detection)

  目标检测的目标是找到图像中所有的待检测物体,并用边界框标出该物体的位置,如左图所示。该方法的优点是检测速度快,但是缺点也很明显,其只能用方框标出物体大概位置,不能实现精确分割,如果直接将方框内的特征点去掉,会因特征点过少而影响定位精度。为了克服此问题,会通过图割法对方框中的图像进行进一步修剪,以得到更加准确的物体区域。

  常用的用于目标检测的网络包括Yolo系列、SSD等。

2.1.2语义分割(INstance Segmentation)

  语义分割的目标是对物体进行像素级别的分割,如右图所示。该方法的优点在于精度较高,但是分割速度并不高,一般来说达不到实时的要求。为了解决效率问题,一些论文提到只在关键帧中进行实例分割,然后通过传播模型得到普通帧的结果。

  常用的用于语义分割的网络包括SegNet、Mask-RCNN等。

2.2基于多视图几何的方法

  多视图几何检测动态特征点的原理是用多帧图像的位姿约束,剔除误差较大的特征点。常用的方法为极线约束



图3 对极几何

  假设相机从不同的角度观测到同一个空间点 P。根据针孔相机模型,它在两个图像上的像素坐标 x=[u, v, 1]^T,即x_1,x_2满足:

s_1x_1 = Kp

s_2x_2 = K(Rp+t)

  其中K为相机内参矩阵,Rt表示两图像之间的平移旋转矩阵。在理想情况下,两张图片中匹配的点对的坐标符合约束:

x_2^TFx_1=[u_2,v_2,1]F[u_1,v_1,1]^T

  其中,F 为基础矩阵(Fundamental matrix)。而在真实 的场景下,由于相机采集的照片并非理想图片,存在一定程度的畸变和噪声,使得相邻帧间的点无法完美匹配上极线l

l_1=[X,Y,Z]^T=Fx_1=F[u1,v1,1]^T

  点x_2到极线L_1的距离D为:

D=\displaystyle\frac{|x_2^TFx_1|}{\sqrt{\Vert X \Vert^2 + \Vert Y \Vert^2 } }

  若距离 D 大于阈值,则认为该点不符合极线约束,被认为是动态的点。
  需要注意的是,当物体沿着极线的方向运动时,该方法会失效。

2.3基于光流/场景流的方法

2.3.1光流方法

  对于两个张图像,稠密光流很好地描述了每个像素在二维平面中运动的情况,是检测运动区域很好的方法,一般来说运动物体的区域所产生的光流会远高于静态的背景区域。但是除了物体本身运动会产生光流,相机的运动也会产生光流,为了消除相机运动的影响,通常会采用以下两种方案:

  1. 1.通过特征匹配计算二者之间的仿射变换,然后对第一张图像进行校正,用校正后的图像与第二张图像计算稠密光流。
  2. 2.结合语义信息得到初始静态背景的区域;计算两张图像之间的光流场;计算初始背景区域光流场的平均运动方向;光流场减去背景光流场得到最后的光流结果。
    OpenCV有很多关于稠密光流的函数,如DeepFlow。

2.3.2场景流方法

  所谓场景流(Scene Flow),就是光流(Optical Flow)的三维版本,表述了图像/点云中每个点在前后两帧的变化情况。光流由两帧图像即可得到,场景流则需要两帧双目图像或者RGBD图像来得到。目前对场景流的研究还局限在实验室阶段,由于缺乏实际数据(打标成本太高)以及客观的评价指标,离工程应用还有不小的距离。



图4 光流与场景流的关系

  正如论文FlowFusion中所介绍的,场景流反映了世界坐标系下物体点云的3D运动情况,也就是我们想要检测的东西;光流是二维图像中像素运动产生的,并不简单是场景流投影至二维平面的结果,其还受相机运动(Ego motion)的印象,也就是说,相机运动产生的Ego Flow和物体本身运动产生的Secne Flow叠加,并投影至相机图像平面上,便得到了我们观测的Optical Flow。

Optical Flow = Scene Flow + Ego Flow

  场景流Secne Flow反应了物体的真实运动情况,求得场景流便知道了运动的物体。具体方法为:

  1. 1.计算两帧图像的初始位置,并进一步计算Ego Flow
  2. 2.计算两帧图像的光流场
  3. 3.二者相减得到3D场景流,投影至2D图像平面即得到了运动区域

2.4基于残差的方法

  该方法最朴素的想法是计算每个点的误差大小(光度、重投影误差等),根据误差的大小来判断是否属于动态物体,可以应用在特征点上也可以应用在整个图像上,需要注意的是,因为要计算误差,所以需要计算一个初始的位姿,计算位姿时一般会将当前图像与所维护的静态地图进行比较,因为每一帧图像都会对静态地图进行更新和维护,所以位姿计算也是比较准确地。
  如下图所示,首先计算整张图像的残差,然后通过自适应阈值分割即可得到大致的动态区域,最后经过形态学处理去除噪声影响即可。



图5 通过残差寻找动态区域

3.性能比较

  TUM提供了相关数据集,用来验证算法的性能。受运动物体的影响,传统的SLAM系统比如ORB-SLAM2通常达不到很好地效果,如红色轨迹所示。而动态SLAM算法因为能够很大程度上消除动态物体的消极影响,在定位精度上可以得到很大提升。



图6 传统SLAM算法与动态SLAM算法的轨迹对比