计算机视觉-基于BOW的图像检索
文章目录
- 一、Bag-of-words模型原理
- 二、K-means 聚类算法
- 三、实验步骤
- 1.提取SIFT特征、生成视觉词典
- 2.视觉词典进行量化生成数据库
- 3. 图像检索
一、Bag-of-words模型原理
BoW模型最初应用于文本处理领域,用来对文档进行分类和识别。BoW 模型因为其简单有效的优点而得到了广泛的应用。其基本原理可以用以下例子来给予描述。给定两句简单的文档:
文档 1:“我喜欢跳舞,小明也喜欢。”
文档 2:“我也喜欢唱歌。”
基于以上这两个文档,便可以构造一个由文档中的关键词组成的词典:
词典={1:“我”,2:“喜欢”,3:“跳舞”,4:“小明”,5:“也”,6:“唱歌”}
这个词典一共包含6个不同的词语,利用词典的索引号,上面两个文档每一个都可以用一个6维向量表示(用整数数字0~n(n为正整数)表示某个单词在文档中出现的次数。这样,根据各个文档中关键词出现的次数,便可以将上述两个文档分别表示成向量的形式:
文档 1:[1, 2, 1, 1, 1, 0]
文档 2:[1, 1, 0, 0, 1, 1]
从上述的表示中,可以很清楚地看出来,在文档表示过程中并没有考虑关键词的顺序,而是仅仅将文档看成是一些关键词出现的概率的集合(这是Bag-of-words模型的缺点之一),每个关键词之间是相互独立的,这样每个文档可以表示成关键词出现频率的统计集合,类似于直方图的统计表示。
如下图:
Bag of features: 基础流程
1.特征提取
2.学习 “视觉词典(visual vocabulary)”
3.针对输入特征集,根据视觉词典进行量化
4.把输入图像转化成视觉单词(visual words)的频率直方图
Bag of features: 特征提取
图片归一化,让放进词袋里面。
把所有词典投影到特征空间里,做聚类
聚成三类,把中心画出来
中心为视觉词汇,也是视觉词典的个数,直方图的长度由词典个数决定
二、K-means 聚类算法
算法流程:
随机初始化 K 个聚类中心
重复下述步骤直至算法收敛:
对应每个特征,根据距离关系赋值给某个中心/类别
对每个类别,根据其对应的特征集重新计算聚类中心
三、实验步骤
数据准备,找了一些花卉的图片,水果的图片还有一些风景的图片
在训练的时候我们可以设置不同的维度,我们能得到不同的结果。这里我设置了100,500,1000维度。
1.提取SIFT特征、生成视觉词典
# 生成词汇
# -*- 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('./img_resize/')
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, 1000, 10)
#保存词汇
# saving vocabulary
with open('./img_resize/vocabulary1000.pkl', 'wb') as f:pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)
2.视觉词典进行量化生成数据库
# 图像索引
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import imagesearch
from PCV.localdescriptors import sift
from sqlite3 import dbapi2 as sqlite
from PCV.tools.imtools import get_imlist#获取图像列表
imlist = get_imlist('./img_resize/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]# load vocabulary
#载入词汇
with open('./img_resize/vocabulary1000.pkl', 'rb') as f:voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testImaAdd1000.db',voc)
indx.create_tables()
# go through all images, project features on vocabulary and insert
#遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:500]:locs,descr = sift.read_features_from_file(featlist[i])indx.add_to_index(imlist[i],descr)
# commit to database
#提交到数据库
indx.db_commit()con = sqlite.connect('testImaAdd1000.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('./img_resize/')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]#载入词汇
with open('./img_resize/vocabulary1000.pkl', 'rb') as f:voc = pickle.load(f)src = imagesearch.Searcher('testImaAdd1000.db',voc)# Searcher类读入图像的单词直方图执行查询# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 24
nbr_results = 5# 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 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 list# 计算单应性矩阵try: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[:6]) #常规查询
imagesearch.plot_results(src,res_geom[:6]) #重排后的结果
100维度的 常规查询和重排序查询结果图相同,如下图
500维度的 常规查询和重排序查询结果图相同,如下图
1000维度 常规查询和重排序查询结果图相同,如下图
这次实验我用的图片很杂,花卉,风景,水果多个种类,而且每个种类之间也有很多差异,不同品种的花卉和水果,还有不同的风景图,比如深林,天空,沙滩。。。样本大多不关联,以至于训练出来的模型不够好。
不过还是能从上面的维度变换看出,维度遇到,训练结果越好,种类变少了,而且图片之间差异没有特别大了。
实验中出现的问题参考:
链接
计算机视觉-基于BOW的图像检索相关推荐
- 计算机视觉—基于BOW的图像检索
基于BOW的图像检索 1. 基本原理 1.1 Bag-of-words原理简介 1.2 Bag-of-features原理简介 1.3 Bag-of-features算法 1.3.1 图像检索流程 1 ...
- Python计算机视觉——基于BOW的图像检索
基于BOW的图像检索 一.图像检索概述 1.1 基于文本的图像检索(TBIR) 1.2 基于内容的图像检索(CBIR) 1.2.1 矢量空间模型(BOW表示模型.Bag of Words) 1.2.2 ...
- 计算机视觉——基于BOW的图像检索(作业六)
文章目录 一.图像检索概述 (一)基于内容的图像检索(CBIR) 1.矢量空间模型(BOW表示模型.Bag of Words) 2.视觉单词 (二)Bag of features 1.Bag of f ...
- python计算机视觉--基于(BOW)的图像检索与识别
目录 前言 一.基本原理 1.1 图像分类简介 1.2 Bag-of-words模型 1.3 Bag-of-features模型 1.4 Bag-of-features算法 1.5 Bag-of- ...
- Python计算机视觉之基于BOW的图像检索
目录 一.图像检索 1.1 简介 1.2 步骤 二.Bag Of Words模型(BOW) 2.1 简介 2.2 原理 2.2.1 特征提取 2.2.2 学习"视觉词典" 2.2. ...
- 基于BOW的图像检索 【计算机视觉第七章】
目录 BOW简介 基于BOW的图像检索流程 1. 特征提取 (SIFT) 2. 学习 "视觉词典(visual vocabulary)" (k-means) 3. 针对输入特征集, ...
- python计算机视觉--基于BOW模型的图像检索
文章目录 原理解析 1.BOW模型 2.基于BOW的图像检索 2.1.用SIFT算法进行特征提取 2.2用K-means得出视觉词典 2.3.针对输入的特征集,根据视觉词典进行量化 2.4.把输入图像 ...
- 【计算机视觉】基于BOW的图像检索
一.图像检索概述 简单的说便是从图片检索数据库中检索出满足条件的图片,图像检索技术的研究根据描述图像内容方式的不同可以分为两类:一类是基于文本的图像检索技术,一类为基于内容的图像检索技术.它最早用于对 ...
- Python计算机视觉(五)——基于BOW的图像检索
文章目录 一.图像搜索 二.BOW模型图像检索 1.BOW(Bag-of-words) 2.Bag-of-features 三.算法流程 1.特征提取 2.学习"视觉词典"(vis ...
最新文章
- 最优化——线性规划总结2(单纯形法问题总结,检验数为0和退化)
- Linux 应用程序开发入门
- 数据结构与算法--两个链表中第一个公共节点
- 经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便
- 用户控件事件使用delegate
- 【mysql执行计划 const eq_ref ref range index all】
- PTA-1021—— Deepest Root(最后两组数据错误)
- 面向科研的推荐系统Benchmark诞生!
- in作为介词的用法_(完整版)介词in重要用法归纳
- 不说“安全”俩字,如何证明自己是做安全的?
- 腾讯微信惊天漏洞,利用手机号致帐号丢失无法找回!——论个人信息安全与防护...
- Ubuntu 20.4 ip地址修改
- java微信授权登录回调地址,微信开发者工具,注册微信公共平台
- java根据身份证号码计算年龄的方法(精确到日)
- 精致生活品味相伴,Barsetto百胜图BAC025B胶囊咖啡机测评
- 借助 usb转rs232 模块实现两台电脑文件的传输
- 【教程】笔记本装Win10+Deepin双系统|详细
- 计算机考研复试【面试真题】
- 小梅哥AC620学习记录—UART_EEPROM_part2
- 没钱看病?别怕,有医保!