基于Bag of words模型的图像检索系统的设计与实现

论文代码:

https://download.csdn.net/download/qq_42233538/12498761

 

简介:

该系统将Bag of words 模型用于大批量图像检索,基于OpenCV C 语言库提取图像的SIFT 特征,然后使用Kmeans 算法进行聚类,再将其表示成 Bag of words 矢量并进行归一化,实现大批量图像检索,并用 caltech256 数据集进行实验。实验表明,该系统该系统采用的方法是有效的。

1 Bag of words模型概述

Bag of words 模型最初被用在文本分类中将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。

简单说就是将每篇文档都看成一个袋子(因为里边装的都是词汇,所以称为词袋,Bag of words 即由此来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描述乡村的文档,而不是描述城镇的。

与之类似,我们也可以将图像当成一些图像片段(image patch—本文中用SIFT 特征来描述)的集合。譬如构成一幅人脸图像的图像片段必定倾向于描述人的眼睛、鼻子、耳朵、嘴巴这些事物(我们称这些事物为视觉词汇)。

现在假设要使用Bag of words 模型从一批训练图像中检索出与测试图像最相似的图像,我们要做的工作主要都有哪些呢?

首先要对训练图像集进行预处理。包括图像增强、分割、图像同一格式、同一规格的处理等等。

其次提取图像的SIFT 特征。即将每一幅图像划分成很多个图像片段,每一个图像片段都用一个128 维的SIFT 描述子矢量来表示。

再次聚类生成视觉词,构建码本。一幅图像的码本是由两部分组成的,视觉词以及与其对应的 SIFT 描述子矢量的数目,即词频。假设码本包含k 个视觉词序列,将上步中所有的SIFT 描述子矢量用Kmeans 聚类生成k 个簇,最终这k 个簇中心即为码本的k 个视觉词。然后计算每幅图像中每个SIFT 描述子到这些视觉词的距离,若其距离某个视觉词最近,就将其映射到该视觉词,并将该视觉词对应的词频数增1。直至将所有的SIFT 描述子都映到码本中,将每幅图像都用一个与视觉词序列相对应的词频矢量来描述,这个词频矢量即为相似度检索时所要使用的图像的Bag of words 特征矢量,另外,由于每幅图像所包含的SIFT 矢量的数目是不确定的,还需要对Bag of words 特征矢量进行归一化。

最后计算图像距离相似度进行检索。测试图像也要经过预处理,提取SIFT 特征,生成码本矢量并进行归一化的过程,然后计算其与训练码本的距离,并将此距离相似度按升序排列。

2 图像特征提取

2.1 SIFT特征提取

SIFT 算法由D.G.Lowe 在1999 年[4]提出,并于2004 年完善总结。SIFT 算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量,从而使其对旋转、尺度缩放保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。

高斯卷积核是实现尺度变换的唯一线性核,于是一副二维图像 I(x,y) 的尺度空间定义:

(x,y) 是空间座标,反映像素的位置;σ 是尺度座标,决定图像的平滑程度。

为了在尺度空间检测到稳定的关键点,需要计算高斯差分尺度空间(DOG scale-space):

DOG 算子计算简单,是尺度归一化的LOG 算子的近似。

在检测极值时,需要跟其周围邻域同一尺度的8 个像素和相邻尺度对应位置的9×2 个像素进行比较,以确保在尺度空间和二维图像空间都检测到局部极值。

关键点的方向参数是利用关键点邻域像素的梯度方向分布特性为其指定的。以关键点为中心在其邻域窗口内采样,并用直方图统计邻域像素的梯度方向,直方图的峰值就作为该关键点的主方向。如图1,图2 所示。

         

图1 关键点主方向示意图                        图2 一幅测试图像

特征描述子生成时,选取以特征点为中心的16*16 邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8 个bin 的方向直方图,最后获得4*4*8(128 维)的特征描述子。

2.2 Bag of words特征表示

SIFT 特征虽然也能描述一幅图像,但是每个SIFT 矢量都是128 维的,而且一幅图像通常都包含成百上千个SIFT 矢量,在进行相似度计算时,这个计算量是非常大的,通行的做法是用聚类算法对这些矢量数据进行聚类,然后用聚类中的一个簇代表Bag of words中的一个视觉词,将同一幅图像的SIFT 矢量映射到视觉词序列生成码本,这样每一幅图像就只用一个码本矢量来描述,这样计算相似度时效率就大大提高了。

Kmeans 算法是数据挖掘技术中基于分裂法的一个经典的聚类算法,因其理论可靠、算法简单、收敛速度快而被广泛应用。

该算法采用迭代更新的思想,常规的思路是先将要参与聚类的特征数据载入内存,然后随机选择 K 个对象对聚类中心初始化c1,c2 ,c3 ,...,cK--初始化过程,再对剩下的每个对象 xi( i =1,2,3,…,n)根据其与各个簇中心的距离(本文取欧氏距离)将它赋给最近的簇(m 是特征数据的维数)--映射过程:

然后重新计算每个簇的均值作为下一次迭代的聚类中心—更新类中心:

即Kmeans 算法需要进行初始化,映射和更新类中心3 个过程,其中后两个过程要不断重复,直到所有类中心都不再变化为止,最后得到的类中心就是Bag of words 模型所需要的视觉词(visual words)。然后将每幅图像中的每个SIFT 描述子都映射到某个视觉词,得到的词频序列就是该幅图像的码本矢量。

MiniBatchKMeans 是 KMeans 算法的一个变种,它使用小批量(mini-batches)来减少计算时间,而这多个批次仍然尝试优化相同的目标函数。小批量是输入数据的子集,在每次训练迭代中随机抽样。这些小批量大大减少了收敛到局部解所需的计算量。 与其他降低 k-means 收敛时间的算法不同,小批量 k-means 产生的结果通常只比标准算法略差。

2.3 KD-tree检索系统

为了解决效率低下的暴力计算方法,已经发明了大量的基于树的数据结构。总的来说, 这些结构试图通过有效地编码样本的 aggregate distance (聚合距离) 信息来减少所需的距离计算量。 基本思想是,若 点距离 点非常远, 点距离 点非常近, 可知 点与 点很遥远,不需要明确计算它们的距离。 通过这样的方式,近邻搜索的计算成本可以降低为 或更低。 这是对于暴力搜索在大样本数 中表现的显著改善。

KD 树是一个二叉树结构,它沿着数据轴递归地划分参数空间,将其划分为嵌入数据点的嵌套的各向异性区域。 KD 树的构造非常快:因为只需沿数据轴执行分区, 无需计算 -dimensional 距离。 一旦构建完成, 查询点的最近邻距离计算复杂度仅为

3 系统实现

本软件主要采用python语言开发,基于cv2库提取图像的SIFT 特征,使用Bag of words 模型将它表示成特征矢量,建立KD-tree实现图像快速检索。

函数train:读取图像,获取每张图像的sift特征向量,通过MiniBatchKMeans进行聚类,最后保存模型;
函数query_data:通过图像的sift特征向量,进行分类预测,最后生成三个文件index_words.npy:用来保存文件名称与图像序号对应的文件;idf.npy:用来保存图像的idf值;words.npy:用来保存图像的特征向量;
函数train_kdtree:根据图像向量建立检索树;
函数query:每类查询5张图像,每张图像检索10张图像计算AP值,最后计算mAP值;

4 实验及分析

本文使用caltech-256 数据集,测试时随机选取5 幅图像做实验,提取SIFT,并映射到视觉词序列生成码本,分别计算这些码本到训练图像码本的距离,按升序进行排列,并查询图像标号与路径索引表,最终得到5 幅图像的AP和mAP得分如表1 所示。

american-flag

baseball-glove

bear

 

birdbath

 

cactus

 

AP

0.95

0.45

0.62

0.68

0.67

mAP

0.71

5 结论

经过以上分析,我们可以看到,将Bag of words 模型应用于大批量图像检索的思路是正确的,不仅计算量大大减小,而且得到了比较满意的检索效果。但是如果要进一步优化系统性能,还需要做更深入的研究,比如聚类要聚成几类才是最合适的,这个决定最终码本矢量维数的数据对系统性能的影响是可以想见的;另外聚类过程中的时间开销非常大,虽然是在线下运行的,但是有没有可能让时间花费更少一点,让其聚类效果更精确一点呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章