DBoW3 视觉词袋模型、视觉字典、图像数据库的分析
Taylor Guo, 2017 年 1 月 11 日 @ EJU 上海
目录
服务号二维码
DBoW3 视觉词袋模型、视觉字典、图像数据库的分析 ............................................................................. 1
前言 ................................................................................................................................................................. 1
1 DBoW3 库介绍 ...................................................................................................................................... 2
2 视觉字典和图像数据库构建原理 ......................................................................................................... 3
3 K-Means++聚类算法 ......................................................................................................................... 9
4 DBoW3 库 k-means++算法代码实现 .......................................................................................... 13
5 DBoW3 库中类说明 ........................................................................................................................... 19
参考文献 ....................................................................................................................................................... 24
前言
图像数据库、视觉字典和视觉词袋向量是 SLAM、计算机视觉、3D 物体识别和卷积神经网络
图像处理的重要基础工具。所谓“万丈高楼平地起”,在深刻理解这些基本工具的基础上,根据开
源项目构建自己的工程就可以做到游刃有余了。在工程实践中,开源代码往往不能满足业务需求,
1
而对计算机视觉的应用,直接上来裁剪代码是一件非常困难的事情。本文的初衷是用最浅显易懂的
语言,帮助大家理解并不那么普及的技术,更重要是能够根据这些原理快速构建代码和应用。
无奈,本文作者码力有限,若要对算法上手即来,直接形成代码还是一件非常困难的事情。编
写代码的实践性非常强,大量的工程实践才是光明大道。纸上得来终觉浅,绝知此事要躬行。
1 DBoW3 库介绍
DBoW3 是 DBoW2 的增强版,这是一个开源的 C++库,用于给图像特征排序,并将图像转化
成视觉词袋进行表示。它采用层级树状结构,将相近的图像特征在物理存储上聚集在一起,创建一
个视觉词典。DBoW3 还生成一个图像数据库,带有顺序索引和逆序索引,可以使图像特征的检索
和对比非常快。
DBoW3 与 DBoW2 的主要差别:
o DBoW3 依赖项只有 OpenCV,DBoW2 依赖项 DLIB 被移除;
o DBoW3 可以直接使用二值和浮点特征描述子,不需要再为这些特征描述子重写新类;
o DBoW3 可以在 Linux 和 Windows 下编译;
o 为了优化执行速度,重写了部分代码(特征操作都写入类 DescManip);DBoW3 的接口也
被简化了;
o 可以使用二进制视觉词典文件;二进制文件在加载和保存上比.yml 文件快 4-5 倍;而且,二
进制文件还能被压缩;
o 仍然和 DBoW2 yml 文件兼容。
2
图像数据库的主要组成:
o 视觉字典树
o 顺序索引
o 逆序索引
对应的 DBoW3 库有两个主要的类:Vocabulary 和 Database。视觉词典将图像转化成视觉词
袋向量,图像数据库对图像进行索引。
ORB-SLAM2 中的 ORB Vocabulary 保存在文件 orbvoc.dbow3 中,二进制文件在 Github
上:
https://github.com/raulmur/ORB_SLAM2/tree/master/Vocabulary
2 视觉字典和图像数据库构建原理
为了表示一幅图像,可以将图像看作若干个“视觉单词”的集合,视觉单词相互之间没有顺序。
如下图所示:
从图像中提取出相互独立的视觉单词,这通常需要经过三个步骤:
(1)特征检测
(2)特征表示
(3)视觉字典的生成
请看下图,从图像中提取出相互独立的视觉单词:
3
同一类目标图像的不同实例之间虽然存在差异,但仍然可以找到它们之间共同的地方,比如说人脸,虽然不同人的脸差别比较
大,但眼睛,嘴,鼻子等一些比较细小的部位,却差别不大,可以把这些不同实例之间共同部位提取出来,作为识别这一类目标的视
觉单词。
SIFT 算法是提取图像中局部不变特征的应用最广泛的算法,因此可以用 SIFT 算法从图像中提取不变特征点,作为视觉单词,
并构造字典,用字典中的单词表示一幅图像。
词袋模型构造三步骤:
将上述图像表示成数值向量,假设有上述三个目标类,分别是人脸、自行车和吉他。
o 第一步是利用 SIFT 算法,从每类图像中提取视觉词汇,将所有的视觉词汇集合在一起,如下图 3 所示:
o 第二步是利用 K-Means 算法构造视觉字典。K-Means 算法是一种基于样本间相似性度量的聚类方法,此算法以 K 为参
数,把 N 个对象分为 K 个簇,以使簇内具有较高的相似度,而簇间相似度较低。SIFT 提取的视觉词汇向量之间根据距离的
远近,可以利用 K-Means 算法将词义相近的单词合并,作为视觉字典中的基础单词。
o 第三步是利用视觉字典中的单词表示图像。利用 SIFT 算法,可以从每幅图像中提取很多个特征点,这些特征点都可以用视
觉字典中的单词近似代替,通过统计视觉字典中每个单词在图像中出现的次数,可以将图像表示成为一个聚类簇 K=4 维数
值向量。如下图例子中的每幅图像的直方图表示:
从人脸、自行车和吉他三个目标图像中提取出的不同视觉单词,而构造的视觉字典中,会把词义相近的视觉单词合并为同一
类,经过合并,字典中只包含了四个视觉单词,分别按索引值标记为 1,2,3,4。通过观察可以看到,它们分别属于自行车、人
4
脸、吉他、人脸类。统计这些单词在不同目标类中出现的次数可以得到每幅图像的直方图表示(假定存在误差,实际情况亦不外如
此):
人脸: [3,30,3,20]
自行车:[20,3,3,2]
吉他: [8,12,32,7]
其实这个过程非常简单,就是针对人脸、自行车和吉他这三个图像,抽取出相似的部分(或者词义相近的视觉单词合并为同一
类),构造一个词典,词典中包含 4 个视觉单词,即 Dictionary = {1:”自行车”, 2. “人脸”, 3. “吉他”, 4. “人脸类”},最终
人脸、自行车和吉他这三个文档皆可以用一个 4 维向量表示,最后根据三个文档相应部分出现的次数画成了上面对应的直方图。
逆序指针指向一个数据对<图像 It, 视觉词袋向量 vti>,可以快速获取图像上的视觉单词的权重。当新的图像 It 加入到图像数
据库中的时候,逆序指针就会更新,也方便在数据库中查找图像。逆序索引用于提取与给定图像相似的图像。这个结构用于存储视觉
单词,视觉单词组成视觉字典,视觉字典形成图像。检索图像、做比较操作时,就不会对比图像中相同的视觉单词,这对检索图像数
据库非常有用。顺序索引有效地获取图像间的云点匹配,加快图像确认中的几何特征检验。顺序指针可以方便地存储每幅图像的特
征。视觉字典中的节点是分层存储的,假如树一共有 L 层,从叶子开始为 0 层,即 L=0,到根结束,l=Lw。对于每幅图像 It,将 l
层的节点存储在顺序指针中,而 l 层的这些节点是图像 It 的视觉单词的父节点,局部特征 ftj 列表与每个节点关联。用顺序指针和词
袋模型树估算 BRIEF 向量描述子空间中的最邻近的节点。对于那些特征属于相同的单词或具有第 l 层相同父节点的单词,计算特征的
对应关系时,这些顺序指针可以加快几何验证过程。当获取一个将要匹配的候选特征时,几何验证非常必要,新图像加进数据库,顺
序指针就会更新。
权重计算 Weighting
单词在视觉字典和词袋向量中都有权重。
5
相似度度量 Scoring
如果是要对观测到的样品数据进行判别分类的问题,可以应用统计学中判别分析方法进行处理。判别分析方法主要有距离判
别、贝叶斯判别和典型判别等几种常用方法。通常我们所说的距离是欧式距离,即欧式空间中两点之间的距离。但在统计学多元分析
中,有时欧式距离不太合适。比如,某个数据点在两个正态分布中的距离。这样就会用到马哈拉诺比斯 Mahalanobis 距离,即马氏
距离。
在分类中的相似度度量有两种方法---距离和相似系数,距离用来度量样品之间的相似性,相似系数用来度量变量之间的相似
性。样品之间的距离和相似系数的定义不同,而这些定义与变量的类型有非常密切的关系。变量按照测量尺度的不同可以分为三类:
o 间隔尺度变量:变量是连续的量。如长度、速度、重量、温度等。
o 有序尺度变量:不明确的数量表示变量,而是用等级表示。如某产品分为一等品、二等品、三等品等有序关系。
o 名义尺度变量:变量用一些类表示,无等级或数量关系。如性别、职业等。
可以通过词典 Vocabulary 或查询图像数据库 Database 计算两个向量的相似度。有好几种方法可以计算相似度。相似度的值
的含义在于我们使用什么样的度量方式。然而,有些度量方法可以标准化到区间[0..1]中,0 表示没有匹配,1 表示完美匹配。如果需
要修改计算相似度的代码,也要注意词典 Vocabulary 和图像数据库 Database 的执行速度。
6
注意:为了计算效率,计算卡方距离的时候假定权重从来都不会为负数(使用 tf, idf, tf-idf 和 binary 向量的时候,总是这
样)。创建字典的时候,缺省使用 tf-idf 和 L1-范式。
7
图解视觉字典树的构建过程:
视觉字典树生成过程:
8