图像检索代码python_GitHub-NocamiPythonComputerVisio。
。。
PythonComputerVision-7-ImageSearch
利⽤⽂本挖掘技术对基于图像视觉内容进⾏图像搜索,建⽴视觉单词(视觉码本)的概念,再建⽴相应数据库,最终实现在数据库中搜索图像,利⽤索引获取候选图像,再使⽤⼀幅图像进⾏查询。将上述⼯作最终建⽴为相应的演⽰程序以及web应⽤。
⼀.基于内容的图像检索
在⼤型图像数据库上,CBIR(Content-Based Image Retrieval基于内容的图像检索),⽤于检索在视觉上具有相似性的图像,如颜⾊、纹理、图像中相似的物体或场景等等。
但是传统的数据库图像匹配时不可⾏的,因为数据库很⼤的情况下,利⽤特征匹配的查询⽅式会耗费过多的时间。所以我们引⼊⼀种模型--⽮量空间模型。
1.⽮量空间模型
⽮量空间模型时⼀个⽤于表⽰和搜索⽂本⽂档的模型,它基本可以应⽤于任何对象类型,包括图像。这些⽮量是由⽂本词频直⽅图构成的,换句话说,⽮量包含了每个单词出现的次数,
⽽且在其他别的地⽅包含很多0元素。由于其忽略了单词出现的顺序及位置,该模型也被称为BOW表⽰模型。
通过单词计数来构建⽂档直⽅图向量v,从⽽建⽴⽂档索引。通常,数据集中⼀个单词的重要性与它在⽂档中出现的次数成正⽐,⽽与它在语料库中出现的次数成反⽐。
最常⽤的权重是tf-idf(tern frequency-inverse document frequency,词频-逆向⽂档频率),单词w在⽂档d中的词频是:
逆向⽂件频率 (inverse document frequency, IDF) IDF的主要思想是:如果包含词条t的⽂档越少, IDF越⼤,则说明词条具有很好的类别区分能⼒。某⼀特定词语的IDF,可以由总⽂件数⽬除以包含该词语之⽂件的数⽬,再将得到的商取对数得到。
某⼀特定⽂件内的⾼词语频率,以及该词语在整个⽂件集合中的低⽂件频率,可以产⽣出⾼权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
⼆.视觉单词
import pickle
将⽂本挖掘技术应⽤到图像中,⾸先需要建⽴等效视觉单词,可以⽤之前博⽂中提到的SIFT局部描述⼦做到。它的思想是将描述⼦空间量化成⼀些典型实例,并将图像中的每个描述⼦指派到其中的某个实例中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词。所有这些视觉单词构成的集合称为视觉词汇,有时也称为视觉码本。
1.BOW模型
2.创建词汇
为创建视觉单词词汇,我们需要提取特征描述⼦,这⾥,使⽤之前博⽂中介绍过的SIFT特征描述⼦。imlist包含的是图像的⽂件名,运⾏相应的代码(后⽂给出),可以得到每幅图的描述⼦,并且将每幅图像的描述⼦保存在⼀个⽂件中。创建⼀个Vocabulary类,其中包含了⼀个由单词聚类中⼼VOC与每个单词对应的逆向⽂档频率构成的向量,为了在某些图像集上训练词汇,train()⽅法获取包含有.sift后缀的描述⼦⽂件列表和词汇单词数k.在K-means聚类阶段可以对训练数据下采样,因为如果使⽤过多特征,会耗费很长时间。现在在计算机的某个⽂件夹中,保存了图像及提取出来的sift特征⽂件,利⽤pickle模块保存整个词汇对象以便后⾯使⽤。
三.图像索引
1.建⽴数据库
在索引图像前,我们需要建⽴⼀个数据库。对图像进⾏索引就是从这些图像中提取描述⼦,利⽤词汇将描述⼦转换成视觉单词,并保存视觉单词及对应图像的单词直⽅图,从⽽利⽤图像对数据库进⾏查询,并返回相似的图像作为搜索结果。
2.添加图像
有了数据库表单,我们可以在索引中添加图像。
四.在数据库中搜索图像
建⽴好图像的索引,我们就可以在数据库中搜索相似的图像了。这⾥使⽤BoW(Bag-of-Word,词袋模型)来表⽰整个图像,不过这⾥介绍的过程是通⽤的,可以应⽤于寻相似的物体、相似的脸、颜⾊等,这取决于图像及所⽤的描述⼦。如果图像数据库很⼤,逐⼀⽐较整个数据库中的所有直⽅图往往是不可⾏的,要到⼀个⼤⼩合理的候选集,单词索引的作⽤就是这个:可以利⽤单词索引获得候选集,然后只需在候选集上进⾏逐⼀⽐较。
1.利⽤索引获取候选图像
可以利⽤建⽴起来的索引到包含特定单词的所有图像,这不过是对数据库做⼀次简单的查询。
2.⽤⼀幅图像进⾏查询
利⽤⼀幅图像进⾏查询时,没有必要进⾏完全的搜索。对于每个候选图像,我们⽤标准的欧⽒距离⽐较它和查询图像间的直⽅图,并返回⼀个经排序的包含距离及图像ID的元组列表。
3.确定对⽐基准并绘制结果
为了评价搜索结果好坏,可以计算前4个位置中搜索到的相似图象数。这是在ukbench图像集上评价搜索性能常采⽤的评价⽅式。
五.使⽤⼏何特性对结果排序
Bow模型的⼀个主要缺点是在⽤视觉单词表⽰图像时不包含图像特征的位置信息,这是为获取速度和可伸缩性⽽付出的代价。利⽤⼀些考虑特征集合关系的准则重排搜索到的考前结果,可以提⾼准确率,最常⽤的⽅法是在查询图像与靠前图像的特征位置间拟合单应性。
为了提⾼效率,可以将特征位置存储在数据库中,并由特征的单词ID决定它们之间的关联。
六.演⽰程序及Web应⽤
之前介绍了图像检索的原理与基础步骤,这⾥将采⽤上述的知识进⾏⼀个整合,给出⼀个完整的图像搜索引擎。
1.所需运⾏环境及相应配置
代码运⾏于Python 3平台,需要相应的PCV,之前博⽂已经给出。
另外需要安装
安装pyqt5 :pip install PyQt5
安装cherrypy : pip install cherrypy
所需的图像数据集first1000⾃⾏下载。
2.源码及流程
1)⽣成所需模型⽂件
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
ls.imtools import get_imlist
from PCV.localdescriptors import sift
#获取图像列表
imlist = get_imlist('first1000/')
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')
#保存词汇
# saving vocabulary
with open('first1000/vocabulary.pkl', 'wb') as f:
pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)
这⾥⽤的数据集是之前下载的data⽂件夹中的 first1000 数据集,⾥⾯有1000张图⽚,建议把这个数据集⽂件整个 放到要运⾏的代码的当前⽬录下,⽐较⽅便,且不容易出错:这个过程很缓慢,根据机器配置不同,需要10-30分钟时间。
2)将模型数据导⼊数据库
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import imagesearch
from PCV.localdescriptors import sift
from sqlite3 import dbapi2 as sqlite
ls.imtools import get_imlist
#获取图像列表
imlist = get_imlist('first1000/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]
# load vocabulary
#载⼊词汇
with open('first1000/vocabulary.pkl', 'rb') as f:
voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testImaAdd.db',voc)
# go through all images, project features on vocabulary and insert #遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:1000]:
locs,descr = ad_features_from_file(featlist[i])
indx.add_to_index(imlist[i],descr)
# commit to database
#提交到数据库
indx.db_commit()
con = t('testImaAdd.db')
print (ute('select count (filename) from imlist').fetchone()) print (ute('select * from imlist').fetchone())
运⾏后,会⽣成相应⽂件:
3).索引测试
将数据放进数据库中之后就可以开始测试我们的图⽚索引。
下⾯直接上代码:
# -*- coding: utf-8 -*-
import pickle
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
ry import homography
ls.imtools import get_imlist
# load image list and vocabulary
#载⼊图像列表
imlist = get_imlist('first1000/')
nbr_images = len(imlist)
#载⼊特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]
#载⼊词汇
with open('first1000/vocabulary.pkl', 'rb') as f:
voc = pickle.load(f)
src = imagesearch.Searcher('testImaAdd.db',voc)
# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 0
nbr_results = 20
# 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 = ad_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:]:
locs,descr = ad_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 = o()[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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。