图像检索BOF(Bag of features)

  • 目录
    • 1、BOW模型以及BOF模型介绍
    • 2、BOF模型流程
    • 3、代码
    • 4、使用图片集(54张)
    • 5、最终的匹配结果

目录

1、BOW模型以及BOF模型介绍

BOW模型:进行图像检索的时候,我们可以用穷举的方法,但是一一匹配效率太过低,工作量过大,于是参考文本信息检索的模型,提取特征点进行降维处理使用一组无序的words来表示一段文字或者一个文档。近年被广泛应用于计算机视觉中。其基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是将每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后根据袋子里装的词汇对其进行分类。

BOF模型:特征袋BOF是词袋BOW的一种改进。它借鉴了文本分类的思路(BOW),从图像抽象出很多具有代表性的「关键词」,形成一个字典,再统计每张图片中出现的「关键词」数量,得到图片的特征向量。因此将BOW的思想引入到图像中来,words在图像中用一种特定的特征描述子来代替,但是这样完全忽略了图像的空间布局关系。

2、BOF模型流程

<1>提取图像特征
按照Bag of Features算法的思想,我们要找到图像中的关键词,这些关键词必须具备较高的区分度,因此通常会采用sift特征。

<2> 对特征进行聚类,得到一部字典( visual vocabulary )
有了特征之后,我们会将这些特征通过聚类算法得出很多聚类中心。这些聚类中心通常具有较高的代表性。典型的聚类算法有k-means算法。我们将这些聚类中心组合在一起,形成一部字典。


聚类完成后,我们就得到了这 k 个向量组成的字典,这里每个类,我们就称为一个词(codeword)。这时,所有的类(词codeword)就会构成词典(codebook)

<3> 根据字典将图片表示成向量(直方图)
根据字典重新提取图像的高层特征,对于图像中的每一个SIFT特征,都可以在字典中找到一个最相似的visual word,这样我们可以统计一个 k 维的直方图(或者K维的特征向量),代表该图像的SIFT特征在字典中的相似度频率。

<4> 训练分类器
当我们得到每幅图片的直方图向量(反映了字典各词出现的频率)后,接下来就是传统的分类问题,训练分类器模型。对于需要预测的图片,先一样的提取sift特征,再根据字典量化直方图向量,用分类器模型对直方图进行分类,常用的方法有SVM。

<5>引入TF-IDF权值
TF-IDF 最早是在文献检索领域中被提出的,用关键字检索文章为例,一般关键词的词频越高,文章相关性越强。词频(Term Frequency)就是TF-IDF中的TF。
但是这样的话可能会造成不想关的词汇频率很高的问题,例如汉语中的“的,地,得”等。所以要对其进行忽略。
齐次,对一些对于检索没有帮助,所以我们要对词赋予权重,通用的词汇赋予较小的权重,预测能力较强的词汇权重较大,因为它们更加容易锁定目标。IDF(Inverse Document Frequency):如果文件数据库中包含词语A的文件越少,则IDF越大,则说明词语A具有很好的类别区分能力。
<6>加权BOF
将TF-IDF思想应用在图像检索中,为了更精确地度量相似性,我们也在原来直方图向量的基础上,为向量的每一项增加权重。
<7>倒排索引
倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

3、代码

提取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('D:/pythonProjects/ImageRetrieval/first500/')
imlist = get_imlist('H:\Pych\图像检索\统一大杂烩')
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('H:\Pych\图像检索\统一大杂烩/vocabulary.pkl', 'wb') as f:pickle.dump(voc, f)
print('vocabulary is:', voc.name, voc.nbr_words)

将图像添加到数据库

# -*- 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('H:\Pych\图像检索\统一大杂烩')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]# load vocabulary
#载入词汇
with open('H:\Pych\图像检索\统一大杂烩/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testRodeAdd.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('testRodeAdd.db')
print(con.execute('select count (filename) from imlist').fetchone())
print(con.execute('select * from imlist').fetchone())

放入图片进行图像检索

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('E:/Python37_course/test7/first1000/')
imlist = get_imlist('H:\Pych\图像检索\统一大杂烩')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]#载入词汇
with open('H:\Pych\图像检索\统一大杂烩/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)src = imagesearch.Searcher('testRodeAdd.db',voc)# Searcher类读入图像的单词直方图执行查询# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 39 # 匹配的图片下标
nbr_results = 54  # 数据集大小# 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])  # because 'ndx' is a rowid of the DB that starts at 1except:continue# 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]) #重排后的结果

4、使用图片集(54张)

5、最终的匹配结果

选取一张图片作为匹配的目标其结果如下:
匹配目标如下:

常规匹配结果如下:

重排结果如下:

这此实验的图片是在网上爬虫找到下载下来的,其照片的大小是不唯一的,而且有很多的图片都非常小,但是实验代码的要求是要所有的图片都是统一的宽✖高的,我使用了PhotoShop批量把54张图片统一改成了500✖400的大小。(如果取太大,计算sift特征时以及匹配时都会花费更多的时间)

最后的匹配结果界面中(无论是否重排):第一张为要找的样本,除了第一张外的前三张图片都是比较理想的输出结果,但是最后两张的结果却差人强意,分析原因应该是,首先相对库中所有的照片而言,最后两张的色调都是偏深色且偏紫蓝色的,且我们知道要匹配的花的角点是杂乱的,而第五张图片的背景可以看出来是非常杂乱的,而第六张图片也是远处的高楼都会有复杂的sift特征,这两点原因导致了这样的匹配结果

图像检索基于BOF(Bag-Of-Features Models)相关推荐

  1. Bag of Features (BOF)图像检索算法

    FROM:http://blog.csdn.net/loadstar_kun/article/details/39450137 1.首先,我们用surf算法生成图像库中每幅图的特征点及描述符. 2.再 ...

  2. Bag Of Features(BOF)图像检索方法

    文章目录 1. BOF原理 实验内容 数据集 实验代码 实验结果 总结 遇到的问题 1. BOF原理 Bag of features(Bof)一种是用于图像和视频检索的算法.要了解Bag Of Fea ...

  3. OpenCV精进之路(二十三):实例——Bag of Features(BoF)图像分类实践

    在深度学习在图像识别任务上大放异彩之前,词袋模型Bag of Features一直是各类比赛的首选方法.首先我们先来回顾一下PASCAL VOC竞赛历年来的最好成绩来介绍物体分类算法的发展. 从上表我 ...

  4. 计算机视觉——Bag Of features图像检索

    计算机视觉--Bag Of features图像检索 原理 什么是图像检索 什么是Bag Of Word模型 什么是sift特征提取 什么是视觉词典 什么是TF-IDF 基于BOW的图像检索步骤 结果 ...

  5. python计算机视觉编程——基于BOF的图像检索(附代码)

    图像检索 一.图像检索 1.1基本原理 1.2 BOW原理简述(同BOF原理) 1.3 基于BOF的图像检索基本流程 1.3.1 sift特征提取 1.3.2 建立视觉单词 1.3.3 K-Means ...

  6. 计算机视觉——Bag of features

    一.Bag of features 1.1 Bag of features概述 BOF方法源自于文本处理的词袋模型.Bag-of-words model (BoW model) 最早出现在NLP和IR ...

  7. Bag of Features (BoF) 简介

           最初的Bag of words,也叫做"词袋",在信息检索中,Bag of words model假定对于一个文本,忽略其词序和语法,句法,将其仅仅看做是一个词集合, ...

  8. 基于DELF(DEep Local Features)深度局部特征的图像检索实践

    本文记录利用官方源代码复现DELF图像检索算法的过程,希望能帮助有同样任务需求的小伙伴们避开一些坑,更快捷地完成实现! 注意:以下演示过程为Linux Ubuntu 下,且为GPU版本. 先决条件: ...

  9. Bag of words and Bag of features

     关于BOW没什么好点资源,百度到的都是一些不详细的. 碰巧看到了一个公开课,http://crcv.ucf.edu/courses/CAP5415/Fall2012/index.php里面有视频 ...

  10. 图像检索研究进展:浅层、深层特征及特征融合

    本文转自专知http://www.zhuanzhi.ai/document/7f7be4ead5b936eb91640a550c3506f4 方便自己学习 如有侵权 请联系删除 1 引言 随着计算机网 ...

最新文章

  1. 放心,GPT-3不会“杀死”编程
  2. 线上的java环境_Linux部署JavaWeb线上环境
  3. 中缀表达式转化为后缀表达式
  4. 一图看懂学位服:学位帽、学位袍、流苏、垂布
  5. iOS - 数据持久化之 FMDB 的使用
  6. GoogleClosureLibrary 中的Component 模型纪要
  7. 微信小程序获取用户信息以及唯一openid
  8. POJ 2799 IP Networks
  9. php中gd为什么是乱码的,php gd库中文乱码怎么解决?
  10. Win7下 OpenCV+Qt开发环境搭建
  11. Windows Server 2016-Windows控制台的新增功能
  12. static关键字_一题搞定static关键字
  13. 如何设置计算机的网络参数,如何正确设置电脑的IP地址和DNS等参数[图文]
  14. 离散数学(第二版) 第一章、第二章习题
  15. 小米平板2可以装鸿蒙系统,搞定LOL?Win10版小米平板2游戏性能实测
  16. 北京专科计算机学校排名及分数线,北京专科大学排名及分数线
  17. Java Email——使用Java程序收发电子邮件
  18. 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
  19. php开发桌面应用程序_使用PHP开发跨平台桌面应用程序的3种方法
  20. 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)

热门文章

  1. Segmentation笔记4-Boundary-Aware Network for Fast and High-Accuracy Portrait Segmentation
  2. C语言函数之可变参数原理:va_start、va_arg及va_end
  3. C语言中 1%3,算术什么意思啊 算数什么意思
  4. 【寻找最佳小程序】11期:车来了——时时公交就在你身边,到站准确率可控制在90%以上...
  5. kubernetes Auditing 实战
  6. Python条件语句(if、pass)
  7. JS模块化CommonJS、ES6模块化 、AMD、CMD知识总结
  8. 固实压缩文件容易损坏_请慎重使用固实压缩文件
  9. oracle数据库赋权
  10. 多张表格链接一起——《超级处理器》应用