• 【视觉SLAM入门】8. 回环检测,词袋模型,字典,感知,召回,机器学习


    前言: 前端提取数据,后端优化数据,但误差会累计,需要回环检测构建全局一致的地图;

    1. 意义

    • 通俗的讲,机器人两次经过同一个场景,为了检测是同一个场景,这就是回环检测。它可以用来构建全局一致的地图。有了时隔更加久远的约束,一定程度消除累计飘移。形象的想弹簧,就是把原来已经优化好的,拉的更贴近真实位置。
    • 回环检测还可以做重定位,在跟踪丢失的时候。

    2. 做法

    以下是几种做法:

    • 取当前图像和历史所有图像一一进行特征提取并比对,通过匹配的数量确定。O( n 2 n^2 n2),缺点资源;
    • 还是上边的方法,但不一一匹配,随机抽取,可检测到的帧少很多;
    • 里程计配合给一个大致位置,这里的进行回环检测,缺点里程计自带误差,只能小范围;
    • 基于外观,主流,其中一种就是词袋模型。

    2.1 词袋模型和字典

    2.1.2 感知偏差和感知变异

    感知偏差(假阳性),感知变异(假阴性)

    在这里插入图片描述

    • 准确率(检测正确的数量 / 检测的总数量): P r e c i s i o n = T P / ( T P + F P ) Precision = TP/(TP+FP) Precision=TP/(TP+FP)

    • 召回率(实际检测出来的数量 / 理应检测出来的数量): R e c a l l = T P / ( T P + F N ) Recall = TP/(TP+FN) Recall=TP/(TP+FN)

    一般这两个数据呈矛盾,不取极端,只说在recall为多少,pre为多少时候效果最好,一般我们对P的要求更高。这是回环检测的严格性导致的。

    2.1.2 词袋

    • 字典实际就是对所有图片中的特征进行提取,比如"人","车"等,它们是单词,对全部图像特征提取所有单词(特征)后构成一个字典。
    • 词袋说的是一帧图像中,能够提取出来的单词。

    比如现在有一本4个特征的字典: D = [ x 1 , x 2 , x 3 , x 4 ] D = [x_1,x_2,x_3,x_4] D=[x1,x2,x3,x4]
    而我们有两个 x 1 x_1 x1 一个 x 3 x_3 x3 特征的图像,那用词袋可以记为:
    A = 2 ⋅ x 1 + 0 ⋅ x 2 + 1 ⋅ x 3 + 0 ⋅ x 4 A = 2\cdot x_1 + 0\cdot x_2 + 1\cdot x_3 + 0\cdot x_4 A=2x1+0x2+1x3+0x4
    它的向量就是
    A = [ 2 , 1 , 0 , 0 ] A = [2,1,0,0] A=[2,1,0,0]

    那么检测两个图像,则举例可以用

    s ( a , b ) = 1 − 1 W ∣ ∣ a − b ∣ ∣ 1 s(a,b) = 1 - \frac{1}{W}||a-b||_1 s(a,b)=1W1∣∣ab1

    L1范数,各元素绝对值之和,向量完全一样则得到1,是回环。

    2.1.3 字典

    字典里的单词是某一类特征的组合,类似于一个聚类问题,UML(无监督学习常见问题)。

    • 假设要做 k k k 个单词的字典,可以用K-means,K-means++等实现,这里以K-means(均值)为例:
      在这里插入图片描述

    字典规模大,要在字典中查找单词属于哪个,逐个查找复杂度 O ( n ) O(n) O(n),参考数据结构,这里有很多优化方法,这里以最简单的K叉树为例去优化字典结构:
    在这里插入图片描述
    又很像K-D树,聚类类中类,聚中聚哈哈。一棵深度为 d d d , 分支为 k k k 的树,可以容纳, k d k^d kd 单词。

    2.2 匹配(相似度)计算

    两个概念:

    • TF(Term Frequency)译频率: 某单词在一副图像中经常出现,它的区分度就高;
    • IDF(Inverse Document Frequency)逆文档频率: 某单词在字典中出现的频率低,它的区分度就高;
    1. 在做字典时候,用IDF,假设所有特征总数为 n n n, 当前要统计的单词特征 w i w_i wi 的数量为 n i n_i ni, 则此单词的IDF为:
      I D F i = l o g n n i IDF_i = log \frac{n}{n_i} IDFi=lognin

    2. 对一副图像而言,假设特征/单词 w i w_i wi 出现了 n i n_i ni 次,而这幅图一共出现的单词数量为 n n n,则TF为:
      T F i = n i n TF_i = \frac{n_i}{n} TFi=nni

    3. 基于以上知识,一个图像的特征点可以对应到很多单词,则它的词袋(BOW)为:
      A = ( w 1 , η 1 ) , ( w 2 , η 2 ) , . . . , ( w N , η N )    ⟺    v A A = {(w_1, \eta _1), (w_2, \eta _2), ... , (w_N, \eta _N)} \iff v_A A=(w1,η1),(w2,η2),...,(wN,ηN)vA
      词袋中有很多0值,因为它不能包含字典中所有词。

    4. 计算两图词袋的差异(匹配度),给出一种方式(一范数),还有很多:
      s ( v A − v B ) = 2 ∑ i = 1 N ∣ v A i ∣ + ∣ v B i ∣ − ∣ v A i − v B i ∣ s(v_A - v_B) = 2\sum^N_{i=1}|v_{Ai}| +|v_{Bi}|-|v_{Ai}-v_{Bi}| s(vAvB)=2i=1NvAi+vBivAivBi

    3. 提升

    对于回环检测,有几点可以提升的部分:

    1. 增加字典规模
    2. 相似性评分处理

    对于环境外观相似,比如教室同款椅子很多,利用先验的相似度(某时刻关键帧图像与上一时刻关键帧的相似性)进行归一化:
    s ( v t , v t j ) ′ = s ( v t , v t j ) / s ( v t , v t − Δ t ) s(v_t,v_{tj})' = s(v_t,v_{tj})/s(v_t,v_{t-\Delta t}) s(vt,vtj)=s(vt,vtj)/s(vt,vtΔt)

    1. 关键帧处理
    1. 相邻帧肯定满足回环检测条件,因为变化太小,所以回环检测的帧一般稀疏;
    2. 检测到的回环相邻帧意义不大,一帧就可以优化轨迹,因此会把相近的回环聚类成一类,使算法不会反复检测同一类。
    1. 验证

    词袋没有顺序,相机颠倒也是回环,如何验证?
    回环缓存机制是一种,单词检测到的回环不足以构成约束,在一段时间内一直检测到的回环才是正确的回环(时间上的一致性检测)

    1. 机器学习应用于类别

    图像连续变化产生不同类别,甚至可以认为是连续的;
    图像间相似性可以利用深度学习方法;
    词袋方法的物体识别能力不如神经网络,回环检测类似。

  • 相关阅读:
    创建一个窗口使用鼠标点击进行画矩形,函数:namedWindow,setMouseCallback
    神经网络建模的基本思想,神经网络语言模型详解
    k8s部署针对外部服务器的prometheus服务
    Bootstrap响应式轮播效果网页(1+X Web前端开发中级 例题)
    【LeetCode】541. 反转字符串 II
    032.Python面向对象_类&补充_描述器
    【C/C++】自定义类型 枚举&联合
    c++千万数据级别正确使用无锁队列,避免内存撕碎(一)
    Java程序员面试大厂95%会被问到的25个问题(附答案)
    最新idea把run放到services中_超简单不坑人
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/132941429