计算机视觉8—基于BOW模型的图像检索和匹配

 

目录

1.图像搜索

1.1 基于文本的图像检索

1.2 基于内容的图像检索(CBIR )

2.BOW模型图像检索流程

2.1 BOW(Bag-of-words)

2.2 Bag-of-features

2.3 TF-IDF(词频-逆向文档频率)

2.3 视觉单词

3.实验内容

3.1 数据集

3.2 实验流程及代码

4 总结


1.图像搜索

图像搜索,是通过搜索图像文本或视觉特征,为用户提供互联网上相关图形图像资料检索服务的专业搜索引擎系统,是搜索引擎的一种细分。一种是通过输入与图片名称或内容相似的关键字来进行检索,另一种通过上传与搜索结果相似的图片或图片URL进行搜索。

由于图像不同于文本,需要人们按照各自的理解来说明其蕴含的意义,需要人工干预找出图像并进行分类,因此图像检索比起文本的查询和匹配要困难得多。图像搜索引擎大多支持关键词检索和分类浏览两种检索方式,主要的检索途径有三种:①基于图像外部信息,即根据图像的文件名或目录名、路径名、链路、ALT标签以及图像周围的文本信息等外部信息进行检索;②基于图像内容特征描述,即人工对图像的内容(如物体、背景、构成、颜色特征等)进行描述并分类,给出描述词,检索时主要在这些描述词中搜索检索词;③基于图像形式特征的抽取,由图像分析软件自动抽取图像的颜色、形状、纹理等特征,建立特征索引库,只需将要查找的图像的大致特征描述出来,就可以找出与之具有相近特征的图像。

1.1 基于文本的图像检索

基于文本的图像检索沿用了传统文本检索技术,主要是利用文本标注的方式为图像添加关键词,比如图像的物体,场景等,从图像名称、图像尺寸、压缩类型、作者、知年代等方面标引图像,一般以关键词形式的提问查询图像,通过图片的名称、文字信息和索引关系来实现查询功能。

在检索图像时候直接根据所要搜索的关键词就可以检索到想要的图像,这种方式实现起来简单,但是非常耗费人工(需要人为给每一张图像标注),对于大型数据库检索不太现实。而且人工标注存在人为认知误差,对相同图像,人理解不一样,也到导致标注不一致,这是基于文本图像检索的一个缺点。

1.2 基于内容的图像检索(CBIR )

基于内容技术的图像检索系统,在建立图像数据库时, 系统对输入的图像进行分析并分类统一建模, 然后根据各种图像模型提取图像特征存入特征库, 同时对特征库建立索引以提高查找效率。系统采用相似性匹配算法计算关键图像特征与特征库中图像特征的相似度, 然后按照相似度从大到小的顺序将匹配图像反馈给用户。

使用了图像的可视特征对图像进行检索,本质上讲是一种近似匹配技术,融合了计算机视觉、图像处理、图像理解和数据库等多个领域的技术成果,其中的特征提取和索引的建立可由计算机自动完成,避免了人工描述的主观性。用户检索的过程一般是提供一个样例图像,系统抽取该查询图像的特征,然后与数据库中的特征进行比较,并将与查询特征相似的图像返回给用户。

2.BOW模型图像检索流程

2.1 BOW(Bag-of-words)

Bag-of-words 简称BOW,也叫做“词袋”,最初是为解决文档建模问题而提出的,在信息检索中,BOW模型假定对于一个文本,忽略其词序和语法、句法,将其仅看做是一个词集合,或者说是词的一个组合,文本中每个词的出现都是独立的,不依赖于其他词是否出现。

通过单词计数构建词袋,将文档转化为各个单词元素作为横坐标,以单词出现的次数作为纵坐标的直方图,从而建立文档索引,然后进行归一化处理,将每个词出现的频数作为文档的特征。

由于每篇文档长度不同,故除以直方图总和将向量归一化成单位长度。对于直方图向量中的每个元素,一般根据每个单词的重要性来赋予相应的权重。通常,数据集中一个单词的重要性与它在文档中出现的次数成正比,而与它在数据集中出现的次数成反比。最常用的权重TF-IDF(词频-逆向文档频率)。

基本流程:

  1. 构建图像库,即数据集
  2. 提取图像库中所有图像的局部特征,如SIFT
  3. 对特征集合进行聚类,聚类的中心对应特征形成的码字表示视觉词汇,视觉词汇的集合构成视觉词典,对应一个码书,即码字的集合
  4. 统计图像中各个视觉词汇出现的频率

2.2 Bag-of-features

将BoW引入到计算机视觉中,将一幅图像看成文本对象,图像中的不同特征可以看着构成图像的不同词汇,类似于文本的BoW模型,将图片分成若干个图像块,构建“词库”,就可以使用图像特征在图像中出现的频率,使用一个一维的向量来描述图像,这就是Bag-of-features

算法流程:

  1. 提取图像特征(常用SIFT)
  2. 训练字典,通过聚类算法对这些特征向量进行聚类(常用k-means),得到一部字典
  3. 量化图像特征,根据字典将图片表示成向量(直方图);
  4. 训练分类器,根据数据库图片的向量以及图片的标签,训练分类器模型
  5. 再提取图像特征,根据字典量化直方图向量,用分类器模型对直方图向量进行分类

2.3 TF-IDF(词频-逆向文档频率)

  • TF:词频(Term Frequency),指的是一个给定的词语在该文件中出现的次数。如果某个关键词在一篇文章中出现的频率高,则说明该词能表征文章的内容,该关键词在其它文章中很少出现,则认为此词语具有很好的类别区分度,对分类有很大的贡献。
  • IDF:逆文档频率(Inverse Document Frequency),描述了某一个特定词语的普遍重要性,如果文件数据库中包含词语A的文件越少,则IDF越大,则说明词语A具有很好的类别区分能力。

TF-IDF权值为词频与逆文档频率的乘积。

TF-IDF是用于信息检索的一种常用加权技术,在文本检索中用来评估词语对于一个文件数据库中的其中一份文件的重要程度。词语的重要性随着它在文件中出现的频率成正比增加,随着它在文件数据库中出现的频率成反比下降。

2.3 视觉单词

视觉单词,又叫视觉词典,正如上面Bag-of-features的介绍所说,为了将文本挖掘技术应用到图像中,首先需要建立视觉等效单词,可以通过SIFT局部描述子做到。

其主要思想是将描述子空间量化成一些典型实例,并将图像中的每一个描述子指派到其中的某个实例中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词,所有这些视觉单词构成的集合称为视觉词汇,也称为视觉码本,视觉词汇的集合构成视觉词典,对应一个码书,即码字的集合。对于给定的问题、图像类型,或在通常情况下仅需呈现视觉内容,可以创建特定的词汇。

即:视觉单词(码字)—(构成)—视觉词汇(视觉码本&#

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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图像检索系统的设计思路和实现方法,希望能够对读者有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值