计算机视觉—BOW图像检索
BOW图像检索
- 一、图像检索
- 1.1图像检索原理
- 1.2实现步骤
- 二、实验过程
- 2.1数据集
- 2.2代码
- 2.3结果
- 三、实验总结
一、图像检索
1.1图像检索原理
1、图像检索
简单的说便是从图片检索数据库中检索出满足条件的图片,图像检索技术的研究根据描述图像内容方式的不同可以分为两类:一类是基于文本的图像检索技术,一类为基于内容的图像检索技术。它最早用于对于文章内容的检索,原理是将文本看作是单词的集合,不考虑其中的语法,上下文等等。通过建立词典,对每个单词出现次数进行统计,以便得到文本内容的分类。计算机视觉的专家从中获得灵感,将其用于图像的检索中,就有了Bag Of Features。
2、Bag of Feature 算法
1、Bag-of-Features模型仿照文本检索领域的Bag-of-Words方法,把每幅图像描述为一个局部区域/关键点(Patches/Key Points)特征的无序集合。使用某种聚类算法(如K-means)将局部特征进行聚类,每个聚类中心被看作是词典中的一个视觉词汇(Visual Word),相当于文本检索中的词,视觉词汇由聚类中心对应特征形成的码字(code word)来表示(可看当为一种特征量化过程)。所有视觉词汇形成一个视觉词典(Visual Vocabulary),对应一个码书(code book),即码字的集合,词典中所含词的个数反映了词典的大小。图像中的每个特征都将被映射到视觉词典的某个词上,这种映射可以通过计算特征间的距离去实现,然后统计每个视觉词的出现与否或次数,图像可描述为一个维数相同的直方图向量,即Bag-of-Features。
2、Bag-of-Features算法
Bag-of-Features模型仿照文本检索领域的Bag-of-Words方法,把每幅图像描述为一个局部区域/关键点(Patches/Key Points)特征的无序集合。使用某种聚类算法(如K-means)将局部特征进行聚类,每个聚类中心被看作是词典中的一个视觉词汇(Visual Word),相当于文本检索中的词,视觉词汇由聚类中心对应特征形成的码字(code word)来表示(可看当为一种特征量化过程)。所有视觉词汇形成一个视觉词典(Visual Vocabulary),对应一个码书(code book),即码字的集合,词典中所含词的个数反映了词典的大小。图像中的每个特征都将被映射到视觉词典的某个词上,这种映射可以通过计算特征间的距离去实现,然后统计每个视觉词的出现与否或次数,图像可描述为一个维数相同的直方图向量,即Bag-of-Features。
Bag-of-Features更多地是用于图像分类或对象识别。对训练集提取Bag-of-Features特征,在某种监督学习(如:SVM)的策略下,对训练集的Bag-of-Features特征向量进行训练,获得对象或场景的分类模型;对于待测图像,提取局部特征,计算局部特征与词典中每个码字的特征距离,选取最近距离的码字代表该特征,建立一个统计直方图,统计属于每个码字的特征个数,即为待测图像之Bag-of-Features特征;在分类模型下,对该特征进行预测从实现对待测图像的分类。
1.2实现步骤
1.特征提取
局部特征提取:通过分割、密集或随机采集、关键点或稳定区域、显著区域等方式使图像形成不同的patches,并获得各patches处的特。其中,SIFT特征较为流行。
2.采用K-means算法学习“视觉词典”(visual vocabulary)
由聚类中心代表的视觉词汇形成视觉词典
3.针对输入特征集,根据视觉词典进行量化
4.把输入图像,根据TF-IDF转化成视觉单词( visual words)的频率直方图
TF-IDF是一种用于信息检索的经常使用加权技术,在文本检索中。用以评估词语对于一个文件数据库中的当中一份文件的重要程度。词语的重要性随着它在文件里出现的频率成正比添加,但同一时候会随着它在文件数据库中出现的频率成反比下降。TF的主要思想是:假设某个关键词在一篇文章中出现的频率高。说明该词语能够表征文章的内容。该关键词在其它文章中非常少出现,则觉得此词语具有非常好的类别区分度,对分类有非常大的贡献。IDF的主要思想是:假设文件数据库中包括词语A的文件越少。则IDF越大,则说明词语A具有非常好的类别区分能力。
词频(Term Frequency。TF)指的是一个给定的词语在该文件里出现的次数。如:tf = 0.030 ( 3/100 )表示在包括100个词语的文档中, 词语’A’出现了3次。
逆文档频率(Inverse Document Frequency。IDF)是描写叙述了某一个特定词语的普遍重要性。假设某词语在很多文档中都出现过,表明它对文档的区分力不强,则赋予较小的权重;反之亦然。
5.构造特征到图像的倒排表,通过倒排表快速索引相关图像
6.根据索引结果进行直方图匹配
二、实验过程
2.1数据集
2.2代码
1、生成词典:
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift#获取图像列表
imlist = get_imlist('C:/Users/apple/Desktop/计算机视觉/图像检索')
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, 30, 10)
#保存词汇
# saving vocabulary
with open('C:/Users/apple/Desktop/计算机视觉/图像检索/vocabulary.pkl', 'wb') as f:pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)
2、将数据导入数据库:
# -*- coding: utf-8 -*-
import picklefrom PCV.imagesearch import imagesearch
from PCV.localdescriptors import sift
import sqlite3
from PCV.tools.imtools import get_imlist# 获取图像列表
# imlist = get_imlist('E:/Python37_course/test7/first1000/')
imlist = get_imlist('C:/Users/apple/Desktop/计算机视觉/图像检索')
nbr_images = len(imlist)
# 获取特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# load vocabulary
# 载入词汇
'''with open('E:/Python37_course/test7/first1000/vocabulary1.pkl', 'rb') as f:voc = pickle.load(f)'''
with open('C:/Users/apple/Desktop/计算机视觉/图像检索//vocabulary4.pkl', 'rb') as f:# voc = pickle.load(f)voc = pickle.load(f, encoding='iso-8859-1')
# 创建索引
indx = imagesearch.Indexer('testImaAdd4.db', voc)
indx.create_tables()
# go through all images, project features on vocabulary and insert
# 遍历所有的图像,并将它们的特征投影到词汇上# for i in range(nbr_images)[:1000]:
for i in range(nbr_images)[:1000]:locs, descr = sift.read_features_from_file(featlist[i])indx.add_to_index(imlist[i], descr)
# commit to database
# 提交到数据库
indx.db_commit()con = sqlite3.connect('testImaAdd4.db')
print(con.execute('select count (filename) from imlist').fetchone())
print(con.execute('select * from imlist').fetchone())
3、测试
# -*- coding: utf-8 -*-
import pickle
# import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from PCV.tools.imtools import get_imlist
from PIL import Image
# from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris# load image list and vocabulary
# 载入图像列表
# imlist = get_imlist('E:/Python37_course/test7/first1000/')
imlist = get_imlist('C:/Users/apple/Desktop/计算机视觉/图像检索/')
nbr_images = len(imlist)
# 载入特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# 载入词汇
'''with open('E:/Python37_course/test7/first1000/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)'''
with open('C:/Users/apple/Desktop/计算机视觉/图像检索//vocabulary1.pkl', 'rb') as f:voc = pickle.load(f, encoding='iso-8859-1')src = imagesearch.Searcher('testImaAdd1.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):', str(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:]:locs, descr = sift.read_features_from_file(featlist[ndx]) # because 'ndx' is a rowid of the DB that starts at 1# get matchesmatches = 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 listtry:H, inliers = homography.H_from_ransac(fp[:, ind], tp[:, ind2], model, match_theshold=4)except:inliers = []# store inlier countrank[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[:5]) # 常规查询
imagesearch.plot_results(src, res_geom[:5]) # 重排后的结果
2.3结果
测试图片:
三、实验总结
1、原先使用自己拍摄的图片集的时候,图片大而多,生成sift特征平均每张图要运行2分钟左右,因此采用了网上搜索到的图片集进行实验。图片集每4张图片相似,25组共100张。图片像素为640x480,运行速度明显变快。
2、运行结果来看,BOW图像检索的效果相对较好,前四张为相似图片。
3、仍存在某些劣势:
a、Kmeans聚类时间长
b、词袋表的量化的过程,损失了匹配精度(本实验中采用网上的图,匹配效果相对较好)
4、出现错误:
计算机视觉—BOW图像检索相关推荐
- 计算机视觉——bow图像检索
计算机视觉--bow图像检索 1.BOW模型简介 2.基于bag of words的图像检索基本步骤 2.1 特征提取 2.2 学习 "视觉词典(visual vocabulary)&quo ...
- Python 计算机视觉-BOW图像检索
一.图像检索的概述和原理 从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于文本的图像检索技术(Text-based Image Retrieval,简称TBIR),利用文本描述的 ...
- 基于python3计算机视觉编程(八)BOW图像检索
BOW图像检索 一. 图像检索简介 二. 检索的分类 三. BOW图像检索 3.1 BOW原理简述 3.2 算法实现步骤 (1) 特征提取 (2) 学习"视觉词典"visual v ...
- BoW图像检索Python实战
BoW图像检索Python实战 2015年06月16日 Image Retrieval 词袋模型 字数:11854 前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Py ...
- CV之IR:计算机视觉之图像检索(Image Retrieval)方向的简介、使用方法、案例应用之详细攻略
CV之IR:计算机视觉之图像检索(Image Retrieval)方向的简介.使用方法.案例应用之详细攻略 目录 图像检索(Image Retrieval)方向的简介 图像检索(Image Retri ...
- 词袋模型BoW图像检索Python实战
前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Python搞BoW词袋模型,一方面主要是练练Python,另一方面也是为了CBIR群开讲的关于图像检索群活动第二期而准备的 ...
- 词袋 图像检索 matlab,词袋模型BoW图像检索Python实战
前几天把HABI哈希图像检索工具包更新到V2.0版本后,小白菜又重新回头来用Python搞BoW词袋模型,一方面主要是练练Python,另一方面也是为了CBIR群开讲的关于图像检索群活动第二期而准备的 ...
- 计算机视觉——BOF图像检索算法
文章目录 Bag of Words 模型 Bag of Feature 算法 一.Bag of Feature 算法过程 1.1提取图像特征 1.2训练字典 1.3图片直方图表示 1.4根据TF-ID ...
- 计算机视觉之图像检索
结构 相似检索 颜色.纹理.形状 局部特征点 词包(Bag of Visiual Word) 索引加速 KD-tree 局部敏感哈希(Locality Sensitive Hash)
最新文章
- Unity 游戏框架搭建 (二十一) 使用对象池时的一些细节
- interp3函数-----三维数据插值
- download first at netease music
- matlab教程点语言,编程语言 / Matlab教程_电脑教程学习网( 5 )
- 秦九韶算法matlab程序,数值分析matlab程序实例.doc
- 俄罗斯套娃(JOISC 2016 Day 1)
- [Luogu 3835]【模板】可持久化平衡树
- 第 5 章 File Share
- linux初学者-DNS集群篇
- angular动态绑定样式以及改变UI框架样式的方法
- 测试用例之黑盒测试方法
- 【MATLAB图像融合】[18]双通道PCNN模型实现图像融合
- SSM+Flowplayer实现web项目网页看视频
- python宣传视频 抖音_python下载抖音无水印视频
- 配置标准IP ACL实验
- Threejs入门之五:Threejs中的辅助对象
- 查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
- 在微信小程序中 使用uView rules 表单校验 validator 不起作用(无效)
- 图片浏览器功能的实现(一)——图片放大与缩小功能实现
- 机器学习的所有资源链接和经验教训(五)ML技术讲座