文章目录

  • 一、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的图像检索相关推荐

  1. 计算机视觉—基于BOW的图像检索

    基于BOW的图像检索 1. 基本原理 1.1 Bag-of-words原理简介 1.2 Bag-of-features原理简介 1.3 Bag-of-features算法 1.3.1 图像检索流程 1 ...

  2. Python计算机视觉——基于BOW的图像检索

    基于BOW的图像检索 一.图像检索概述 1.1 基于文本的图像检索(TBIR) 1.2 基于内容的图像检索(CBIR) 1.2.1 矢量空间模型(BOW表示模型.Bag of Words) 1.2.2 ...

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

    文章目录 一.图像检索概述 (一)基于内容的图像检索(CBIR) 1.矢量空间模型(BOW表示模型.Bag of Words) 2.视觉单词 (二)Bag of features 1.Bag of f ...

  4. python计算机视觉--基于(BOW)的图像检索与识别

    目录 前言 一.基本原理 1.1 图像分类简介 1.2 Bag-of-words模型 1.3 Bag-of-features模型 1.4  Bag-of-features算法 1.5  Bag-of- ...

  5. Python计算机视觉之基于BOW的图像检索

    目录 一.图像检索 1.1 简介 1.2 步骤 二.Bag Of Words模型(BOW) 2.1 简介 2.2 原理 2.2.1 特征提取 2.2.2 学习"视觉词典" 2.2. ...

  6. 基于BOW的图像检索 【计算机视觉第七章】

    目录 BOW简介 基于BOW的图像检索流程 1. 特征提取 (SIFT) 2. 学习 "视觉词典(visual vocabulary)" (k-means) 3. 针对输入特征集, ...

  7. python计算机视觉--基于BOW模型的图像检索

    文章目录 原理解析 1.BOW模型 2.基于BOW的图像检索 2.1.用SIFT算法进行特征提取 2.2用K-means得出视觉词典 2.3.针对输入的特征集,根据视觉词典进行量化 2.4.把输入图像 ...

  8. 【计算机视觉】基于BOW的图像检索

    一.图像检索概述 简单的说便是从图片检索数据库中检索出满足条件的图片,图像检索技术的研究根据描述图像内容方式的不同可以分为两类:一类是基于文本的图像检索技术,一类为基于内容的图像检索技术.它最早用于对 ...

  9. Python计算机视觉(五)——基于BOW的图像检索

    文章目录 一.图像搜索 二.BOW模型图像检索 1.BOW(Bag-of-words) 2.Bag-of-features 三.算法流程 1.特征提取 2.学习"视觉词典"(vis ...

最新文章

  1. 最优化——线性规划总结2(单纯形法问题总结,检验数为0和退化)
  2. Linux 应用程序开发入门
  3. 数据结构与算法--两个链表中第一个公共节点
  4. 经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便
  5. 用户控件事件使用delegate
  6. 【mysql执行计划 const eq_ref ref range index all】
  7. PTA-1021—— Deepest Root(最后两组数据错误)
  8. 面向科研的推荐系统Benchmark诞生!
  9. in作为介词的用法_(完整版)介词in重要用法归纳
  10. 不说“安全”俩字,如何证明自己是做安全的?
  11. 腾讯微信惊天漏洞,利用手机号致帐号丢失无法找回!——论个人信息安全与防护...
  12. Ubuntu 20.4 ip地址修改
  13. java微信授权登录回调地址,微信开发者工具,注册微信公共平台
  14. java根据身份证号码计算年龄的方法(精确到日)
  15. 精致生活品味相伴,Barsetto百胜图BAC025B胶囊咖啡机测评
  16. 借助 usb转rs232 模块实现两台电脑文件的传输
  17. 【教程】笔记本装Win10+Deepin双系统|详细
  18. 计算机考研复试【面试真题】
  19. 小梅哥AC620学习记录—UART_EEPROM_part2
  20. 没钱看病?别怕,有医保!

热门文章

  1. 在计算机系统中 控制和管理各种资源,操作系统试题2
  2. JavaScript定时器的各种案例
  3. i18n和l10n的意思
  4. 戴尔U盘重装系统Win10步骤和详细教程
  5. 5G NR的速率计算方法
  6. 如何快速完全删除node_modules
  7. 关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍
  8. unity c#非法字符(脏词)检测
  9. PTA 狼人杀-简单版 (20分)
  10. 高抗干扰低功耗4键触摸芯片,4路4感应通道电容式触摸芯片,高灵敏度小体积封装DFN10-3MM*3MM