源码:https://github.com/ivipsourcecode/DS-SLAM
主要是通过语义分割和运动一致性检查相结合的离群值剔除方法来检测动态点。
本文提出了一种面向动态环境的稳健语义视觉SLAM—DS-SLAM。在DS-SLAM中,有五个线程并行运行:跟踪、语义分割、局部映射、循环关闭和密集语义地图创建。DS-SLAM将语义分割网络与移动一致性检查方法相结合,减少了动态对象对定位的影响,从而大大提高了动态环境下的定位精度。同时,生成了一个密集的语义八叉树图,可用于高级任务。
DS-SLAM概述。利用原始RGB图像进行语义分割和移动一致性检查。然后去除异常值,估计姿态。基于位姿、深度图像和语义分割结果,在独立的线程中构建语义八叉树图
DS-SLAM的框架。局部建图线程和回环检测线程与ORB-SLAM2相同。前者处理新的关键帧,并进行局部BA优化,以实现相机姿态周围环境的最优重构;后者搜索循环,如果检测到循环,则进行图优化。
对Kinect2采集的RGB原始图像同时进行跟踪线程和语义分割线程处理。
跟踪线程首先提取ORB特征点,然后大致检查特征点的移动一致性,并保存潜在的异常值。
然后跟踪线程等待由语义分割线程预测的具有像素语义标签的图像。
分割结果到达后,将根据结果和之前检测到的潜在异常值丢弃位于移动对象中的ORB特征点异常值。
然后,通过匹配剩余的稳定特征点来计算变换矩阵。
采用SegNet[4]实时提供基于caffe[17]的逐点语义分割。在PASCAL VOC数据集[18]上训练的SegNet可以分割20个类。在实际应用程序中,人很可能是动态对象,所以我们假设位于人体内的特征点很可能是离群值。
由于运动分割耗时较长,语义分割结果可以从另一个线程获得,所以我们只需要确定分割结果中的关键点是否在运动。如果在一个分段对象中确定了一些点是动态的,那么该对象可以被视为一个动态对象
(首先采用语义分割,对分割的结果再进行判断动态点。这样会丢失掉语义分割未能成功识别的动态点)
本文中运动点检测的思想是简单明了的。
首先计算光流金字塔,得到当前帧中匹配的特征点。
然后,如果匹配对太接近图像的边缘或匹配对中心的3×3图像块的像素差太大,则该匹配对将被丢弃。
第三步是利用具有最多内层的RANSAC求基本矩阵。
然后利用基本矩阵计算当前坐标系中的外极线。
最后,确定匹配点到相应极线的距离是否小于某个阈值。如果距离大于阈值,则判定匹配点是移动的。
(这种检测动态点的方法缺陷是如果物体在极线方向上运动,是无法检测到的,因为点在极线上,距离为0,但是实际上也是动态点)
基础矩阵将最后一帧中的特征点映射到当前帧中相应的搜索域,即外极线。
P1,P2分别为最后一帧和当前帧中的匹配点,p1,p2为齐次坐标形式:
式中,u,v为像素坐标值。则表示为L1的极线方程可由下式求得:
式中,X Y Z表示线向量,F表示基础矩阵。然后确定匹配点到对应极线的距离:
算法伪代码:
由于人体等运动对象的灵活变形和复杂运动,运动一致性检验方法很难提取出完整动态区域的轮廓,且提取整个轮廓的时间代价非常昂贵。在DS-SLAM中,由于采用了语义分割网络,可以很容易地获得目标的完整轮廓。
我们的思想是将语义信息和运动一致性检查结果结合起来,完成两级语义知识库的建立:对象在运动或不运动。如果通过运动一致性检查产生一定数量的动态点落在被分割对象的轮廓上,则判定该对象是运动的。如果确定分割后的目标是移动的,则去除该目标轮廓内的所有特征点。这样,离群值就可以被精确地剔除。此外,还可以在一定程度上减少错误分割的影响。
此外,跟踪线程等待另一个线程的语义分割结果的时间可以充分利用。在等待期间,可以进行移动一致性检查。
语义分割结果出来后,如果没有人被检测到,那么所有ORB特征将直接与最后一帧匹配,以预测姿势。否则,使用移动一致性检查结果来确定人员是否正在移动。如果确定人员是静态的,则直接预测姿势,否则在匹配之前删除落在人员轮廓内的所有ORB特征点。这样可以显著降低动态对象的冲击。
语义八叉树建图线程通过跟踪线程获得新的关键帧,并通过语义分割线程获得分割结果。关键帧的变换矩阵和深度图像用于生成局部点云。然后,将局部点云转换并保存在全局八叉树地图中。我们采用八叉树表示形式[8],因为它灵活、紧凑、可更新。八叉树图存储效率高,易于导航。
语义信息也被合并到八叉树图中。八叉树图中的每个体素都与一种特定的颜色相关联,每种颜色代表一个语义标签。例如,红色的体素表示它属于沙发,而粉色的体素表示它属于人。所有的建模和语义融合过程都是以概率的方式完成的,因此可以方便地更新体素的属性。这样,密集语义3D八叉树地图可以为移动机器人完成高级任务提供基础。
DS-SLAM面向处理动态环境,所以动态对象不应该存在于地图中。语义分割结果可以帮助我们有效地过滤掉动态对象。然而,语义分割的准确性是有限的。在复杂的情况下,例如,对象相互重叠,语义分割结果可能是不完整的甚至是错误的。
为了解决这个问题,在DS-SLAM中使用了log-odds评分方法[8]来最小化动态对象的影响。log-odds分数用于表示单个体素被定量占据的可能性。设p∈[0,1]表示一个体素被占据的概率,l∈R表示该概率的对数概率分数。l可以通过logit变换计算:
逆变换为:
设Zt表示体素n在时间t的观察结果,从开始到时间t的log odds分数为L(n|Z1:t)。那么在时间t+1,体素n的log odds分数可以计算如下:
其中,如果观察到体素n在时间t被占据,则L(n|Zt)等于τ,否则为0。增量τ是预先设定的值。该公式表示当重复观察到一个体素被占据时,该体素的log odds分数将增加,否则将减少。可以通过逆logit变换来计算体素的占据概率p。只有当占据概率p大于预定义的阈值时,该体素才被视为被占据,并且将在八叉树图中被可视化。换句话说,已经被观察到多次被占据的体素被认为是稳定的被占据体素。通过这种方法,我们可以很好地处理动态环境中的地图构建问题。