视觉SLAM-回环检测

这是课上做的一个pre,大家可以看看帮助理解,有问题或者写的不对的可以提出。

目录

前言

一、SLAM 问题(SLAM Problem)

         二、回环检测(Loop Closing)

         三、为什么要回环检测(Why Loop Closing)

四、回环检测方法(Loop Closing Method)

五、词袋模型Bag-of-Words ( BoW )

六、字典(Dictionary)

七、相似度计算(Similarity Calculation)

八、准确率和回召率(PrecisionRate and Recall Rate)

九、验证(Verification after detection)

 总结

Reference


前言

视觉SLAM越来越受到关注,本文介绍关于视觉SLAM中回环检测部分的内容。

主要参考:《视觉SLAM十四讲从理论到实践  第2版》


一、SLAM 问题(SLAM Problem)

SLAM的英文全称是Simultaneous Localization and Mapping,也就是同时定位与建图,从字面上来看就是同时解决定位和地图构建问题。

这里的定位的问题,指的是我放置的这个机器人他现在在哪。

建图是指周围的地图是什么样的,他要能感知出周围的是什么样的环境。

输入是机器人的控制信息(比如说我这个机器人的轮子转了多少度,往前走了多少米),和机器人观测到的信息(机器人看到了什么)

我们需要得到的是机器人走过的轨迹,还有周围的环境是怎么样的地图。

SLAM问题定义:机器人从未知环境未知地点出发,通过传感器(这里主要说的是相机)观测环境获取信息,利用相机的信息估算机器人的位置、姿态和运动轨迹,并且根据位姿构建地图,从而实现同时定位和建图。

二、回环检测(Loop Closing)

随着路径的不断延伸,机器人在建图过程中会存在一些累积误差。在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,当前帧解算下一帧。因此其中的误差便这样一帧一帧的传递下去,这样不断的累积误差也造成了我们所说的累积误差。这导致我们很难构造一个全局一致的轨迹和地图。

我们通常使用回环检测来优化位姿,解决这一问题。

回环检测定义:又称闭环检测,是指机器人识别曾到达某场景,使得地图闭环的能力。如果有了回环检测,机器人就会检测到自己曾经到过这个地方。这时候它可以利用这个信息把现在观测的图像和之前历史观测的图像(历史数据)做一个比对(因为在运行过程中可能产生偏差),这样就可以修正累积误差,得到全局一致的状态估计。

就比如图中的这个,自动驾驶项目会有一个建图阶段。需要自动驾驶车辆在某个区域绕若干圈来覆盖所有的采集范围。我们要保证,实际经过同一地点,估计轨迹也必经过同一地点。

其中(a)是真实的轨迹绕了若干圈,但是由于累积误差导致得到的位姿图(b)产生了偏差,这时候我们添加了回环检测,可以对偏差进行修正图(c)。

视觉SLAM-回环检测_第1张图片

 三、为什么要回环检测(Why Loop Closing)

重要性:有些时候,我们把仅有前端和局部后端的系统称为VO,把带有回环检测和全局后端的系统称为SLAM。说明回环检测还是非常重要的。

回环检测主要有2个作用:

1.关系到我们估计的轨迹和地图在长时间下的正确性。

2.由于回环检测提供了当前数据与所有历史数据的关联,在跟踪算法丢失之后,我们还可以利用回环检测进行重定位。

因为如果我们的数据,只有相邻的关键帧很容易产生误差累积。但是回环检测能够给出除了相邻帧时隔更久的约束。之所以它们之间会有约束,是因为我们察觉到相机经过了同一个地方, 能够采集到了相似的数据。而回环检测的关键,就是如何有效地检测出相机经过同一个地方这件事。

四、回环检测方法(Loop Closing Method)

回环检测的关键,就是如何有效地检测出相机经过同一个地方这件事,也就是怎么判断相机拍到的两幅图是相似的有关联的。

我们可以想到2种朴素的方法:

1.我们可以选择任意2张图做特征匹配,来判断那两幅图是有关联的,但是这样需要检测的数量实在太大了。

2.我们也可以随机抽取历史数据并进行回环检测,也就是选择在n帧历史数据中随机抽几帧和当前帧匹配。这样检测的数量会更少。但是这样会有个问题,在n非常大时,能够真正抽到回环的概率就非常小。

为了不盲目地检测,我们希望有一个关于“哪处可能会出现回环”的预估计。

对于这个我们也有两个思路:有基于里程计几何关系和基于外观几何关系。

1.基于里程计几何关系是说,当我们发现当前相机运动到了之前的某个位置时,检测它们有没有回环关系。但是由于误差积累的存在,我们往往没办法正确发现“运动到了之前的某个位置附近”这个事实。(而且回环检测的目标在于发现“相机回到之前位置”的事实,从而消除累积误差。这有倒果为因的嫌疑,并且在误差大时没办法工作的。)

2.基于外观的方法是一个主流做法,它和前端、后端的估计都无关,仅根据俩副图像的相似性确定回环检测关系,这种做法摆脱了积累误差,使回环检测模块成为SLAM一个相对独立的模块。

这么说基于外观的方法是可行的,那如何计算两幅图之间的相似性呢?

五、词袋模型Bag-of-Words ( BoW )

有一种方法叫词袋模型,Bag-of-Words,目的是用“图像上有哪几种特征”来描述一幅图像。比如说,这张图上有两个人、三辆车、一只狗、一棵树。

视觉SLAM-回环检测_第2张图片

我们可以以这样的方式来度量:

人、车、狗、树作为模型中的词——words。

多个单词放在一起就是字典——dictionary。

我们可以用单词出现的情况,也可以说是一个直方图来描述这幅图是出现了什么内容。

比较上述说的相似度。

比如,刚刚讲到的就可以用这样的向量来描述这幅图,{2,3,1,1}.

合理性:这个方法描述的是“是否出现”而不是“哪里出现”,这样相机出现少量的运动,也能保证物体在视野范围之内。

根据两幅图的向量,设计不同的计算方式,就可以用来描述这个相似性了。

六、字典(Dictionary)

我们了解了字典的定义方式,那我们字典是怎么来的呢?我们刚刚了解到了,字典由单词组成,每个单词代表着一个概念。

一个单词不是一个单独的特征点,而是一类特征的组合,所以词典的生成类似于聚类问题。聚类问题在无监督学习中特别常见,用于机器自行寻找数据中的规律。

我们假设从大量的图像提取N个特征点,想找一个有k个单词的词典,也就是N个数据归为k类。我们可以用k-means(k均值)算法解决。

算法步骤如下:

视觉SLAM-回环检测_第3张图片这里可以参考一下这个视频:

【五分钟机器学习】物以类聚的Kmeans_哔哩哔哩_bilibili

这时候就有了一个k个单词的字典,但是还需要根据图像中的某个特征找到对应的单词。

我们用k叉树来表达字典。

假定我们有N个特征点,构建一个深度为d、每次分叉为k的树的步骤是:

1.在根节点上,用K-means把所有样本聚成k类(实际为保证聚类均匀性会使用k-means++),这样得到了第一层。

2.对于第一层的每个节点,把属于该节点的样本再聚类k类,得到下一层。

3.以此类推,最后得到叶子层。叶子层即所谓的Words。

我们仍在叶子结点构建了单词。优点:一方面,这样一个k分支,深度为d的树,可以容纳 k^d个单词。另一方面,在查找某个特征对应的单词时,只需要将它与每个中间节点的聚类中心比较(一共d次),即可找到最后的单词。

视觉SLAM-回环检测_第4张图片

七、相似度计算(Similarity Calculation)

接下来讨论相似度计算的问题。

我们还需要对单词的区分性和重要性做一个评估。就比如说一个句子中的:“的”、“是”、“也”和“足球”、“车”、“文档”,这些词能够提供的信息效果是不同的。

假设我们需要判断某一篇文章是不是医学类的,我们看到“药物”、“临床”这类单词应该会更重要。

这里,我们提供一种方法叫TF-IDE,是文档检索中常用的加权方式。其中,TF的思想是:某单词在一副图像中经常出现,它的区分度就越高。IDF的思想是,某单词在字典中出现的频率越低,则分类图像时的区分度越高。

1.IDF是某单词在字典中出现的频率。某个单词的IDF为:

视觉SLAM-回环检测_第5张图片

n是所有的特征数量,ni是某个单词(叶子节点)的特征数量

 2.TF部分则是指某个特征在单幅图像中出现的频率。

假设图像A中单词出现了ni次,而所有出现的单词次数为nF为

视觉SLAM-回环检测_第6张图片

3.这个叶子节点(单词)的权重为:

4.考虑完权重以后,对于某幅图像A,它的特征点可以对应到许多单词,组成它的BoW:

5.考虑它们的相似性评分:

视觉SLAM-回环检测_第7张图片

八、准确率和回召率(PrecisionRate and Recall Rate)

刚刚我们用词袋模型作为一种方法,有人可能会提出疑问。既然两张图片都是矩阵为什么不直接相减取范数呢?原因是,因为光照、相机曝光、相机角度的影响都可能影响到这个矩阵,所以是不可行的。

一般我们是怎么评判这个相似函数是好或者不好呢?这时候就引出准确率和回召率的概念。

当两幅图像从同一个地方拍摄,那回环检测算法应该要给出:这是回环。如果不是同一个地方拍摄的,反之。

考虑到程序的判断和我们的判断并不是每次都是一致的,我们来看看回环检测的结果分类(因为可能存在算法的判断和我们实际看到的不一致,如假阳性和假阴性):

假阳性称为感知偏差,假阴性称为感知变异。

视觉SLAM-回环检测_第8张图片

为方便,则真阳性(True Positive)简称TP,假阳性称为(False Positive)简称FP,以此类推。

为了使算法的结果和我们判断的结果一致,所有的结果我们希望FP和FN尽可能要低。

我们可以根据TP,FP,FN,TN的出现次数来确定两个统计量,准确率和召回率。

准确率:Presicion=TP/(TP+FP) , 真阳性/(真阳性+假阳性),描述的是算法提取的所有回环中确实是真实回环的概率。

召回率:Recall=TP/(TP+FN), 真阳性/(真阳性+真阴性),在所有真实回环中被正确检测出来的概率。

为了评价算法的好坏,我们会测试它在各种配置下的P和R值,然后做Precision-Recall 曲线(如图所示)。

选它们是因为准确率和召回率是矛盾的,如果算法严格,那么检测出更少的回环,准确率就大,但是召回率因为漏掉真的回环就小,反之,算法不那么严格,准确率变小,召回率变大。我们也可以从图上看召回率高的时候,正确率也低了。

视觉SLAM-回环检测_第9张图片

一般而言,在SLAM中我们更倾向于提高算法的准确率,稍微牺牲召回率。因为如果出现假阳性(Presicion=TP/(TP+FP) ),就是算法判断是回环结果的实际不是回环,那么就会在导致完全错误的结果(这时候的回环检测像是在捣乱hh)。所以在选择回环算法时,倾向于将算法的参数设置的更严格,以提高准确率。

九、验证(Verification after detection)

词袋的回环检测只依赖于外观没有用到其他任何几何信息,并且只在乎单词有无而不是顺序。所以容易发生感知偏差。所以在回环检测之后,我们通常还会有一个验证步骤。

可以设立回环缓存机制,认为一段时间中一直检测到回环才是正确的回环。也可以设置空间上的一致性检测,即对回环检测到的两个真进行匹配并且估计相机运动。 之后把运动放到之前的位姿,检查和之前的估计是否有出入。

补充:词袋模型,本身是一种非监督的机器学习过程(基于树结构的聚类,数结构加速查找)。而回环检测本身是一个分类问题,只是这个分类问题是一种稠密的分类,分类类别近似于连续变量。


 总结

以上简单的介绍关于视觉SLAM中回环检测内容。

Reference

《视觉SLAM十四讲从理论到实践  第2版》

你可能感兴趣的:(SLAM,自动驾驶,计算机视觉,人工智能)