计算机视觉——基于BOW的图像检索(作业六)

文章目录

  • 一、图像检索概述
    • (一)基于内容的图像检索(CBIR)
      • 1.矢量空间模型(BOW表示模型、Bag of Words)
      • 2.视觉单词
    • (二)Bag of features
      • 1.Bag of features图像检索流程
      • 2.特征提取
      • 3.学习特征词典
      • 4.对输入特征集进行量化
      • 5.倒排索引表
      • 6.直方图匹配
  • 二、使用Python实现的方法
    • (一)准备图片集
    • (二)代码实现过程
      • 1.提取*SIFT*特征、生成视觉词典
      • 2.视觉词典进行量化生成数据库
      • 3.图像检索
    • (三)实验结果及分析


一、图像检索概述

从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于文本的图像检索技术Text-based Image Retrieval,简称TBIR),利用文本描述的方式描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。到90年代以后,出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,即基于内容的图像检索(Content-based Image Retrieval,简称CBIR)技术。CBIR属于基于内容检索(Content-based Retrieval,简称CBR)的一种,CBR中还包括对动态视频、音频等其它形式多媒体信息的检索技术。

BOW(Bag of Feature)是一种图像特征提取方法,它借鉴了文本分类的思路(Bag of Words),从图像抽象出很多具有代表性的「关键词」,形成一个字典,再统计每张图片中出现的「关键词」数量,得到图片的特征向量。

由于随着图像数据快速增长,针对基于文本的图像检索方法日益凸现的问题,在1992年美国国家科学基金会就图像数据库管理系统新发展方向达成一致共识,即表示索引图像信息的最有效方式应该是基于图像内容自身的。因此,接下来我们将分别对CBIRBOW进行阐述。

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

利用文本标注的方式对图像中的内容进行描述,从而为每幅图像形成描述这幅图像内容的关键词,比如图像中的物体,或者景深更大的场景,在进行检索时,使用者可以根据自己的兴趣提供查询关键字,检索系统用使用者提供的查询关键字找出那些标注有该查询关键字对应的图片,最后将查询的结果返回给使用者。

计算机视觉——基于BOW的图像检索(作业六)_第1张图片

主要流程:
1.图像预处理.
2.特征提取(SIFT)
3.对图像数据库建立图像特征索引
4.抽取检索(Query)图像特征,构建特征向量.
5.设计检索模块(相似度设置准则)
6.返回相似性较高的结果

1.矢量空间模型(BOW表示模型、Bag of Words)

矢量空间模型是一个用于表示和搜索文本文档的模型。它基本上可以应用于任何对象类型,包括图像。该名字来源于用矢量来表示文本文档,这些矢量是由文本词频直方图构成的。矢量包括了每个单词出现的次数,而且在其他别的地方包含很多0元素。由于其忽略了单词出现的顺序及位置,该模型也被称为BOW表示模型(Bag of Words)。

总结来看,这种方式将文本表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。

我们需要找到图像的特征,类似于词汇作为文本的特征,而这种特征必须得对光照,图片的是否旋转,图片畸变等不敏感,而sift特征提取能够较好的满足上述要求,因此,我们使用sift特征提取的方法形成一个词汇。

通过单词计数来构建文档直方图向量v,从而建立文档索引。通常,在单词计数时会忽略掉一些常用词,如 “这” “和” “是” 等,这些常用词称为停用词。由于每篇文档长度不同,因此除以直方图总和将向量归一化成单位长度。对于直方图向量中的每个元素,一般根据每个单词的重要性来赋予相应的权重。通常,数据集(或语料库)中一个单词的重要性与它在文档中出现的次数成正比,而与它在语料库中出现的次数成反比。

最常用的是权重是tf-idftern frequency-inverse document frequency,词频-逆向文档频率)

计算机视觉——基于BOW的图像检索(作业六)_第2张图片
其中, n w n_w nw 是单词 w w w在文档 d d d中的出现的次数。为了归一化,将 n w n_w nw除以整个文档中单词的总数。

则,逆向文档频率为:
计算机视觉——基于BOW的图像检索(作业六)_第3张图片
其中, ∣ D ∣ ∣D∣ D是在语料库 D D D中文档的数目,分母是语料库中包含单词 w w w的文档数 d d d。将两者相乘可以得到矢量 v v v中对应元素的 t f − i d f tf-idf tfidf权重

2.视觉单词

将文本的关键词提取技术应用于图像检索中,需要建立一个类似于关键词的包含图像信息的单词,因此可以通过sift特征提取出的特征作为视觉单词。

这个过程可进一步描述,将描述子空间量化成一些典型实例,并将图像中的每个描述子指派到其中的某个实例中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词。所有这些视觉单词构成的集合称为视觉词汇,有时也称为视觉码本。

(二)Bag of features

Bag of Feature是一种图像特征提取方法,它借鉴了文本分类的思路(Bag of Words),从图像抽象出很多具有代表性的「关键词」,形成一个字典,再统计每张图片中出现的「关键词」数量,得到图片的特征向量。
计算机视觉——基于BOW的图像检索(作业六)_第4张图片

1.Bag of features图像检索流程

图像检索流程
1.特征提取
2.学习 “视觉词典(visual vocabulary)”
3.针对输入特征集,根据视觉词典进行量化
4.把输入图像转化成视觉单词(visual words)的频率直方图
5.构造特征到图像的倒排表,通过倒排表快速索引相关图像
6.根据索引结果进行直方图匹配

以下是具体实现思路

2.特征提取

特征提取通常使用 SIFT局部描述子技术。视觉单词流程类似。

计算机视觉——基于BOW的图像检索(作业六)_第5张图片 计算机视觉——基于BOW的图像检索(作业六)_第6张图片

3.学习特征词典

当我们提取完图像特征后,便开始了学习特征词典,利用一些聚类算法可以构建出视觉单词,最常用的是K−means算法。

K−means 算法
最小化每个特征 x i x_i xi与其相对应的聚类中心 m k m_k mk之间的欧式距离。
算法流程
1.随机初始化 K 个聚类中心;
2.重复下述步骤直至算法收敛:
对应每个特征,根据距离关系赋值给某个中心/类别;
对每个类别,根据其对应的特征集重新计算聚类中心。

计算机视觉——基于BOW的图像检索(作业六)_第7张图片 计算机视觉——基于BOW的图像检索(作业六)_第8张图片 计算机视觉——基于BOW的图像检索(作业六)_第9张图片

聚类后,就得到了这 k k k个向量组成的词典,称为visual words(视觉单词)。所有这些视觉单词构成的集合称为视觉词汇。

例如:计算机视觉——基于BOW的图像检索(作业六)_第10张图片

4.对输入特征集进行量化

对于图像中的每一个SIFT特征,都可以在字典中找到一个最相似的visual word,这样,我们可以统计一个k维的直方图,代表该图像的SIFT特征在字典中的相似度频率。统计出最相似的向量出现的次数,最后得到这幅图片的直方图向量。

计算机视觉——基于BOW的图像检索(作业六)_第11张图片

5.倒排索引表

通过TF-IDF过滤掉常见的词语,保留重要的词语后,我们便可以建立倒排索引表。

倒排索引表是一种逆向的索引方法,构造倒排表可以快速索引图像。倒排索引,通过搜索要查询的关键字,查询到跟该关键字相关的所有文档。倒排表可以获得是各视觉单词出现在图像库的哪些图像中。

6.直方图匹配

最后,根据索引的结果进行直方图匹配,就完成了图像索引。
计算机视觉——基于BOW的图像检索(作业六)_第12张图片


二、使用Python实现的方法

(一)准备图片集

本次实验准备了 50张食物类型的图片集。
计算机视觉——基于BOW的图像检索(作业六)_第13张图片

(二)代码实现过程

1.提取SIFT特征、生成视觉词典

import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from sqlite3 import dbapi2 as sqlite


#获取图像列表
imlist = get_imlist('./datasets/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

#提取文件夹下图像的sift特征
for i in range(nbr_images):
    sift.process_image(imlist[i], featlist[i])

#生成词汇
voc = vocabulary.Vocabulary('ukbenchtest')
voc.train(featlist, 888, 10) # 使用k-means算法在featurelist里边训练处一个词汇
                             # 注意这里使用了下采样的操作加快训练速度
                             # 将描述子投影到词汇上,以便创建直方图
#保存词汇
# saving vocabulary
with open('./BOW/vocabulary.pkl', 'wb') as f:
    pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)

2.视觉词典进行量化生成数据库

import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from sqlite3 import dbapi2 as sqlite # 使用sqlite作为数据库


#获取图像列表
imlist = get_imlist('./datasets/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

# load vocabulary
#载入词汇
with open('./BOW/vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testImaAdd.db',voc) # 在Indexer这个类中创建表、索引,将图像数据写入数据库
indx.create_tables() # 创建表
# go through all images, project features on vocabulary and insert
#遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:888]:
    print(featlist[i])
    locs,descr = sift.read_features_from_file(featlist[i])
    indx.add_to_index(imlist[i],descr) # 使用add_to_index获取带有特征描述子的图像,投影到词汇上
                                       # 将图像的单词直方图编码存储
# commit to database
#提交到数据库
indx.db_commit()

con = sqlite.connect('testImaAdd.db')
print (con.execute('select count (filename) from imlist').fetchone())
print (con.execute('select * from imlist').fetchone())

3.图像检索

# -*- coding: utf-8 -*- 
#使用视觉单词表示图像时不包含图像特征的位置信息
import pickle
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from PCV.tools.imtools import get_imlist

# load image list and vocabulary
#载入图像列表
imlist = get_imlist('./datasets/')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

#载入词汇
with open('./BOW/vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)

src = imagesearch.Searcher('testImaAdd.db',voc)# Searcher类读入图像的单词直方图执行查询

# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 4
nbr_results = 2

# regular query
# 常规查询(按欧式距离对结果排序)

res_reg = [w[1] for w in src.query(imlist[q_ind])[:nbr_results]] # 查询的结果
print ('top matches (regular):', res_reg)

# load image features for query image
#载入查询图像特征进行匹配
q_locs,q_descr = sift.read_features_from_file(featlist[q_ind])
fp = homography.make_homog(q_locs[:,:2].T)

# RANSAC model for homography fitting
#用单应性进行拟合建立RANSAC模型
model = homography.RansacModel()
rank = {}
# load image features for result
#载入候选图像的特征
for ndx in res_reg[1:]:
    try:
        locs, descr = sift.read_features_from_file(featlist[ndx])
    except:
        continue
    # locs,descr = sift.read_features_from_file(featlist[ndx])  # because 'ndx' is a rowid of the DB that starts at 1
    # get matches
    matches = sift.match(q_descr,descr)
    ind = matches.nonzero()[0]
    ind2 = matches[ind]
    tp = homography.make_homog(locs[:,:2].T)
    # compute homography, count inliers. if not enough matches return empty list
    # 计算单应性矩阵
    try:
        H,inliers = homography.H_from_ransac(fp[:,ind],tp[:,ind2],model,match_theshold=4)
    except:
        inliers = []
    # store inlier count
    rank[ndx] = len(inliers)

# sort dictionary to get the most inliers first
# 对字典进行排序,可以得到重排之后的查询结果
sorted_rank = sorted(rank.items(), key=lambda t: t[1], reverse=True)
res_geom = [res_reg[0]]+[s[0] for s in sorted_rank]
print ('top matches (homography):', res_geom)

# 显示查询结果
imagesearch.plot_results(src,res_reg[:6]) #常规查询
imagesearch.plot_results(src,res_geom[:6]) #重排后的结果

(三)实验结果及分析

计算机视觉——基于BOW的图像检索(作业六)_第14张图片
计算机视觉——基于BOW的图像检索(作业六)_第15张图片
计算机视觉——基于BOW的图像检索(作业六)_第16张图片
在这里插入图片描述
计算机视觉——基于BOW的图像检索(作业六)_第17张图片
普通匹配
计算机视觉——基于BOW的图像检索(作业六)_第18张图片
单应性评估后
计算机视觉——基于BOW的图像检索(作业六)_第19张图片
匹配的图像索引号
在这里插入图片描述
原图
计算机视觉——基于BOW的图像检索(作业六)_第20张图片
普通匹配
计算机视觉——基于BOW的图像检索(作业六)_第21张图片
单应性评估后匹配
计算机视觉——基于BOW的图像检索(作业六)_第22张图片
匹配的图像索引号
在这里插入图片描述
在这里插入图片描述


你可能感兴趣的:(python,计算机视觉)