《视觉SLAM十四讲》-- 回环检测

news2024/11/18 13:59:26

文章目录

    • 10 回环检测
      • 10.1 概述
        • 10.1.1 回环检测的意义
        • 10.1.2 回环检测的方法
        • 10.1.3 准确率和召回率
      • 10.2 词袋模型
      • 10.3 字典
        • 10.3.1 字典的结构
        • 10.3.2 实践:创建字典
      • 10.4 相似度计算
        • 10.4.1 理论部分
        • 10.4.2 实践:相似度的计算
      • 10.5 实验分析与评述

10 回环检测

10.1 概述

10.1.1 回环检测的意义

前端提供特征点的提取和轨迹、地图的初值,后端负责数据的优化。但是如果像视觉里程计那样只考虑相邻时间上的关键帧,则会出现累积误差,无法构建全局一致的轨迹和地图。

在这里插入图片描述

回环检测的关键是 有效地检测出相机经过同一个地方 这件事。

10.1.2 回环检测的方法

(1)大体有两种思路:基于里程计的几何关系和基于外观的几何关系。

(2)在基于外观的回环检测中,核心问题是 如何计算图像间的相似性

10.1.3 准确率和召回率
算法/事实是回环不是回环
是回环真阳性(TP)假阳性(FP)
不是回环假阴性(FN)真阴性(TN)

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

定义准确率和召回率:

 Precision  = T P / ( T P + F P ) ,  Recall  = T P / ( T P + F N ) (10-1) \text { Precision }=\mathrm{TP} /(\mathrm{TP}+\mathrm{FP}), \quad \text { Recall }=\mathrm{TP} /(\mathrm{TP}+\mathrm{FN}) \tag{10-1}  Precision =TP/(TP+FP), Recall =TP/(TP+FN)(10-1)

准确率描述的是算法提取的所有回环中确实是真实回环的概率;而召回率是指在所有真实回环中被检测出来的概率。他们通常是一对矛盾。SLAM 中,我们对准确率的要求更高,而对召回率相对宽容一些。

10.2 词袋模型

词袋(Bag-of-Words, BoW)用 图像上有哪几种特征 来描述图像。例如图像上有一只狗、一辆车等等。具体有以下三步:

  • 确定 “人”、“狗”、“车”等概念——对应于 BoW 中的单词,许多单词构成字典;

  • 确定图像中出现了哪些字典中定义了的概念——用单词出现的情况(或直方图)来描述整幅图像,这样就把图像转换成了一个向量的描述;

  • 比较两幅图像描述的相似程度。

根据各类特征出现的次数,可将该图像表示为 [ w 1 , w 2 , . . . , w n ] T [w_1,w_2,...,w_n]^{\mathrm{T}} [w1,w2,...,wn]T;如果仅考虑特征是否出现,也可以只用 0、1 组成的向量表示。

假设两幅图像的描述向量分别为 a \boldsymbol{a} a b \boldsymbol{b} b,则其相似度表示为

s ( a , b ) = 1 − 1 W ∥ a − b ∥ 1 (10-1) s(\boldsymbol{a},\boldsymbol{b})=1-\frac{1}{W}\|\boldsymbol{a}-\boldsymbol{b}\|_1 \tag{10-1} s(a,b)=1W1ab1(10-1)

其中, W W W 为总的单词数量;范数为 L 1 L_1 L1 范数,即各元素绝对值之和。那么,当两个向量相同时,得到 1,而两个向量完全相反时,值为 0。

10.3 字典

10.3.1 字典的结构

一个单词和一个单独的特征点不同,它是某一类特征的组合,所以字典生成问题类似 聚类 问题。

(1)假设我们对大量的图像提取了特征点,例如有 N N N 个,希望构建一个有 k k k 个单词的字典,每个单词可以看做局部相邻特征点的集合,可以用 K-means 算法聚类,步骤如下:

① 随机选取 k k k 个中心点: c 1 , c 2 , . . . , c k c_1,c_2,...,c_k c1,c2,...,ck;

② 对每一个样本,计算它与每个中心点之间的距离,取最小的作为它的归类;

③ 重新计算每个类的中心点;

④ 如果每个中心点都变化很小,则算法收敛,退出;否则返回第二步。

(2)实践中,我们通常会构建一个很大的字典,这时,各个单词之间的比较就会变得很麻烦和低效。于是,提出采用 k k k 叉树来表达字典,类似于层次聚类,是 K-means 算法的直接扩展。假设有 N N N 个特征点,希望构建一个深度为 d d d 、每次分叉为 k k k 的树,步骤如下:

① 在根节点,用 K-means 把所有样本聚成 k k k 类(实际中为保证聚类均匀性会使用 K-means++ 算法),这样得到第一层;

② 对第一层的每个节点,把属于该节点的样本再次聚成 k k k 类,得到下一层;

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

在这里插入图片描述

最终我们在叶子层构建了单词,而树结构中的中间节点仅供快速查找时使用。这样一个深度为 d d d 、分叉为 k k k 的树,可以容纳 k d k^d kd 个单词。在查找某个给定特征对应的单词时,只需将它与每个中间节点的聚类中心比较(一共 k k k 次),即可找到最后的单词,保证了对数级别的查找效率。

10.3.2 实践:创建字典

10.4 相似度计算

10.4.1 理论部分

有一些 Word 很常见,另一些则很罕见,因此有必要对单词的区分度或重要性加以评估。采用 TF-IDF(译频率-逆文档频率)进行加权,TF 部分的思想是,某单词在一幅图像中经常出现,它的区分度就高;IDF 部分的思想是,某单词在字典中出现的频率越低,则区分度越高。

  • TF 部分需要对图像的特征进行计算,它是指某个单词在单幅图像中出现的频率:假设图像 A A A 中单词 w i w_i wi 出现了 n i n_i ni 次,而该图像中所有单词出现的次数总和为 n n n,则

T F i = n i n (10-2) \mathrm{TF}_i=\frac{n_i}{n} \tag{10-2} TFi=nni(10-2)

  • IDF 部分可在字典训练过程中进行计算,它是指某个叶子节点 w i w_i wi 总的特征数量相对于所有特征数量的比例:假设有两幅图像,所有特征数量为 n n n,其中 w i w_i wi 特征数量为 n i n_i ni,则

I D F i = ln ⁡ n n i (10-3) \mathrm{IDF}_i=\ln {\frac{n}{n_i}} \tag{10-3} IDFi=lnnin(10-3)

T F i \mathrm{TF}_i TFi I D F i \mathrm{IDF}_i IDFi 越大,单词的区分度越高。定义 w i w_i wi 的权重为

η i = T F i × I D F i (10-4) \eta_i=\mathrm{TF}_i \times \mathrm{IDF}_i \tag{10-4} ηi=TFi×IDFi(10-4)

那么,对于某幅图像 A A A ,组成它的 BoW 向量为:

A = [ ( w 1 , η 1 ) , ( w 2 , η 2 ) , … , ( w N , η N ) ] =  def  v A (10-5) A=\left[\left(w_{1}, \eta_{1}\right),\left(w_{2}, \eta_{2}\right), \ldots,\left(w_{N}, \eta_{N}\right)\right] \stackrel{\text { def }}{=} \boldsymbol{v}_{A} \tag{10-5} A=[(w1,η1),(w2,η2),,(wN,ηN)]= def vA(10-5)

其中 w i w_i wi 为每个单词的索引, η i \eta_i ηi 为对应的权重,两幅图像的相似度评分公式可以为:

s ( v A − v B ) = 2 ∑ i = 1 N ( ∣ v A i ∣ + ∣ v B i ∣ − ∣ v A i − v B i ∣ ) (10-6) s(\boldsymbol{v}_A-\boldsymbol{v}_B)=2\sum_{i=1}^{N}(|\boldsymbol{v}_{Ai}|+|\boldsymbol{v}_{Bi}|-|\boldsymbol{v}_{Ai}-\boldsymbol{v}_{Bi}|) \tag{10-6} s(vAvB)=2i=1N(vAi+vBivAivBi)(10-6)

这里是 L 1 L_1 L1 范数,也就是各元素的绝对值。

10.4.2 实践:相似度的计算

10.5 实验分析与评述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java(二)(String的常见方法,ArrayList的常见方法)

String 创建string对象 package Helloworld;public class dome1 {public static void main(String[] args) {// 1.直接双引号得到字符串对象,封装字符串对象String name "lihao";System.out.println(name);// 2. new String 创建字符串对象,并调用构造器初始化字符…

html综合笔记:设计实验室主页

1 主页来源及效果 Overview - Lab Website Template docs (gitbook.io) greenelab/lab-website-template: An easy-to-use, flexible website template for labs (github.com) 2 创建网页 3 主要的一些file 3.1 index.md 主页面 3.1.1 intro 3.1.2 highlight …

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

文章目录 PreOverview状态变量概述Position 访问方法 Pre 庖丁解牛:NIO核心概念与机制详解 01 接下来我们来看下缓冲区内部细节 Overview 接下来将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor) 状态变量是"内部统计机制&quo…

【汇编】处理字符问题

文章目录 前言一、处理字符问题1.1 汇编语言如何处理字符1.2 asciiascii码是什么?ascii码表是什么? 1.3 汇编语言字符示例代码 二、大小写转换2.1 问题:对datasg中的字符串2.2 逻辑与和逻辑或2.3 程序:解决大小写转换的问题一个新…

我终于体会到了:代码竟然不可以运行,为什么呢?代码竟然可以运行,为什么呢?

废话不多说,直接上图 初看只当是段子,再看已是段中人 事情经过: 我在写动态顺序表的尾插函数时,写出了如下代码,可以跑,但是这段代码有一个bug暂时先不提 //动态顺序表的尾插 void SLPushBack(SL* psl, …

python中列表的基础解释

列表: 一种可以存放多种类型数据的数据结构 列表的创建: 1.用【】创建列表 #创建一个空列表 list1[] #创建一个非空列表 list2 [zhang,li,ying,1,2,3] #输出内容及类型 print(list1,type(list1)) print(list2,type(list2))结果: 2.使用list…

详细步骤记录:持续集成Jenkins自动化部署一个Maven项目

Jenkins自动化部署 提示:本教程基于CentOS Linux 7系统下进行 Jenkins的安装 1. 下载安装jdk11 官网下载地址:https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.g…

Linux中系统时间同步

在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间&#x…

开发知识点-uniapp微信小程序-开发指南

uniapp uni.chooseLocationgetCurrentPages美团外卖微信小程序开发uniapp-美团外卖微信小程序开发P1 成果展示P2外卖小程序后端,学习给小程序写http接口P3 主界面配置P4 首页组件拆分P13 外卖列表布局筛选组件商家 布局测试数据创建样式 请求商家外卖数据封装请求并…

汇编-指针

一个变量如果包含的是另一个变量的地址, 则该变量就称为指针(pointer) 。指针是操作数组和数据结构的极好工具,因为它包含的地址在运行时是可以修改的。 .data arrayB byte 10h, 20h, 30h, 40h ptrB dword arrayB ptrB1 dword OFFSET arrayBarray…

4.6每日一题(多元函数的隐函数求导)

三元方程确定的二元函数类型的隐函数 方法一:两边对x求偏导,把y看成常数 注:z可以把x和y同时代入求出答案 方法二:带公式

数据结构【DS】栈

共享栈 共享栈的目的是什么? 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为? 存取数据时间复杂度为O(1) 共享栈如何判空?如何判满? 两个栈的栈顶指针都指向栈顶元素,𝑡𝑜𝑝…

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…

Java 11及更高版本的Oracle JDK版本

2021 年 9 月 14 日,Oracle 发布了可以长期支持的 JDK17 版本,那么从 JDK11 到 JDK17,到底带来了哪些特性呢?亚毫秒级的 ZGC 效果到底怎么样呢?值得我们升级吗?而且升级过程会遇到哪些问题呢?带…

PHP字符串函数的解析

在PHP中,字符串是一种常见的数据类型,用于存储和操作文本数据。PHP提供了丰富的字符串函数,用于执行各种字符串操作,包括截取、连接、替换、搜索等。在这篇文章中,我们将深入解析一些常用的PHP字符串函数,以…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 首先登录商户号:https://pay.weixin.qq.com/index.php/core/home/lo…

数据结构及八种常用数据结构简介

data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。 常用的数据结构有 数组(array)、栈&…

debian10 开启rdp安装firefox,firefox 中文乱码

debian10 开启rdp安装firefox apt -y install tigervnc-standalone-server apt -y install xrdp tigervnc-standalone-server systemctl enable xrdpapt install firefox-esrmstsc连接 firefox-settings-general-fonts-advanced-Simplified Chinese