(01)ORB-SLAM2源码无死角解析-(30) ORB特征匹配→词袋BoW(bag of words):简介,优劣势分析

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件):
(01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196
 
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证
 

一、前言

在上一篇博客中,对两张图像特征匹配进行了讲解,但是其匹配的过程默认所有特征点权重都是一样的,但是现实生活中,有的关键点是十分常见的,也就是说其辨识度是比较底的,但是有的特征点是非常罕见的,也就是就该特征点辨识度高,更具独特性。那么就来说说为什么要通过词袋(BoW)进行特征匹配。

 

二、为什么研究BoW

闭环检测: 核心就是判断两张图片是否是同一个场景,也就是判断图像的相似性。
如何计算两张图的相似性?使用类帧差方法?
不行,这样做有很多问题,由于视角变换,没办法将两张图的像素进行一一匹配,直接帧差时几乎不能保证是同一个像素点的差。如以下几种情况:

视角变化
在这里插入图片描述
光照变化
在这里插入图片描述
曝光不同
在这里插入图片描述
那么Bag of words 可以解决这个问题。是以图像特征集合作为visual words,只关心图像中有没有这些 words,有多少次,更符合人类认知方式,对不同光照、视角变换、季节更替等非常鲁棒。

加速匹配 ORB-SLAM2代码中使用的 SearchByBoW(用于关键帧跟踪、重定位、闭环检测SIM3计算),以及局部地图里的SearchForTriangulation,内部实现主要是利用了 BoW中的FeatureVector 来加速特征匹配。

使用FeatureVector 避免了所有特征点的两两匹配,只比较同一个节点下的特征点,极大加速了匹配效率,至于匹配精度,论文 《Bags of Binary Words for Fast Place Recognition in Image Sequences 》中提到在26292 张图片里的 false positive 为0,说明精度是有保证的。实际应用中效果非常不错。

缺点: 需要提前加载离线训练好的词袋字典,增加了存储空间。但是带来的优势远大于劣势,而且也有不少改
进方法比如用二进制存储等来压缩词袋,减少存储空间,提升加载速度。
 

三、优势证明

速度方面: 因为计算和匹配都非常快,论文中说大概一个关键点计算256位的描述子只需要 17.3µs,因为都是二进制描述子,距离描述通过汉明距离,使用异或操作即可,速度非常快。而SIFT, SURF 描述子都是浮点型,需要计算欧式距离,会慢很多。在Intel Core i7 ,2.67GHz CPU上,使用FAST+BRIEF 特征,在26300帧图像中 特征提取+词袋位置识别耗时 22ms 每帧。

精度方面: 先上结论:闭环效果并不比SIFT, SURF之类的高精度特征点差。具体来看一下对比,以下对比来自论文《2012,Bags of Binary Words for Fast Place Recognition in Image Sequences,IEEE TRANSACTIONS ON ROBOTICS》。三种描述子 BRIEF,,SURF64 ,U-SURF128 使用同样的参数,在训练数据集NewCollege,Bicocca25b 上的 Precision-recall 曲线。其中
SURF64:带旋转不变性的 64 维描述子
U-SURF128:不带旋转不变性的128维描述子
在这里插入图片描述
在两个数据中,SURF64 都明显比 U-SURF128 表现的好(曲线下面积更大),可以看到在Bicocca25b
数据集上,BRIEF明显比 U-SURF128 好,比SURF64 也稍微好一些,在NewCollege 数据集上 SURF64
比 BRIEF 更好一点,但是BRIEF也仍然不错。总之,BRIEF 和 SURF64 效果基本相差不大,可以说打个平手。

可视化效果: 可视化看一下效果,下图左边图片对是BRIEF 在vocabulary 中同样的Word下的回环匹配结果,同样的特征连成了一条线。下图右边图像对是同样数据集中SURF64 的闭环匹配结果。
在这里插入图片描述
第一行:尽管有一定视角变换,BRIEF 和 SURF64 的匹配结果接近。
第二行:BRIEF成功进行了闭环,但是SURF64 没有闭环。原因是SURF64 没有得到足够多的匹配关系。
第三行:BRIEF 闭环失败而SURF64闭环成功。

我们分析一下原因:主要和近景远景有关。因为BRIEF相比SURF64没有尺度不变性,所以在尺度变换较大的近景很容易匹配失败,比如第三行。而在中景和远景,由于尺度变化不大,BRIEF 表现接近甚至优于SURF64。不过,我们通过图像金字塔可以解决上述BRIEF的尺度问题。论文中作者也提到了ORB + BRIEF的特征点
主要问题是没有旋转不变性和尺度不变性。不过目前都解决了。总之,BRIEF的闭环效果值得信赖!

 

四、vocabulary tree(也称为字典)

离线训练vocabulary tree(也称为字典): 首先图像提取ORB 特征点,将描述子通过 k-means 进行聚类,根据设定的树的分支数和深度,从叶子节点开始聚类一直到根节点,最后得到一个非常大的 vocabulary tree。

1、遍历所有的训练图像,对每幅图像提取ORB特征点。
2、设定vocabulary tree的分支数K和深度L。将特征点的每个描述子用 K-means聚类,变成 K个集合,作为vocabulary tree 的第1层级,然后对每个集合重复该聚类操作,就得到了vocabulary tree的第2层级,继续迭代最后得到满足条件的vocabulary tree,它的规模通常比较大,比如ORB-SLAM2使用的离线字典就有108万+ 个节点。
3、离根节点最远的一层节点称为叶子或者单词 Word。根据每个Word 在训练集中的相关程度给定一个权重weight,训练集里出现的次数越多,说明辨别力越差,给与的权重越低。

如下图所示,为构建好的词汇数,或者说字典(这里假设共5个层级):
在这里插入图片描述
由第一步提取出来的所有特征点(或者说描述子)都对应一个word(上图绿色的点,也称为叶子节点),然后通过聚类,生成 Level3 节点。上图的红色与绿色点都称为节点,Level0 节点称为根节点。节点的内容如下(节点的定义位于src/Thirdpaty/DBoW2/DBoW2/TemplatedVocabulary.h中的struct Node ):
在这里插入图片描述
可以看到其结构还是挺简单的。这里需要注意几个点,1.只有叶子节点(也就是绿点)才有 wordid ,word 权重,并且叶子节点是没有子节点的。2.叶子节点的描述子,为对应ORB特征点对应的 BRIEF 描述子。非叶子节点的描述子为其所有子节点描述子的平均值。

 

五、结语

通过该篇博客,了解了词袋BoW(bag of words) 基本概念,以及其离线训练与构建结构。以及 BoW 为什么使用 BRIEF 描述子。当然,这些都是理论的知识,接下来就是对代码的讲解了。
 
 
本文内容来自计算机视觉life ORB-SLAM2 课程课件

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值