slam14讲之第12讲--回环检测

讨论回环检测是什么,怎么做之前,我们来梳理一下整个过程。
前端->位姿估计->后端->优化位姿和路标点,回环问题引出:上一讲说过,在BA优化中,我们使用了整个位姿信息和空间点,通过观测方程来推导帧间像素差异来优化位姿,但是考虑这样一个问题,1、每次优化都能得到最优解吗?2、基于上一刻的位姿所做出的位姿优化真的是正确的位姿吗?显然,两者都会导致累积误差的出现,这导致位姿估计推导的理论路径与实际路径并不重合。slam14讲之第12讲--回环检测_第1张图片
而这主要是由于误差的一步步累计,于是,slam研究者提出:回环检测,通过发现检测点,通过实际位置与理论位置的差来消除累计误差。
那么回环检测的整个过程是什么,我们也来梳理一下:
找出检测点(相机经过同一个地方时)->怎么找出?关键帧之间进行对比。->怎么对比?计算相似度。->怎么计算相似度?通过相似度函数s(A,B)与词袋模型。->词袋模型是什么?这是个聚类问题。->神经网络行不行? 。通过整理,我们发现问题的关键是:词袋怎么求?怎么得相似度?

词袋模型

词袋模型就是一个字典,相信python玩家应该很熟悉。我们直接来介绍主流的一种生成这个字典的方法:K-means聚类法。这个方法会将特征点进行分类。理论思想是:如果A,B关键帧的特征点所属的类非常的相似,那么这个点就是一个回环点。
简单来说,当我们有 N 个数据,想要归成 k 个类,那么用 K-means 来做,主要有以下几个步骤:
slam14讲之第12讲--回环检测_第2张图片
这是理论方法,书中还提到了:树结构。来提升分类的速度,但这属于结构方面的东西,我还是主要介绍算法原理。

相似度计算

这里很相似于我们的目标检测神经网络,返回值是一个二值向量,凡是为1的地方,则表示这个图像具有这个类。

TF-IDF权重

我们知道同一个特征可能出现很多次,但是相似度计算返回值是一个二值的向量,没有办法有效的表示某一种特征出现的频次,这对相似度的最终估计显然是不利的,因为我们想要使用更加具有信息量的向量来表示图像。所以引入TF-IDF权重。
slam14讲之第12讲--回环检测_第3张图片
于是我们的向量变为:
在这里插入图片描述
考虑权重的引入,我们不再使用之前的L1范数的绝对值的方法
slam14讲之第12讲--回环检测_第4张图片
而是改用:
slam14讲之第12讲--回环检测_第5张图片
至此,帧间相似度的计算就结束了。

为了更好地得出回环点,我们还需要考虑一些问题:

  1. 大规模的字典,足以包含所有的这种环境下的特征
  2. 避免绝对的相似性阈值的引入,使得模型觉有更好地鲁棒性。
    我们会取一个先验相似度 s (vt; vt−∆t),它表示某时刻关键帧图像与上一时刻的关键帧的相似性。然后,其他的分值都参照这个值进行归一化:
    在这里插入图片描述
    站在这个角度上,我们说:如果当前帧与之前某关键帧的相似度,超过当前帧与上一个关键帧相似度的 3 倍,就认为可能存在回环。
  3. 缩小计算量,丢弃掉不必要的帧间相似度计算
    3.1 从实践上说,用于回环检测的帧最好是稀疏一些,彼此之间不太相同,又能涵盖整个环境。
    3.2 我们会把“相近”的回环聚成一类,使算法不要反复地检测同一类的回环。
  4. 对检出的回环再进行一次检测
    4.1 时间上的一致性检验:认为单次检测到的回环并不足以构成良好的约束,而在一段时间中一直检测到的回环,才认为是正确的回环。
    4.2 空间上的一致性检验:即是对回环检测到的两个帧进行特征匹配,估计相机的运动。然后,再把运动放到之前的 Pose Graph 中,检查与之前的估计是否有很大的出入。
  5. 机器学习+slam的未来可期

你可能感兴趣的:(SLAM,c++,聚类,算法,slam)