计算机视觉学习11:基于BoW的图像检索

BoW模型原理

模型简介

BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。举个例子,有如下两个文档:

文档一:Bob likes to play basketball, Jim likes too.
文档二: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, 2, 1, 1, 1, 0, 0, 0, 1, 1]
文档二:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

向量中每个元素表示词典中相关元素在文档中出现的次数(下文中,将用单词的直方图表示)。不过,在构造文档向量的过程中可以看到,我们并没有表达单词在原来句子中出现的次序(这是BoW模型的缺点之一)。

原理

考虑将Bag-of-words模型应用于图像表示。为了表示一幅图像,我们可以将图像看作文档,即若干个“视觉词汇”的集合,同样的,视觉词汇相互之间没有顺序。
在这里插入图片描述
由于图像中的词汇不像文本文档中的那样是现成的,我们需要首先从图像中提取出相互独立的视觉词汇,这通常需要经过三个步骤:
(1)特征检测
(2)特征表示
(3)单词本的生成在这里插入图片描述
通过观察会发现,同一类目标的不同实例之间虽然存在差异,但我们仍然可以找到它们之间的一些共同的地方,比如说人脸,虽然说不同人的脸差别比较大,但眼睛,嘴,鼻子等一些比较细小的部位,却观察不到太大差别,我们可以把这些不同实例之间共同的部位提取出来,作为识别这一类目标的视觉词汇。

而SIFT算法是提取图像中局部不变特征的应用最广泛的算法,因此我们可以用SIFT算法从图像中提取不变特征点,作为视觉词汇,并构造单词表,用单词表中的单词表示一幅图像。

接下来,我们通过上述图像展示如何通过Bag-of-words模型,将图像表示成数值向量。现在有三个目标类,分别是人脸、自行车和吉他。

第一步:利用SIFT算法,从每类图像中提取视觉词汇,将所有的视觉词汇集

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BOW (Bag of Words) 是一种常用的图像检索方法,其基本思想是将图像转化为向量,然后通过计算向量之间的距离来实现图像检索。下面是一个基于Python的BOW图像检索系统的设计思路和实现方法。 ## 设计思路 1. 预处理阶段:对于每张图片,提取其SURF特征,并使用K-means算法将特征向量聚类,得到视觉词汇表。 2. 训练阶段:对于每张图片,使用其SURF特征和视觉词汇表,构造其Bag of Words向量,并使用SVM分类器对图像进行分类。 3. 检索阶段:对于查询图片,提取其SURF特征并构造其Bag of Words向量,计算查询向量与训练集所有图像的距离,并返回距离最近的前K张图片作为检索结果。 ## 实现方法 下面是一个基于Python的BOW图像检索系统的实现方法。 ### 1. 预处理阶段 ```python import cv2 import numpy as np from sklearn.cluster import KMeans # 定义SURF特征提取器 surf = cv2.xfeatures2d.SURF_create() # 定义K-means聚类器 kmeans = KMeans(n_clusters=50) # 加载训练集图片 train_images = [] for i in range(1, 11): img = cv2.imread(f'train/{i}.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kp, des = surf.detectAndCompute(gray, None) train_images.append(des) # 将特征向量聚类,得到视觉词汇表 features = np.vstack(train_images) kmeans.fit(features) vocabulary = kmeans.cluster_centers_ ``` 以上代码,我们使用OpenCV的SURF特征提取器提取训练集图片的SURF特征,并使用K-means算法将特征向量聚类,得到视觉词汇表。 ### 2. 训练阶段 ```python import os # 构造训练集的Bag of Words向量和标签 train_data = [] train_labels = [] for i in range(1, 11): img = cv2.imread(f'train/{i}.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kp, des = surf.detectAndCompute(gray, None) words = kmeans.predict(des) bow_vector = np.zeros((1, 50)) for w in words: bow_vector[0, w] += 1 train_data.append(bow_vector) train_labels.append(i) # 使用SVM分类器对图像进行分类 svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.train(np.array(train_data), cv2.ml.ROW_SAMPLE, np.array(train_labels)) ``` 以上代码,我们对每张训练集图片提取SURF特征并构造其Bag of Words向量,然后使用SVM分类器对图像进行分类。 ### 3. 检索阶段 ```python # 加载查询图片 query_img = cv2.imread('query.jpg') query_gray = cv2.cvtColor(query_img, cv2.COLOR_BGR2GRAY) query_kp, query_des = surf.detectAndCompute(query_gray, None) # 构造查询图片的Bag of Words向量 query_words = kmeans.predict(query_des) query_bow = np.zeros((1, 50)) for w in query_words: query_bow[0, w] += 1 # 计算查询向量与训练集所有图像的距离 distances = [] for i in range(1, 11): img = cv2.imread(f'train/{i}.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) kp, des = surf.detectAndCompute(gray, None) words = kmeans.predict(des) bow_vector = np.zeros((1, 50)) for w in words: bow_vector[0, w] += 1 dist = np.linalg.norm(query_bow - bow_vector) distances.append((i, dist)) # 返回距离最近的前K张图片作为检索结果 k = 5 results = sorted(distances, key=lambda x: x[1])[:k] for r in results: print(f'train/{r[0]}.jpg') ``` 以上代码,我们对查询图片提取SURF特征并构造其Bag of Words向量,然后计算查询向量与训练集所有图像的距离,并返回距离最近的前K张图片作为检索结果。 ## 总结 BOW图像检索系统是一种基于特征向量的图像检索方法,在实际应用具有广泛的应用。本文介绍了基于Python的BOW图像检索系统的设计思路和实现方法,希望能够对读者有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值