由于在ORB-SLAM2中扩展图像识别模块,因此总结一下BoW算法,并对DBoW2库做简单介绍。

1. BoW算法

  BoW算法即Bag of Words模型,是图像检索领域最常用的方法,也是基于内容的图像检索中最基础的算法。网络上有各种各样的原理分析,所以这里只是简单提一下。

  Bag of Words本是用于文本检索,后被引用与图像检索,和SIFT等出色的局部特征描述符共同使用(所以有时也叫Bag of Feature,BOF),表现出比暴力匹配效率更高的图像检索效果,它是直接使用K-means对局部描述符进行聚类,获得一定数量的视觉单词,然后量化再统计词频或TF-IDF加权之后的权重系数。

但是随着图像数据库的扩大,图像数据增加,所使用的码书规模也越来越大,K-means的效率就比较低了。为了改善大规模图像检索场景下的图像检索效果,有人提出了Vocabulary Tree(VT)算法,它是对BoW算法的一种改进算法,也就是我们现在常看见的分层量化的BoW算法。按照VT论文表述,这种算法不用进行图像表达向量的相似性计算,而是根据倒排文件系统进行打分,按照打分的高低进行排序,获得最相似的图像,至于怎么打分,这里就不多说了,从图上可以看出来。倒排文件存储就是每个叶子结点下有哪些对应的图像。

2. DBoW

  了解了上述两种算法之后再看DBoW算法就小菜一叠了,但是仍然有几个概念需要注意。DBoW2中计算图像之间相似度时仍然计算的是BoW向量之间的距离(根据描述子的不同可能选择Hamming距离或者余弦距离),而视觉单词分层的作用则引出了正向索引和反向索引的概念。

  反向索引即倒排文件系统,即每个叶子结点都有一个关联的文本文档,里面存储着当前节点的索引值和落在该节点下的图像索引值。反向索引的作用和倒排文档是一致的,加速图像的匹配过程,当query图像来时,只要和对应节点下图像计算相似性即可,这就大大缩小了待匹配图像的规模。

  正向索引,即中间层中每一节点下存储着该节点的索引值和对应的某一张图像的特征。正向索引可以加速特征之间的匹配,因为在图像检索的过程中,通常也是先经过BoW或者其他检索算法检索出最相似的N张图像,然后再通过特征匹配(暴力匹配)的方式确定最相似的一张或几张图像。使用正向索引时需要指定一个层数,即在与该层下的某个节点所包含的特征进行特征匹配,这同样也大大降低了特征匹配的规模,这种方法在ORB-SLAM中也用于特征匹配的加速,如跟踪时的关键帧模型等。

  BoW算法或DBoW库的一个缺点就是需要离线训练一个规模较大的码书(ORB-SLAM2中这个码书达到了一百三十多兆),感觉就像一个瘤子一样(...)。

3 总结

  下面会使用DBoW库训练自己的码书,并且在ORB-SLAM的基础上进行图像检索的任务,把AR部分融合进来。还有就是希望可以想想办法把这个“瘤子”去掉。

BoW算法及DBoW2库简介的更多相关文章

  1. BoW算法及DBoW2库简介(二)

    一.BoW算法 用OpenCV实现了最简单的BoW算法进行了一次小规模的图像检索任务,使用UKbench数据库,算法原理和网上的描述差不多,使用K-means算法进行聚类,这里使用KDTree算法进行 ...

  2. DBoW2库介绍

    DBoW2库是University of Zaragoza里的Lopez等人开发的开源软件库. 由于在SLAM回环检测上的优异表现(特别是ORB-SLAM2),DBoW2库受到了广大SLAM爱好者的关 ...

  3. BerkeleyDB库简介

    BerkeleyDB库简介 BerkeleyDB(简称为BDB)是一种以key-value为结构的嵌入式数据库引擎: 嵌入式:bdb提供了一系列应用程序接口(API),调用这些接口很简单,应用程序和b ...

  4. MXNet深度学习库简介

    MXNet深度学习库简介 摘要: MXNet是一个深度学习库, 支持C++, Python, R, Scala, Julia, Matlab以及JavaScript等语言; 支持命令和符号编程; 可以 ...

  5. Python3.x:第三方库简介

    Python3.x:第三方库简介 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...

  6. python学习--大数据与科学计算第三方库简介

    大数据与科学计算  库名称 简介 pycuda/opencl GPU高性能并发计算 Pandas python实现的类似R语言的数据统计.分析平台.基于NumPy和Matplotlib开发的,主要用于 ...

  7. LevelDB库简介

    LevelDB库简介 一.LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询 ...

  8. logging日志模块,hashlib hash算法相关的库,

    logging: 功能完善的日志模块 import logging #日志的级别 logging.debug("这是个调试信息")#级别10 #常规信息 logging.info( ...

  9. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)

    php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...

随机推荐

  1. django执行源生的mysql语句

    执行源生sql在python中我们可以借助pymysql模块来进行执行源生sql关于pymysql执行源生sql可以看我的另外一篇博文:pymysql应用 本篇博客只介绍django中执行的源生sql ...

  2. 算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  3. 对js的有感而发

    1.什么是JavaScript?他是一个脚本语言,也是一种解释性语言,也是一种弱类型语言.2,当我们学习JavaScript时我们肯定要知道,js的组成是什么? 应该怎么用?这些是最基础的.js的组成 ...

  4. 抓包工具之fiddler实战2-设置断点

    Fiddler作为抓工具包,功能强大,作为代理服务器,可以对抓获到的请求或响应进行修改,然后模拟客户端发送新的请求或模拟服务器返回修改后的响应结果. Fiddler中设置断点修改Request Fid ...

  5. Oracle - v$lock查询慢原因分析

    数据库内部对象X$统计信息过旧,导致v$lock查询慢 前段时间用python写了个zabbix监控脚本,里面有一个检查锁的sql语句,sql语句是这样子的select count(*) retval ...

  6. Spring5源码解析2-register方法注册配置类

    接上回已经讲完了this()方法,现在来看register(annotatedClasses);方法. // new AnnotationConfigApplicationContext(AppCon ...

  7. WPF自定义控件之图片控件 AsyncImage

    AsyncImage 是一个封装完善,使用简便,功能齐全的WPF图片控件,比直接使用Image相对来说更加方便,但它的内部仍然使用Image承载图像,只不过在其基础上进行了一次完善成熟的封装 Asyn ...

  8. python连接Oracle工具类

    上代码: # -*- coding:utf-8 -*- import cx_Oracle import pandas as pd class ORACLE(object): def __init__( ...

  9. java核心技术第三篇之JDBC第一篇

    01.JDBC_两个重要的概念: 1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库. 驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言:后 ...

  10. 1.java容器基本内容

    目录 java容器概述 1.collection接口 (1)collection接口方法 (2)set接口实现类 (3)list接口实现类 (4)queue接口实现类 2.map接口 java容器概述 ...