python计算机视觉--基于BOW模型的图像检索

本文详细介绍了如何使用Python实现基于BOW(Bag of Words)模型的图像检索。首先,解释了BOW模型的概念,强调了在文本处理中忽略语法和语序,使用单词频率表示文档。接着,讲解了将BOW模型应用于图像检索的过程,包括使用SIFT算法提取特征,用K-means进行视觉词典学习,然后进行特征量化、构建直方图和倒排表,以及最后的直方图匹配。此外,文中还提到了特征提取、索引创建和查询优化的相关代码,展示了实验结果,讨论了影响检索效果的因素。
摘要由CSDN通过智能技术生成


原理解析

1.BOW模型

BOW其实是Bag of words的缩写,也叫做词袋。BOW模型最早出现在自然语言处理和文本检索领域。该模型忽略掉文本的语法、语序等要素,吧文档看做若干词汇的集合,文档中的单词是独立出现的,使用一组无序的单词(words)表达一个文档,根据文档中单词的统计信息完成对文本的分类。

比如,有如下两个文档:

     1:Bob likes to play basketball, Jim likes too.

     2:Bob also likes to play football games.

根据这两个文档,我们可以构造一个词典:

    Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”, 8. “games”, 9. “Jim”, 10. “too”}。

这个词典中包含10个不同的单词,利用单词的索引号,我们可以将上面的每个文档都用一个10维向量表示(用0~n表示某个单词在文档中出现的次数,其中n为正整数):

                 1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]

                 2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

该向量的维度是单词的个数,值是每个单词在文本中出现的频率。以上的向量也可以用单词的直方图表示,词表相当于直方图的基,要表述的是文档向这个基上映射。

并非所有的单词都用来构建词表,相似的单词用一个单词表示。例如“walk, walking,walks” 都用 “walk” 表示。一个单词如果在所有文档中出现,比如is,a,an等词,那么个单词其实对区分文档就没有那么重要了。反之,如果一个单词只在一个文档值出现,那么只要输入的文档有这个单词,那么一定是属于这个单词所在的文档,就是唯一的,这对于区分文档非常重要。单词对区分文档的重要性通过计算单词TF-IDF(term frequency–inverse document frequency, 词频-逆向文档频率)实现。

单词w在文档d中出现的词频是:
在这里插入图片描述
n_w是单词w在文档d中出现的次数。为了归一化,将n_w除以整个文档中单词的总数。

逆向文档频率为:
在这里插入图片描述
|D|是在语料库D中的文档数目,分母是语料库中包含单词w在文档数d
就是单词w的TF-IDF权重了,用这个来表示单词对区分文档的重要性。因为有时候the、a这种的就很不重要。

BOW模型用于文本分类包括词表的建立、样本训练、新来样本识别三个步骤。

2.基于BOW的图像检索

对于两张图片,我们可以利用sift算法来进行特征匹配。但是面对大规模图像特征匹配,我们不可能一个个特征匹配,因为这样计算量是在过于庞大。比如,25000张图像约有310亿个图相对,即使每个图匹配只需要两秒,也需要500台并行计算机工作一年才可以完成,所以我们不能使用这种一个个特征匹配的暴力匹配法,需要寻找其他更快速有效的方法。

我们发现,面对大场景数据集,其实只有少于0.1%的图像具有匹配关系,所以我们可用图像整体特征实现匹配/检索,而非局部特征点。所以,我们找到那个快速有效的方法——BOW模型。将BOW模型应用于图像领域,即把图像视为与位置无关的局部特征集合,局部特征就相当于文本中的单词,称为“视觉单词”,视觉单词的集合称为“视觉词典”(也叫码本)。

图像检索的基本流程是:

①特征提取(SIFT算法)

②学习“视觉词典(visual vocabulary)”(k-means算法)

③针对输入的特征集,根据视觉词典进行量化

④把输入图像转化成视觉单词(visual words)的频率直方图

⑤构造特征到图像的倒排表,通过倒排表快速索引相关图像

⑥根据索引结果进行直方图匹配

2.1.用SIFT算法进行特征提取

特征提取就是从图像中提取出关键点(或特征点、角点)等,我们在这里采用的SIFT算法。SIFT算法用来侦测与描述影像中的局部特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。此算法由David Lowe 在1999 年所发表,2004 年完善总结。SIFT 算法的实质是在不同的尺度空间上查找关键点( 特征点),并计算出关键点的方向。SIFT 所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。SIFT 算法在构建好的尺度空间的基础上搜索尺度空间中的极值点( 特征点),然后确定极值点的尺度信息以及位置,再确定极值点的方向( 其邻域梯度的主方向),最终可以得到具有鲁棒性的128 维(448) 的特征向量。
利用SIFT算法提取出训练图片的示意图如下:
在这里插入图片描述
在这里插入图片描述
举个例子,假如现在有3 张训练图片:人脸、自行车、小提琴,如下图所示:
在这里插入图片描述
对每一张训练图片都提取SIFT 的128 维特征,那么最终可以得到 M = N1+N2+N3 个128 维的特征,Ni 代表第i 张图特征点的个数,如下图所示:

在这里插入图片描述

2.2用K-means得出视觉词典

前面已经说过了,面对大场景数据集,只凭特征匹配,由于计算时间过长,是不可能实现图像检索的。所以我们想到了将相似的特征向量聚到一起,用一个视觉单词来表示这些特征,就像文本中用“walk”来表示“walk, walking,walks” 一样。我们采用的算法是K-means算法。

k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。

    输入:聚类个数k,图像的特征集合。

    输出:满足方差最小标准的k个聚类。

在这里插入图片描述
k-means算法的流程示意图如下:

在这里插入图片描述
k-means算法是实现视觉词典(码本)的关键,我们将K-means 算法获取的聚类中心作为视觉单词(码本向量)。当训练集准备足够充分是,训练出的码本将具有普适性。

需要注意的是如何选择视觉词典/码本的规模,太少会出现视觉单词无法覆盖所有可能出现的情况;太多又会计算量大,容易过拟合。

就之前的例子而言就是将下述这特征向量进行聚类,将之前的特征向量转化为4个视觉单词,以此来作为视觉词典。
在这里插入图片描述

2.3.针对输入的特征集,根据视觉词典进行量化

对于文本而言,当一个单词在所有文本都出现那么这个单词就不能区分文本。同理,如果一个视觉单词在每个图像中都出现,那么这个视觉单词就不能区分图像了。类比文本,我们这里也采用TF-IDF权重来表示视觉单词对区分图像的重要程度。

2.4.把输入图像转化成视觉单词(visual words&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值