视觉SLAM十四讲笔记-11-1

视觉SLAM十四讲笔记-11-1

文章目录

  • 视觉SLAM十四讲笔记-11-1
    • 11.1 概述
      • 11.1.1 回环检测的意义
      • 11.1.2 回环检测的方法
      • 11.1.3 准确率和召回率
    • 11.2 词袋模型

主要目标:
1.理解回环检测的必要性。
2.掌握基于词袋的外观式回环检测。
3.通过DBoW3的实验,学习词袋模型的实际用途。
这一章将介绍视觉 SLAM 中检测回环的方式:词袋模型,并通过 DBoW 库进行程序实验。

11.1 概述

11.1.1 回环检测的意义

在前面章节已经介绍了前端和后端:前端提供特征点的提取和轨迹、地图的初值,而后端负责对多有这些数据进行优化。然而,如果像视觉里程计那样仅仅考虑相邻时间上的关键帧,那么之前产生的误差将不可避免地累积到下一个时刻,使得整个 SLAM 出现累积误差,长期估计的结果将不可靠,或者说无法构建全局一致的轨迹和地图。
举个简单的例子:在自动驾驶的建图阶段,通常会指定采集车在某个给定区域绕若干圈以覆盖所有采集范围。假设在前端提取了特征点,然后忽略特征点,在后端使用位姿图优化整个轨迹,如下图中左侧所示。前端给出的只是局部的位姿间约束,例如,可能是 x 1 − x 2 x_1 - x_2 x1x2 x 2 − x 3 x_2 - x_3 x2x3,等等。但是,由于 x 1 x_1 x1 的估计存在误差,而 x 2 x_2 x2 是根据 x 1 x_1 x1 决定的, x 3 x_3 x3 是由 x 2 x_2 x2 决定的。依次类推,误差就会被累积起来,使得后端优化的结果如下图中间所示,慢慢地趋于不准确。在这种应用场景下,应该保证优化的轨迹和实际地点一致。当实际经过同一个地点时,估计轨迹也必经过同一点。
视觉SLAM十四讲笔记-11-1_第1张图片
虽然后端能够估计最大后验误差,但所谓“好魔性不如烂数据”,只有相邻关键帧数据时,能做的事情并不多,也无从消除累积误差。但是,回环检测模块能够给出除了相邻帧的一些时隔更加久远的约束:例如 x 1 − x 100 x_1-x_{100} x1x100 之间的位姿变换。为什么相邻久远的帧之间会有约束尼?这是因为察觉到相机经过了同一个地方,采集到了相似的数据。而回环检测的关键就是如何有效地检测出相机经过同一个地方这件事。如果能够检测出这件事,就可以为后端的位姿图提供更多的有效数据,使之得到更好的估计,特别是得到一个全局一致的估计。由于位姿图可以看成一个质点—弹簧系统,所以回环检测相当于在图像中加入了额外的弹簧,提高了系统稳定性
回环检测对于SLAM系统意义重大。一方面,关系到估计的轨迹和地图在长时间下的正确性。另一方面,由于回环检测提供了当前数据与所有历史数据的关联,还可以利用回环检测进行重定位。因此,回环检测对整个SLAM系统精度与稳健性的提升是非常明显的。甚至在有些时候,把仅有前端和局部后端的系统称为视觉里程计,而把带有回环检测和全局后端的系统称为SLAM。

11.1.2 回环检测的方法

下面考虑回环检测如何实现的问题。事实上存在若干种不同的思路来看待这个问题,包括理论上的和工程上的。
最简单的方式就是对任意两幅图像都做一遍特征匹配。根据正确匹配到的数量确定哪两幅图像存在关联。但是,这样盲目地假设了"任意两幅图像可能存在回环",使得要检测的数量实在太大:对于 N N N 个可能的回环,就需要判断 C N 2 C_{N}^{2} CN2 那么多次。这是 O ( N 2 ) O(N^2) O(N2) 的复杂度,随着轨迹变长增长过快,在大多数实时系统中是不实用的。另一种朴素的方法是,随机抽取历史数据并进行回环检测,例如在 n n n 帧中随机抽 5 5 5 帧与当前帧进行比较。这种做法能够维持常数时间的运算量,但是这种盲目试探方法在帧数 N N N 增长时,抽到回环的概率又大幅下降,使得检测效率不高。
上面提到的两种朴素思路都过于粗糙,尽管随机检测在有些实现中确实有用,但是至少希望有一个“哪处可能出现回环”的预计,这样才不那么盲目地去检测。这样的方式大体有两种思路:基于里程计 (Odometry based) 的几何关系,或者基于外观的 (Appearance based) 几何关系
基于里程计的几何关系是说,当发现当前相机运动到之前的某个位置附近时,检测它们有没有回环关系(这虽然是一种直观的想法,但是由于有累积误差的存在,往往没法正确地发现“运动到了之前的位置附近”这件事实,回环检测也无从谈起。)因此,基于里程计的做法在逻辑上存在一点问题,因为回环检测的目标在于发现“相机回到之前位置”这件事实,从而消除累积误差。而基于里程计的几何关系的做法假设了"相机回到了之前位置附近",这样才能检测回环 这是有倒果为因的嫌疑的,因而无法在累积误差较大时工作。
另一种方法是基于外观的。它和前端、后端的估计都无关,仅根据两幅图像的相似性来确定回环检测关系。这种做法摆脱了累积误差,使回环检测模块成为了SLAM系统中一个相对独立的模块(当然前端可以为它提供特征点)。自21世纪初被提出以来,基于外观的回环检测方式能够有效地在不同场景下工作,称为视觉SLAM中主流的做法,并被应用到实际的系统中。
除此之外,从工程角度也能提出一些解决回环检测的方法。例如,在室外的无人车通常配备GPS,可以提供全局的位置信息。利用GPS信息可以很轻松地判断汽车是否回到某个经过的点,但这类方法在室内就不怎么好用。
在基于外观的回环检测算法中,核心问题是如何计算图像间的相似性。例如,对于图像 A A A 和图像 B B B ,要设计一种方法,计算它们之间的相似性评分: s ( A , B ) s(A,B) s(A,B)。当然,这个评分会在某个区间内取值,当它大于一定量后认为出现了一个回环。
那么怎样的函数能够很好地反映相似关系?从这里引出感知偏差(Perceptual Aliasing)和感知变异(Perceptual Variability)两个概念。

11.1.3 准确率和召回率

程序的判断和实际结果会出现如下四种情况:
视觉SLAM十四讲笔记-11-1_第2张图片
阴阳描述算法检测结果,真假描述结果是否正确。假阳性又称为感知偏差,假阴性又称为感知变异。
对于某种特定算法,统计它在某个数据集上的 T P TP TP T N TN TN F P FP FP F N FN FN 的出现次数,并计算两个统计量:准确率和召回率(Precision & Recall)。
P r e c i s i o n = T P ( T P + F P ) , R e c a l l = T P ( T P + F N ) Precision = \frac{TP}{(TP + FP)} , Recall = \frac{TP}{(TP + FN)} Precision=(TP+FP)TP,Recall=(TP+FN)TP
从公式字面意义上看,准确率描述的是算法提取的所有回环中确实是真实回环的概率。而召回率则是指,在所有真实回环中被正确检测出来的概率。为什么要提取这两个统计量尼?因为它们有一定的代表性,而且通常是一对矛盾。
一个算法往往有很多的设置参数。例如,在提高某个阈值时,算法可能变得更加“严格”—检测出更少的回环,使得准确率得以提高。同时,由于检出的数量变少了,许多原本是回环的地方就可能被漏掉,导致召回率下降。反之,如果选择更加宽松的配置,那么检出的回环数量将增加,得到更高的召回率,但其中可能混杂一些不是回环的情况,于是准确率下降。
为了评价算法的好坏,会测试在各种配置下的 P P P R R R 值,然后做 P r e c i s i o n − R e c a l l Precision-Recall PrecisionRecall 曲线。当用召回率作为横轴,准确率作为纵轴时,会关心整条曲线偏右下方的程度、 100 % 100 \% 100% 准确率下的召回率或者 50 % 50 \% 50% 召回率下的准确率,作为评价算法的指标。
值得一提的是,在SLAM中,对准确率的要求更高,而对召回率则相对宽容一些。因为准确率过低时会有很多是假阳性(检测结果是而实际上不是)回环将在后端的位姿图中添加根本错误的边,有些时候导致优化算法给出完全错误的结果。相比之下,召回率低一点也没事,顶多就是有部分的回环没有被检测到,地图可能会受一些累积误差的影响,然而仅仅需要一两次回环就可以完全消除它们了。所以在选择回环检测算法时,更倾向于把参数设置地更严格,或者在检测之后再加上回环验证的步骤。
视觉SLAM十四讲笔记-11-1_第3张图片

11.2 词袋模型

既然用两张图像像素之间进行比较的方法不够好,就需要一种更可靠的方式。结合前几讲的内容,一种思路是:为何不像视觉里程计那样使用特征点来做回环检测尼?和视觉里程计一样,对两幅图像的特征点进行匹配,只要匹配数量大于一定值,就认为出现了回环。根据特征点匹配,还能计算出这两幅图像之间的运动关系。但是这种方法存在一些问题。例如,特征的匹配比较费时、当光照变化时特征描述可能不稳定等。下面介绍词袋的做法,再来讨论数据结构之类的实现细节。
词袋,也就是 Bag-of-Words(BoW),目的是用“图像上有哪几种特征”来描述一幅图像。例如,可以说某张照片中有一个人、一辆车;而另一张中有两个人、一个狗。根据这样的描述,就可以度量这两幅图像的相似性。再具体一些,要做以下三步:
1.确定“人”、“车”、“狗”等概念—对应于 BoW 中的“单词”(Word),许多单词放在一起,组成了“字典”(Dictionary);
2.确定一幅图像中出现了哪些在字典中定义的概念—用单词出现的情况(或直方图)描述整幅图像。这就把一幅图像转换成了一个向量的描述。
3.比较上一步中的描述的相似程度。
以上面举的例子来说,首先通过某种方式得到了一本“字典”。字典上记录了许多单词,每个单词都有一定的意义,例如“人”、“车”、“狗”都是记录在字典中的单词,不妨记为 w 1 w_1 w1 w 2 w_2 w2 w 3 w_3 w3。然后,对于任意图像 A A A,根据它们含有的单词,可记为:
A = 1. w 1 + 1. w 2 + 0. w 3 A = 1 . w_1 + 1 . w_2 + 0 . w_3 A=1.w1+1.w2+0.w3
字典是固定的,所有只要用 [ 1 , 0 , 0 ] T [1,0,0]^T [1,0,0]T这个向量就可以表达 A A A 的意义。通过字典和单词,只需一个向量就可以描述整幅图像。该向量描述的是“图像是否含有某类特征”的信息,比单纯的灰度值更稳定。又因为描述向量说的是“是否出现”,而不管“在哪儿出现”,所以与物体的空间位置和排列顺序无关,因此在相机发生少量运动时,只要物体仍在视野中出现,就仍然保证描述向量不发生变化。基于这种特性,称它为 Bag-of-Words 而不是什么 LIst-of-Words,强调的是 Words 的有无,而无关其顺序。因此可以说字典类似于单词的一个集合。
回到上面的例子,同理,用 [ 2 , 0 , 1 ] T [2,0,1]^T [2,0,1]T 可以描述图像 B B B。如果只考虑 “是否出现” 而不考虑数量,也可以是 [ 1 , 0 , 1 ] T [1,0,1]^T [1,0,1]T,这时候这个向量就是二维的。于是,根据这两个向量,设计一定的计算公式,就能确定图像间的相似性。当然,对两个向量求差仍然有一些不同的做法,例如对于 a , b ∈ R W a,b \in R^W a,bRW,可以计算:
s ( a , b ) = 1 − 1 W ∥ a − b ∥ 1 s(a,b) = 1 - \frac{1}{W} \left \| a-b \right \| _1 s(a,b)=1W1ab1
其中范式取 L 1 L_1 L1 范数,即各元素绝对值之和。请注意在两个向量完全一样时,就得到了 1;完全相反时( a a a 为 0 的地方 b b b 为 1)得到0。这样就定义了两个描述描述了向量的相似性,也就定义了图像之间的相似程度。
接下来的问题是什么尼?
1.虽然清楚了字典的定义方式,但它到底是怎么来的尼?
2.如果能够计算两幅图像间的相似程度评分,是否就足够判断回环了尼?

你可能感兴趣的:(视觉slam十四讲笔记,经验分享)