在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,因此其中的误差便这样一帧一帧的传递下去,也就是我们所说的累积误差。一个消除误差有效的办法是进行回环检测。回环检测判断机器人是否回到了先前经过的位置,如果检测到回环,它会把信息传递给后端进行优化处理。回环是一个比后端更加紧凑、准确的约束,这一约束条件可以形成一个拓扑一致的轨迹地图。如果能够检测到闭环,并对其优化,就可以让结果更加准确。但是这里存在一个问题,如果检测到的是一个假的回环(假阳性闭环),那么会使整个图优化算法收敛到完全错误的值,现阶段,尽管很多研究者围绕着能够降低错误闭环影响的图优化算法展开了研究,但是并没有从根本上消除错误闭环带来的影响,而且越是严格的条件,可能会增加计算量。因此,如何正确有快速的检测出回环,对整个SLAM系统至关重要。
早期的闭环检测方法多基于外观不变性假设,这些方法在稳定的室内环境下尚能正常运行,但面对室外环境下的长期自主导航任务,光照变化、季节更替、 动态场景、 视角变化等因素(见图 1)会大大降低检测的准确率和召回率.近年深度学习、图像分类、 目标识别、 语义分割等领域的迅速发展,使研究者们开始关注如何使用这些领域的技术来进行更好的闭环检测。
视觉回环检测的大致流程,如下图:
图像数据库、地图点的拓扑信息和度量信息、路标点的几何信息一起构成了对地图的描述.拓扑信息是指机器人运动的连续性,相邻的图像代表着地图上邻近的地方;度量信息是指场景之间的相对位置和方向信息;几何信息是指图像特征的 3 维信息及其数据关联. 当新的观测信息到来时,先将其转化为对场景的描述,然后和地图信息进行比对,最后通过决策模型来对闭环进行识别。
回环检测的第一步是需要识别出当前的场景是否在之前已经经历过,根据两个场景的相似程度去判断是否回环。这对我们来说是可以很简单的识别出来这个场景是否之前去过,但是机器人是否能够正确识别出来这是一个很难的问题,而为了能够让机器人能够正确识别出来,需要设计出机器人对所处的周围环境的理解,即场景描述——怎么描述周围的环境才能让机器人最大的去理解所处环境而做出正确的判断。因此,根据场景描述的方法不同,回环检测的方法也是不同的。
现阶段场景描述的方法分为:
1)局部特征描述子;
2)全局描述子;
3) 局部区域的全局描述子;
4) 结合深度信息的场景描述;
5) 场景的时变描述.
局部描述子是指以特征点为中心生成的图像局部区域描述。现阶段在SLAM中使用最广泛的特征点有SIFT,SUFT,ORB。
SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结,提取的流程大致如下:
SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。其描述子提取的可以总结如下:
由于SIFT特征点需要消耗的时间和内存相对比较多,为此,研究者们在sift基础上进行了很多改进,其中SUFT就是其中一种比较优秀的。SURF 算法,全称是 Speeded-Up Robust Features。是2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出的,该算子在保持 SIFT 算子优良性能特点的基础上,同时解决了 SIFT 计算复杂度高、耗时长的缺点,对兴趣点提取及其特征向量描述方面进行了改进,且计算速度得到提高。其通过Hessian矩阵的行列式来确定兴趣点位置,再根据兴趣点邻域点的Haar小波响应来确定描述子,其描述子大小只有64维(也可以扩展到128维,效果更好),是一种非常优秀的兴趣点检测算法
而后出现了ORB特征点,ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。这个算法是由Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出。ORB算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust IndependentElementary Features)特征描述算法改进的。并在它们原来的基础上做了改进与优化。ORB算法的速度大约是SIFT的100倍,是SURF的10倍。
但是,基于局部特征描述子的闭环检测技术能够在SLAM 系统中实时运行的一项关键技术是 Sivic等提出的视觉词袋模型,它离线将大量特征的描述子进行聚类,最终形成视觉词汇,这样每一副图片就可用 1 个二进制向量来表示,向量的长度是视觉词汇的总个数,图像间共享词汇的数量用以度量图像间的相似度,避免了极其耗时的特征匹配过程.为进一步提高速度,Galvez-López 等建立词汇树对二进制描述空间进行离散化,这种分层的结构使得词汇查询更为便利.Mur-Artal等提出的ORBSLAM 是一种易用且很难被超越的 SLAM 系统,它借助词袋模型获得了较强的闭环检测和重定位能力。
现在VSLAM框架回环检测一般采用词袋模型,用的比较多的是DBoW2,下面比较一下词袋模型库的区别。但是如果在移动端使用的话,词袋的内存太大,需要降低内存。
这个库已经很旧了,简要介绍:DBow库是一个开源C ++库,用于索引图像并将图像转换为词袋表示。它实现了一个分层树,用于近似图像特征空间中的最近邻并创建可视词汇表。DBow还实现了一个基于逆序文件结构的图像数据库,用于索引图像和快速查询。DBow不需要OpenCV(演示应用程序除外),但它们完全兼容。
源码地址:https://github.com/dorian3d/DBow
DBoW2是DBow库的改进版本,DBoW2实现了具有正序和逆序指向索引图片的的图像数据库,可以实现快速查询和特征比较。与以前的DBow库的主要区别是:
DBoW2类是模板化的,因此它可以与任何类型的描述符一起使用。
DBoW2可直接使用ORB或BRIEF描述符。
DBoW2将直接文件添加到图像数据库以进行快速功能比较,由DLoopDetector实现。
DBoW2不再使用二进制格式。另一方面,它使用OpenCV存储系统来保存词汇表和数据库。这意味着这些文件可以以YAML格式存储为纯文本,更具有兼容性,或以gunzip格式(.gz)压缩以减少磁盘使用。
已经重写了一些代码以优化速度。DBoW2的界面已经简化。
出于性能原因,DBoW2不支持停止词。
DBoW2需要OpenCV和 Boost::dynamic_bitset类才能使用BRIEF版本。
DBoW2和DLoopDetector已经在几个真实数据集上进行了测试,执行了3毫秒,可以将图像的简要特征转换为词袋向量量,在5毫秒可以在数据库中查找图像匹配超过19000张图片。
源码地址:https://github.com/dorian3d/DBoW2
DBoW3是DBow2库的改进版本,与以前的DBow2库的主要区别是:
DBoW3只需要OpenCV。DLIB的DBoW2依赖性已被删除。
DBoW3能够适用二进制和浮点描述符。无需为任何描述符重新实现任何类。
DBoW3在linux和windows中编译。
已经重写了一些代码以优化速度。DBoW3的界面已经简化。
使用二进制文件。二进制文件加载/保存比yml快4-5倍。而且,它们可以被压缩。兼容DBoW2的yml文件
源码地址:https://github.com/rmsalinas/DBow3
FBOW(Fast Bag of Words)是DBow2 / DBow3库的极端优化版本。该库经过高度优化,可以使用AVX,SSE和MMX指令加速Bag of Words创建。在加载词汇表时,fbow比DBOW2快约80倍(参见tests目录并尝试)。在使用具有AVX指令的机器上将图像转换为词袋时,它的速度提高了约6.4倍。
源码地址:https://github.com/rmsalinas/fbow
全局描述子的方法就是直接去计算整张图像的描述子。一种广泛使用的全局描述子是 Oliva 等提出的 Gist 描述子,它使用 Gabor 滤波器在不同方向和频率下提取图像信息并压缩成 1 个向量来得到图像的描述,Gist 描述子对场景进行识别分类不需要对图像进行分割和局部特征提取,相对于局部特征,该特征是更为“宏观”的特征描述方式,忽略图片的局部特点。
Kröse等直接用 PCA(Principal Component Analysis)降维方法生成线性图像特征,然后利用该特征建立基于高斯分布的观测模型。
Lowry等使用在线学习的方式对 PCA 变换进行训练,并指出前半部分维度的 PCA 特征代表了连续图像序列中相似的信息,易受环境变化的影响,而后半部分维度的特征具有环境条件不变性,因而更能应对环境的变化,但如何对维度进行分割仍需进一步研究。
Ulrich等则采用全景彩色图片的直方图结合最邻近学习来进行图像匹配.此外,局部特征点的描述子同样可用来生成图像的全局描述,例如 Sunderhauf等先对图像进行下采样,然后围绕下采样后的图像中心计算 BRIEF(binaryrobust independent elementary feature)描述子,这种方式易于实现而且效率很高,适用于一些大规模的SLAM 应用。
现有的PTAM系统是在构建关键帧时将每一帧图像缩小并高斯模糊生成一个缩略图,作为整张图像的描述子。在进行图像检索时,通过这个缩略图来计算当前帧和关键帧的相似度。这其实和随机蕨法很相似,这种方法的主要缺点是当视角发生变化时,结果会发生较大的偏差,鲁棒性不如基于不变量特征的方法。
近年围绕着“设计一种更好全局描述子”的工作大多是基于深度学习的方法。Chen等首次提出用预训练的卷积神经网络(CNN)来进行场景识别,并用实验证明 CNN 生成的场景描述相比传统方法,在应对环境变化时表现更好。Sunderhauf 等以 Krizhevsky 等提出的 AlexNet 网络(见下图)为例,评估了 CNN 各层特征应对外观变化和视角变化的鲁棒性能.实验表明卷积网络的低层 conv3(第 3 个卷积层)对外观变化更具鲁棒性,而高层fc6(第 1 个全连接层)对视角变化更具鲁棒性.
神经网络的低层生成的描述子对图像的描述更加精细,因而对场景的区分能力更强,而高层生成的描述子相对粗糙,但包含更多的语义信息.如何融合各层网络生成的特征以获得对场景更好的描述,对闭环检测来说仍然是有待研究的问题.这种思想在目标识别中已经获得了应用.
虽然使用现有的卷积神经网络来生成全局图像描述子的方法获得了很多应用,但这种方法仍然存在一些问题,其根本原因在于这种方法是为了专门用于图像分类来设计和训练的,因而它并不具备专门用于闭环检测任务的网络该有的特点。以图像分类为目标训练的卷积核更倾向于抓取那些有可能成为图像分类目标的细节,而忽略掉建筑物等不是分类目标的事物.这个特点对闭环检测来说是不利的,人、汽车这些都是动态的场景,而闭环检测的相似度计算应该集中于静态事物上才能应对场景的变化,比如楼房、路灯等.为解决这个问题,有 3 种常用思路:(1) 微调现有的 CNN;(2) 重新设计 CNN;(3) 采用语义分割对动态和静态场景进行分离。
全局描述子比局部特征描述子对外观变化的鲁棒性稍好,但其对视角变化很敏感.虽然上文中提到的方法有助于提高其对环境的适应能力,但在条件变化稍复杂时,例如同时出现外观变化和视角变化的情况下,全局描述必须要结合其他方法才能获得应用,例如视角合成和序列匹配。
局部特征点描述子和全局描述子优势互补的特点,使得很多研究者开始使用全局描述的方法来对图像的局部区域生成描述子.局部区域可使用各种局部区域探测器来生成,各个局部区域的描述子合在一起形成对当前场景的描述.这种方法的关键在于如何生成稳定的局部区域,使其在环境条件发生变化时也能保证一定的可重复性。
Neubert 等先用超像素分割的方法生成图像块,然后在多尺度下对图像块进行融合,这种方法生成的图像区域相比基于 SIFT 的方法有着更好的外观不变性,相比固定方格的方法具有更好的位置不变性。
近年来随着目标识别领域的发展,出现了很多更加优秀的物体提案方法,如 RPN(region propos-al network)网络和 EdgeBoxes 算法 。相比于RPN 通过学习的方法来获得特定目标的潜在区域,EdgeBoxes 算法通过方框内部轮廓信息量的大小来判断其是否包含物体,因而它具有通用性,并不局限于特定目标的物体提案生成,然后使用CNN 来生成局部区域的全局描述子。这种方法的缺点是很难实时运行,一方面是因为现有的算法生成物体提案都很耗时,例如 EdgeBoxes 算法在 CPU上处理 1 张图片需要近 1.8 s 的时间;另一方面要提高算法的稳定性,需要增加局部区域的数量,而每一个区域都需要 CNN 前向传播来提取特征,这比单纯地使用全局描述要更加复杂。
从原始图像中生成局部区域,再对局部区域生成全局描述子的方法,其优势是一方面兼顾了外观不变性和视角不变性,另一方面它使场景的定义更加灵活.局部区域可看作是一个路标,将不在同一张图像中的路标集中在一起就可描述一个新的场景 .现有方法的问题还在于需要一种稳定性、语义性更强同时又兼顾效率的局部区域生成方法.
深度信息结合语义分割可生成更高级的语义特征来描述场景,从而增强对环境的认知能力。
深度信息的获取可通过 RGB-D 相机或者双目相机.即便是对单目相机而言,也可通过特征匹配和三角化的过程得到尺度未知的深度信息.这些深度信息可以是稀疏的或者稠密的,例如 Engel等提出的视觉里程计 DSO(direct sparse odometry)和Endres等提出的 SLAM 系统 RGBDSLAMv2.直接法的使用使得基于单目相机建立一种半稠密地图成为可能,这种方法基于光度不变性进行位姿跟踪,用极限搜索和贝叶斯滤波来更新深度。
对闭环检测而言,由深度信息结合图像信息建立的语义特征,不仅增强了对外观变化和视角变化的适应能力,而且简化了地图描述,节省了存储空间,因为语义地图只需要存储特征的语义标签即可,而不是整个 3 维信息.SLAM++ 就是一个可进行实时语义建图的 SLAM 系统,它将物体3 维信息存入数据库,然后利用这个数据库进行物体识别和建图.此外,深度信息还可结合多视图几何来对生成的闭环进行验证,剔除错误的闭环。
以上讨论的场景描述方法中,都是假设场景和描述子是一一对应的,然而当现实环境发生诸如昼夜更替、建筑物拆除、季节变换等较大变化时,对同一地点的单一描述往往很难取得较好的闭环检测效果.因而很多学者开始研究地图点的时变描述,在不同时间段使用不同的场景描述子。
生成时变描述子的方法主要有 2 种.一种是学习环境的变化规律以生成不同时间段下的描述子,例如 Neubert等通过学习超像素的变换词典来预测当前场景随季节的变化规律.这种方法假设外观相似的图像块发生类似的变化,在匹配之前先将当前图像进行超像素分割,分割后生成的描述子通过
学习的词典变换到被匹配图像所在的季节,然后再进行匹配.Lowry等则通过线性回归的方法来学习同一地点的图像在上午和下午的线性变换.另一种方法是直接用不同时间段的观测信息来代表同一个地点.Biber等指出,在长期 SLAM 当中,地图的变化并不是固定的,机器人并不知道地图的变化是暂时的还是永久的,因此有必要保存之前的地图状态,基于这一点 Biber 提出了不同时间尺度下的多重地图表示方法。