python计算机视觉编程——基于BOF的图像检索(附代码)
图像检索
此次实验的内容主要有关于图像检索的内容,与教材《python计算机视觉编程》衔接,将展⽰如何利⽤⽂本挖掘技术对基于图像视觉内容进⾏图像搜索。
⼀、图像检索
由于暴⼒检索(即⼀张⼀张图像直接对⽐)需要花费⼤量的计算机运⾏时间和内存,考虑到检索效率,从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于⽂本的图像检索技术(Text-based Image Retrieval,简称TBIR),利⽤⽂本描述的⽅式描述图像的特征,如绘画作品的作者、年代、流派、尺⼨等。到90年代以后,出现了对图像的内容语义,如图像的颜⾊、纹理、布局等进⾏分析和检索的图像检索技术,即基于内容的图像检索(Content-based Image Retrieval,简称CBIR)技术。CBIR属于基于内容检索(Content-based Retrieval,简称CBR)的⼀种,CBR中还包括对动态视频、⾳频等其它形式多媒体信息的检索技术。
想学电脑编程和代码总的来说图像检索就是从⼤量的图像数据库中检索出满⾜条件的图⽚,技术包括:
基于⽂本的图像检索技术
基于内容的图像检索技术
1.1基本原理
由于对于⼤场景数据集(如城市场景), 只有极少部分的图像对具有匹配关系,为了解决这⼀问题,我们利⽤图像整体特征实现匹配检索,⽽⾮局部特征点。
在检索原理上,⽆论是基于⽂本的图像检索还是基于内容的图像检索,主要包括三⽅⾯:
⼀⽅⾯对⽤户需求的分析和转化,形成可以检索索引数据库的提问;
另⼀⽅⾯,收集和加⼯图像资源,提取特征,分析并进⾏标引,建⽴图像的索引数据库;
最后⼀⽅⾯是根据相似度算法,计算⽤户提问与索引数据库中记录的相似度⼤⼩,提取出满⾜阈值的记录作为结果,按照相似度降序的⽅式输出。
1.2 BOW原理简述(同BOF原理)
为了将⽂本挖掘技术应⽤到图像中,我们⾸先需要建⽴视觉等效单词;这通常可以SIFT 局部描述⼦做到。它的思想是将描述⼦空间量化成⼀些典型实例,并将图像中的每个描述⼦指派到其中的某个实例
中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词。所有这些视觉单词构成的集合称为视觉词汇,有时也称为视觉码本。对于给定的问题、图像类型,或在通常情况下仅需呈现视觉内容,可以创建特定的词汇。从⼀个(很⼤的训练图像)集提取特征描述⼦,利⽤⼀些聚类算法可以构建出视觉图像搜索,或在更加⾼级的场合下使⽤层次K-means单词。聚类算法中最常⽤的是 K-means,这⾥也将采⽤ K-means。视觉单词并不⾼端,只是在给定特征描述⼦空间中的⼀组向量集,在采⽤ K-means 进⾏聚类时得到的视觉单词是聚类质⼼。⽤视觉单词直⽅图来表⽰图像,则该模型便称为 BOW 模型。
Bag-of-Words模型源于⽂本分类技术。在信息检索中,它假定对于⼀个⽂本,忽略其词序、语法和句法,将其仅仅看作是⼀个词集合,或者说是词的⼀个组合。⽂本中每个词的出现都是独⽴的,不依赖于其他词是否出现,即在任意⼀个位置选择词汇都不受前⾯句⼦的影响⽽独⽴选择的。
使⽤某种聚类算法(如K-means)将特征进⾏聚类,每个聚类中⼼被看作是词典中的⼀个视觉词汇(Visual Word),相当于⽂本检索中的词,视觉词汇由聚类中⼼对应特征形成的码字(code word)来表⽰(可看当为⼀种特征量化过程)。所有视觉词汇形成⼀个视觉词典(Visual Vocabulary),对应⼀个码书(code book),即码字的集合,词典中所含词的个数反映了词典的⼤⼩。图像中的每个特征都将被映射到视觉词典的某个词上,这种映射可以通过计算特征间的距离去实现。然后,统计每个视觉词的出现与否或次数,图像可描述为⼀个维数相同的直⽅图向量,即Bag-of-Features。在Bag-of-Features⽅法
的基础上,Andrew Zisserman进⼀步借鉴⽂本检索中TF-IDF模型(Term Frequency⼀Inverse Document Frequency)来计算Bag-of-Features特征向量。接下来便可以使⽤⽂本搜索引擎中的反向索引技术对图像建⽴索引,⾼效的进⾏图像检索。
Bag-of-Features更多地是⽤于图像分类或对象识别,鉴于SIFT的优异性能,本⽂提取的是SIFT特征。
1.3 基于BOF的图像检索基本流程
1. 特征提取
2. 学习 “视觉词典(visual vocabulary)”
3. 针对输⼊特征集,根据视觉词典进⾏量化
4. 把输⼊图像,根据TF-IDF转化成视觉单词(visual words)的频 率直⽅图
5. 构造特征到图像的倒排表,通过倒排表快速 索引相关图像
6. 根据索引结果进⾏直⽅图匹配
1.3.1 sift特征提取
该特征提取原理可以参考我之前写过的博⽂,这⾥不多写:
1.3.2 建⽴视觉单词
为了将⽂本挖掘技术运⽤到图像中,⾸先要建⽴视觉等效单词;可以采⽤SIFT局部描述算⼦获得,针对输⼊特征集,根据视觉词典进⾏量化。建⽴视觉单词的思想就是将描述算⼦空间量化成⼀些典型实例,并将图像中的每个描述算⼦指派到其中的某个实例中,这些典型实例可通过分析训练图像集确定。即从⼀个很⼤的训练集提取特征描述算⼦,利⽤⼀些聚类算法可以构建出视觉单词(聚类算法最常⽤的是K-means),视觉单词是在给定特征描述算⼦空间中⼀组向量集,采⽤K-means进⾏聚类得到的聚类质⼼;把输⼊图像,根据TF-IDF转化成视觉单词( visual words)的频率直⽅图 ,⽤视觉单词直⽅图来表⽰图像。如图下所⽰:
1.3.3 K-Means算法
关于K-Means算法的原理可以参考下⾯这篇博⽂:
K值越⼤,噪声对聚类影响越⼩,但是K值取过⼤将⽆法得出聚类结果,所以聚类时K值的选取要适当。
K-Means算法基本流程:
随机初始化 K 个聚类中⼼
重复下述步骤直⾄算法收敛:
对应每个特征,根据距离关系赋值给某个中⼼/类别
对每个类别,根据其对应的特征集重新计算聚类中⼼
⼆、实验
2.1 实验环境
1.ptyhon3.7版本,win10 ,pycharm;
2.由于有⽤到sift特征提取,所以需要安装vlfeat,我安装的是0.9.20版本。vlfeat的win64⾥的vl.dll和和vl.lib复制在项⽬⾥。
3.把PCV包放在项⽬下
4.安装PyQt5(直接pip就好了,加个镜像快很多,要不然容易超时)
5.安装cherrypy(同样直接pip,⽤于可视化检索)
2.2实验要求
2.3实验代码(实验分析也在其中)
1.⽣成sift特征⽂件
对每张图⽚⽣成相应的.sift⽂件,及视觉词汇,以便建⽴BOW模型。我所⽤的是图像集为104张(⾃⼰⽹络搜索的图⽚)。如果需要增加图像或减少只需要改代码⾥读取训练图像的数量,为了让sift特征提取速度变快,我将所有图⽚的⼤⼩调整成统⼀的⼤⼩,并且设置成400*300的分辨率,加快了代码的运⾏速度。
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
ls.imtools import get_imlist
from PCV.localdescriptors import sift
# 获取图像列表
imlist = get_imlist('E:/thirddown/computervision/untitled4/jsjsj/data/')
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])
# ⽣成词汇
#train的参数为(特征列表,读取图⽚数,训练数)
voc = vocabulary.Vocabulary('test')
# 保存词汇
# saving vocabulary
with open('E:/thirddown/computervision/untitled4/jsjsj/data/vocabulary.pkl','wb')as f:
pickle.dump(voc, f)
print('vocabulary is:', voc.name, voc.nbr_words)
运⾏结果:
每张数据集都得到了对应的sift⽂件,同时每幅图像的描述⼦保存在vocabulary.pkl⽂件中,如果数据模型为空,在后⾯存⼊数据库会出现报错,读⼊数据为空。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论