文章目录

  • 原理解析
    • 1.BOW模型
    • 2.基于BOW的图像检索
      • 2.1.用SIFT算法进行特征提取
      • 2.2用K-means得出视觉词典
      • 2.3.针对输入的特征集,根据视觉词典进行量化
      • 2.4.把输入图像转化成视觉单词(visual words)的频率直方图
      • 2.5.构造特征到图像的倒排表,通过倒排表快速索引相关图像
      • 2.6.根据索引结果进行直方图匹配
  • 相关代码
    • 1.特征提取和学习“视觉词典”
    • 2.创建索引,建立数据库
    • 3 利用索引在数据库中搜索图像
    • 实验结果
    • 总结
  • 附 期末复习整理资料
    • sift harris
    • 全景拼接
    • 相机标定
    • bow
    • 图像分割

原理解析

1.BOW模型

BOW其实是Bag of words的缩写,也叫做词袋。BOW模型最早出现在自然语言处理和文本检索领域。该模型忽略掉文本的语法、语序等要素,吧文档看做若干词汇的集合,文档中的单词是独立出现的,使用一组无序的单词(words)表达一个文档,根据文档中单词的统计信息完成对文本的分类。

比如,有如下两个文档:

     1:Bob likes to play basketball, Jim likes too.2:Bob also likes to play football games.

根据这两个文档,我们可以构造一个词典:

    Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”, 8. “games”, 9. “Jim”, 10. “too”}。

这个词典中包含10个不同的单词,利用单词的索引号,我们可以将上面的每个文档都用一个10维向量表示(用0~n表示某个单词在文档中出现的次数,其中n为正整数):

                 1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]

该向量的维度是单词的个数,值是每个单词在文本中出现的频率。以上的向量也可以用单词的直方图表示,词表相当于直方图的基,要表述的是文档向这个基上映射。

并非所有的单词都用来构建词表,相似的单词用一个单词表示。例如“walk, walking,walks” 都用 “walk” 表示。一个单词如果在所有文档中出现,比如is,a,an等词,那么个单词其实对区分文档就没有那么重要了。反之,如果一个单词只在一个文档值出现,那么只要输入的文档有这个单词,那么一定是属于这个单词所在的文档,就是唯一的,这对于区分文档非常重要。单词对区分文档的重要性通过计算单词TF-IDF(term frequency–inverse document frequency, 词频-逆向文档频率)实现。

单词w在文档d中出现的词频是:

n_w是单词w在文档d中出现的次数。为了归一化,将n_w除以整个文档中单词的总数。

逆向文档频率为:

|D|是在语料库D中的文档数目,分母是语料库中包含单词w在文档数d
就是单词w的TF-IDF权重了,用这个来表示单词对区分文档的重要性。因为有时候the、a这种的就很不重要。

BOW模型用于文本分类包括词表的建立、样本训练、新来样本识别三个步骤。

2.基于BOW的图像检索

对于两张图片,我们可以利用sift算法来进行特征匹配。但是面对大规模图像特征匹配,我们不可能一个个特征匹配,因为这样计算量是在过于庞大。比如,25000张图像约有310亿个图相对,即使每个图匹配只需要两秒,也需要500台并行计算机工作一年才可以完成,所以我们不能使用这种一个个特征匹配的暴力匹配法,需要寻找其他更快速有效的方法。

我们发现,面对大场景数据集,其实只有少于0.1%的图像具有匹配关系,所以我们可用图像整体特征实现匹配/检索,而非局部特征点。所以,我们找到那个快速有效的方法——BOW模型。将BOW模型应用于图像领域,即把图像视为与位置无关的局部特征集合,局部特征就相当于文本中的单词,称为“视觉单词”,视觉单词的集合称为“视觉词典”(也叫码本)。

图像检索的基本流程是:

①特征提取(SIFT算法)

②学习“视觉词典(visual vocabulary)”(k-means算法)

③针对输入的特征集,根据视觉词典进行量化

④把输入图像转化成视觉单词(visual words)的频率直方图

⑤构造特征到图像的倒排表,通过倒排表快速索引相关图像

⑥根据索引结果进行直方图匹配

2.1.用SIFT算法进行特征提取

特征提取就是从图像中提取出关键点(或特征点、角点)等,我们在这里采用的SIFT算法。SIFT算法用来侦测与描述影像中的局部特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。此算法由David Lowe 在1999 年所发表,2004 年完善总结。SIFT 算法的实质是在不同的尺度空间上查找关键点( 特征点),并计算出关键点的方向。SIFT 所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。SIFT 算法在构建好的尺度空间的基础上搜索尺度空间中的极值点( 特征点),然后确定极值点的尺度信息以及位置,再确定极值点的方向( 其邻域梯度的主方向),最终可以得到具有鲁棒性的128 维(448) 的特征向量。
利用SIFT算法提取出训练图片的示意图如下:


举个例子,假如现在有3 张训练图片:人脸、自行车、小提琴,如下图所示:

对每一张训练图片都提取SIFT 的128 维特征,那么最终可以得到 M = N1+N2+N3 个128 维的特征,Ni 代表第i 张图特征点的个数,如下图所示:

2.2用K-means得出视觉词典

前面已经说过了,面对大场景数据集,只凭特征匹配,由于计算时间过长,是不可能实现图像检索的。所以我们想到了将相似的特征向量聚到一起,用一个视觉单词来表示这些特征,就像文本中用“walk”来表示“walk, walking,walks” 一样。我们采用的算法是K-means算法。

k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。

    输入:聚类个数k,图像的特征集合。输出:满足方差最小标准的k个聚类。


k-means算法的流程示意图如下:


k-means算法是实现视觉词典(码本)的关键,我们将K-means 算法获取的聚类中心作为视觉单词(码本向量)。当训练集准备足够充分是,训练出的码本将具有普适性。

需要注意的是如何选择视觉词典/码本的规模,太少会出现视觉单词无法覆盖所有可能出现的情况;太多又会计算量大,容易过拟合。

就之前的例子而言就是将下述这特征向量进行聚类,将之前的特征向量转化为4个视觉单词,以此来作为视觉词典。

2.3.针对输入的特征集,根据视觉词典进行量化

对于文本而言,当一个单词在所有文本都出现那么这个单词就不能区分文本。同理,如果一个视觉单词在每个图像中都出现,那么这个视觉单词就不能区分图像了。类比文本,我们这里也采用TF-IDF权重来表示视觉单词对区分图像的重要程度。

2.4.把输入图像转化成视觉单词(visual words)的频率直方图

统计词表中每个单词在图像中出现的次数,将图像表示为K 维数值向量。上例中,可以将图像表示成为一个K=4 维数值向量:

人脸:[3,30,3,20]

自行车:[20,3,3,2]

小提琴:[8,12,32,7]
每幅图的视觉单词与词频直方图如图下图所示:

2.5.构造特征到图像的倒排表,通过倒排表快速索引相关图像

前几步是通过图像来提取视觉单词,用视觉单词的词频直方图来表示图像,是通过图像映射视觉单词。而倒排表是通过视觉单词映射图像。

比如,对于下述两个文本而言:

    1:Bob likes to play basketball, Jim likes too.2:Bob also likes to play football games.

之前是:

     1:[  “Jim”, “too”]2:[“also”, “football”, “games”,]

经过倒排后是:

    “Jim”:[1]“too”:[1]“also”:[2]“football”:[2]“games”:[2]

对于图像来说,经过倒排后,就是视觉单词:[视觉单词所出现的图像集合]。倒排表可以快速使用反转文件来计算新图像与数据库中所有图像之间的相似性,仅考虑其分档与查询图像重叠的数据库图像,大大减少了匹配次数,优化了算法。

2.6.根据索引结果进行直方图匹配

根据索引结果建立直方图,就可以得出最后的匹配结果了。

相关代码

1.特征提取和学习“视觉词典”

import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift# 获取图像列表
imlist = get_imlist('datasets/')
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, 122, 10)# 保存词汇
with open('BOW/vocabulary.pkl', 'wb') as f:pickle.dump(voc, f)
print('vocabulary is:', voc.name, voc.nbr_words)

运行结果:

生成对应的sift文件:

构造词典:

2.创建索引,建立数据库

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('datasets/')
nbr_images = len(imlist)
# 获取特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# 载入词汇
with open('BOW/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)# 创建索引
indx = imagesearch.Indexer('testImaAdd.db', voc)  # 在Indexer这个类中创建表、索引,将图像数据写入数据库
indx.create_tables()  # 创建表# 遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:888]:locs, descr = sift.read_features_from_file(featlist[i])indx.add_to_index(imlist[i], descr)  # 使用add_to_index获取带有特征描述子的图像,投影到词汇上# 将图像的单词直方图编码存储# 提交到数据库
indx.db_commit()con = sqlite.connect('testImaAdd.db')
print(con.execute('select count (filename) from imlist').fetchone())
print(con.execute('select * from imlist').fetchone())

运行结果:
生成数据库:

3 利用索引在数据库中搜索图像

import pickle
from PCV.geometry import homography
from PCV.imagesearch import imagesearch
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift# 载入图像列表
# imlist = get_imlist('test/')
imlist = get_imlist('datasets/')
nbr_images = len(imlist)# 载入特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]
# print(imlist)
# print(featlist)# # 提取文件夹下图像的sift特征
# for i in range(nbr_images):
#     sift.process_image(imlist[i], featlist[i])# 载入词汇
with open('BOW/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)# Searcher类读入图像的单词直方图执行查询
src = imagesearch.Searcher('testImaAdd.db', voc)
# print(src)# 查询图像索引和查询返回的图像数
q_ind = 6
nbr_results = 5# 常规查询(按欧式距离对结果排序)
res = [w[1] for w in src.query(imlist[q_ind])[:nbr_results]]
imagesearch.plot_results(src,res)

这里我们用常规查询和优化查询进行对比。

实验结果

测试1:

测试2:


测试3:


测试4:

总结

从上面的测试结果来看,检索出的图片相似度还算挺高的,一般会匹配出轮廓或者颜色相近的图片。在图像特征比较明显,或者数据集中图片相似的很多(同一个物品不同角度的拍摄),则图像的匹配效果越好。
  但如果图像比较复杂或者没有明显的特点的话,就不能提取到比较重要的特征点,从而影响检索的效果。
  (以上是在用在原本数据集的基础上进行的检索测试,用数据集以外的图片测试还存在问题,暂时没有解决。)

附 期末复习整理资料

sift harris


全景拼接



相机标定



bow



图像分割



python计算机视觉--基于BOW模型的图像检索相关推荐

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

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

  2. 计算机视觉8—基于BOW模型的图像检索和匹配

    目录 1.图像搜索 1.1 基于文本的图像检索 1.2 基于内容的图像检索(CBIR ) 2.BOW模型图像检索流程 2.1 BOW(Bag-of-words) 2.2 Bag-of-features ...

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

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

  4. 模式分类识别 | Python实现基于LGBM模型的信用类型识别预测

    模式分类识别 | Python实现基于LGBM模型信用类型识别预测 目录 模式分类识别 | Python实现基于LGBM模型信用类型识别预测 识别效果 文章概述 模型描述 程序设计 学习总结 识别效果 ...

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

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

  6. 计算机视觉-基于BOW的图像检索

    文章目录 一.Bag-of-words模型原理 二.K-means 聚类算法 三.实验步骤 1.提取SIFT特征.生成视觉词典 2.视觉词典进行量化生成数据库 3. 图像检索 一.Bag-of-wor ...

  7. BoW模型用于图像检索的一般化流程

    --来自肉麻的开题报告 以经典BoW模型实现一个图像检索的方法,BoW检索的一般流程如图2所示: 图2  BoW检索流程 最初的BoW在图像检索中应用的流程主要分为以下几步: 1.特征提取.在训练阶段 ...

  8. 计算机视觉学习 BOW模型图像搜索

    BOW模型 bag of words 1.简介 bag of words是文档的一种建模方法,它可以把一个文档表示成向量数据,从而使计算机处理文档数据更加方便. 例如: 把文档中的单词抽取出来,可以构 ...

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

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

最新文章

  1. 状态和面向对象编程——1.定位步骤
  2. 邬贺铨:工业物联网的技术与前景
  3. bootstrap4 调整元素之间距离
  4. 类与类之间的交互关系
  5. Js中去除数组中重复元素的几种方法
  6. Python自动化运维之25、Ajax
  7. 【Mybatis】sqlSessionTemplate.getConnection() 遇到 java.sql.SQLException: Connection is closed
  8. 高性能网站建设之 MS Sql Server数据库分区
  9. wangeditor修改图片上传和视频上传
  10. linux-5.12-rc1-dontuse
  11. 高质量 Android 开发框架 LoonAndroid 详解
  12. 一场员工高管间的口水战,员工输了
  13. 动态规划入门G - Super Jumping! Jumping! Jumping! (有关最优子序列的一个相关题目)...
  14. 计算机一级插入页眉,计算机一级考试,设置页眉为“汉字的交换码”
  15. 双极型晶体管及其放大电路
  16. 樊登读书会2016年推荐书目汇总
  17. 设计一个重量转换程序 python
  18. 任务调度ScheduledExecutorService
  19. 共轭(conjugate)
  20. 复变函数可视化以及代数基本定理

热门文章

  1. python协程处理多个文件_python:多任务(线程、进程、协程)
  2. 最简单的神经网络的例子,神经网络简单应用实例
  3. 机器人的「语料」,如何获取?
  4. python爬虫去哪儿网_用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿...
  5. 一沓扑克牌中剔除等于13或者相邻之和等于13的扑克牌,剩余多少
  6. 关键词推广-关键词推广软件
  7. 阿里云购买学生机镜像多种选择
  8. 2005年的网易邮箱长什么样的?
  9. no bonus 白嫖是否有害
  10. 渤海财险开启国产数据库替代之路,MogDB助推EAST系统升级