计算机视觉 — BOF图像检索

1. BOF图像检索实验原理
1.1 基础概念
1.1.1 前景:Bag of Words
Bag of Words照字面上是将文字归类为包。即在寻找文本的主要内容时,抓取文本中的关键词,根据大概率的关键词来确定文本的中心思想,可用于文章分类。

1.1.2 Bag of Features
Bag of Featuresfeature为特征,即根据特征进行分类。
Bag of Feature 是一种图像特征提取方法,参考了Bag of Words的思路,把每幅图像描述为一个局部区域/关键点(Patches/Key Points)特征的无序集合。同时从图像抽象出很多具有代表性的「关键词」,形成一个字典,再统计每张图片中出现的「关键词」数量,得到图片的特征向量。

1.2 Bag of Feature 算法基本流程
大概分为四步:

  1. 提取图像特征;
  2. 对特征进行聚类,得到一部字典( visual vocabulary );
  3. 根据字典将图片表示成向量(直方图);
  4. 训练分类器或者用 KNN 进行检索(这一步严格来讲不属于「Bag of Feature」的范畴)。

1.3 基本步骤原理详解

1.3.1 提取图像特征–SIFT特征提取法
SIFT特征提取算法的特点:
FT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
区分性(Distinctiveness)好,信息量丰富;
多量性,可以产生大量的SIFT特征向量;
高速性;
可扩展性,可以很方便的与其他形式的特征向量进行联合。
实验所要提取的特征必须具有较高的区分度,而且要满足旋转不变性以及尺寸不变性等,因此,根据以上SIFT算法的特点,我们通常都会采用SIFT特征提取法最为合适。

1.3.2 构造训练字典–K-means算法
K-means算法流程:

  • 随机初始化 K 个聚类中心
  • 重复下述步骤直至算法收敛: 对应每个特征,根据距离关系赋值给某个中心/类别 对每个类别,根据其对应的特征集重新计算聚类中心
  • 构造 提取完特征后,我们会采用一些聚类算法对这些特征向量进行聚类。最常用的聚类算法是 k-means。我们通过控制k的数量来确定聚类的数目,并且通过k-means收敛后,我们可以得到聚类的质心。k个质心就相当于词典里的词,我们称之为visual word(视觉单词),k即视觉单词数量。 步骤大致如下图:


    1.3.3 计算权值–IDF算法
    IDF原理
  • IDF 即逆向文件频率 (inverse document frequency, IDF) IDF的主要思想是:如果包含词条t的文档越少,
    IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
  • 公式 IDF=log(语料库的文档总数/(包含词条w的文档数+1)) 分母加1,以避免分母为0

1.3.4 通过特征集根据视觉词典量化–TF-IDF算法
TF-IDF的基本概念

  • TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).
    是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。总而言之,当 一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。通过某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

  • 公式 TF指的是当前文档的词频,

    ,在这个公式中,分子表示的是该某一文档中出现的次数,分母表示在该文档中所有关键词出现的次数之和。
    为了归一化,将 nw 除以整个文档中单词的总数。
    逆向文档频率为:

    1.4 Bag of Feature 的缺点
    Bag of Feature 在提取特征时不需要相关的 label 进行学习,因此是一种弱监督的学习方法。Bag of Feature 也存在一个明显的不足,那就是它完全没有考虑到特征之间的位置关系,而位置信息对于人理解图片来说,作用是很明显的。

2. BOF算法实现图像检索

1.构造不小于 100张图片的数据集

2.针对数据集,做SIFT特 征提取

3.根据SIFT特征提取结果,采用k-means算法学习“视觉词典.(visual vocabulary)”,其中维度至少满足4个量级(比如10, 50, 100, 1000, 5000 )

4.根据IDF原理,计算每个视觉单词的权

5.针对数据库中每张图片的特征集,根据视觉词典进行量化

以及TF-IDF解算。每张图片转化成特征向量

6.对于输入的检索图像(非数据库中图片),计算SIFT特征,.并根据TF-IDF转化成频率直方图/特征向量

7.构造检索图像特征到数据库图像的倒排表,快速索引相关候选匹配图像集

8.针对候选匹配图像集与检索图像进行直方图/特征匹配

2.1 实验基本数据集
1.生成sift特征文件
对每张图片生成相应的.sift文件,及视觉词汇,以便建立BOW模型。

2.2 实验结果展示

维度=100



当维度为100时,结果1的检索效果不错,结果2的检索效果不太好。看了数据集发现,(台灯)这一类的图片是形状差别不大,背景也比较单一的十张照片,虽然各个图片亮度会有所不同,但从结果上看,亮度的变化对检索效果影响不大;(自行车)这一类的图片是背景差别比较大的十张图片,有的图片包括了整个自行车,有的图片只有自行车的部分,因此尽管自行车类有十张图片,但检索结果却只有两张自行车的图片,另外三张明显看出来是检索错误的。

维度=1000


结果1、结果2的检索结果都有了很大的变化。结果1、结果2检索出来的五张图片相互都没有太大关系,却被一起检索出来,说明维度变得更大后,检索效果更差了。
2.3 CODE:

# -*- 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:/BOF/')
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, 2000, 10)
#保存词汇
# saving vocabulary
with open('C:/BOF/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('C:/BOF/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]# load vocabulary
#载入词汇
with open('C:/BOF/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('C:/BOF/testImaAdd.db',voc)
indx.create_tables()
# go through all images, project features on vocabulary and insert
#遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:2000]: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('C:/BOF/testImaAdd.db')
print (con.execute('select count (filename) from imlist').fetchone())
print (con.execute('select * from imlist').fetchone())# -*- 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('C:/BOF/')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]#载入词汇
with open('C:/BOF/vocabulary.pkl',errors='ignore') as f:voc = pickle.load(f)src = imagesearch.Searcher('C:/BOF/testImaAdd.db',voc)# index of query image and number of results to return
#查询图像索引和查询返回的图像数
q_ind = 40
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:]: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.4 实验总结

实现BOF算法时,能感受到其原理理解相对简单,但是代码实现就比较难,运用得比较复杂。
可以看出,当图像有明显特征,并且较为简单时,BOF算法的准确率会大幅提升。从向日葵组的异常可以分析出该算法对于景深较为丰富的图像分析效果不太好,由于景深丰富,相对位置变化较大,特征点就会相对多而杂,并且受像素影响,相对位置较远的特征也会变得不明确,会使其混乱,导致匹配效果不佳。
同时,k值的选取对匹配效果也有影响,主要根据图像本身的复杂程度,越复杂K值越大越合适,选择适当或稍微偏大的K值会使搜索效果更好。过大或过小都不利于效果实现。

计算机视觉 — BOF图像检索相关推荐

  1. 计算机视觉——BOF图像检索算法

    文章目录 Bag of Words 模型 Bag of Feature 算法 一.Bag of Feature 算法过程 1.1提取图像特征 1.2训练字典 1.3图片直方图表示 1.4根据TF-ID ...

  2. CV之IR:计算机视觉之图像检索(Image Retrieval)方向的简介、使用方法、案例应用之详细攻略

    CV之IR:计算机视觉之图像检索(Image Retrieval)方向的简介.使用方法.案例应用之详细攻略 目录 图像检索(Image Retrieval)方向的简介 图像检索(Image Retri ...

  3. 计算机视觉——bow图像检索

    计算机视觉--bow图像检索 1.BOW模型简介 2.基于bag of words的图像检索基本步骤 2.1 特征提取 2.2 学习 "视觉词典(visual vocabulary)&quo ...

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

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

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

    BOW图像检索 一.图像检索 1.1图像检索原理 1.2实现步骤 二.实验过程 2.1数据集 2.2代码 2.3结果 三.实验总结 一.图像检索 1.1图像检索原理 1.图像检索 简单的说便是从图片检 ...

  6. Python 计算机视觉-BOW图像检索

    一.图像检索的概述和原理   从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于文本的图像检索技术(Text-based Image Retrieval,简称TBIR),利用文本描述的 ...

  7. 计算机视觉之图像检索

    结构 相似检索 颜色.纹理.形状 局部特征点 词包(Bag of Visiual Word) 索引加速 KD-tree 局部敏感哈希(Locality Sensitive Hash)

  8. 【计算机视觉5】图像检索

    1. BOF图像检索实验原理 1.1 基础概念 1.1.1 前景:Bag of Words Bag of Words照字面上是将文字归类为包.即在寻找文本的主要内容时,抓取文本中的关键词,根据大概率的 ...

  9. CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

    CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...

  10. BOF——Bag-of-Featrures

    本文主要介绍:BOF(Bag-of-Featrures)的原理及其应用. 1.1 引言 文档分类领域有一种模型称为词袋(Bag of words)模型,它是自然语言处理与信息检索过程中的一种简化模型. ...

最新文章

  1. 请关注你的网站跳出率
  2. 正确理解HTML,XHTML页面的头部doctype定义
  3. c++协程1 (boost::coroutine)
  4. bat截取字符串[转]
  5. 信息学奥赛一本通(1034:计算三角形面积)
  6. 【kafka】kafka record is corrupt(记录损坏)
  7. 二叉搜索树的后序遍历
  8. 【深入浅出通信原理-学习笔记】通信系统概述
  9. 输入输出隔离的半/全双工RS-485/RS-422接口隔离芯片电路
  10. 关于Git及GitLab的简单易懂的使用方法(将本地仓库的项目提交到master分支或者自定义的分支上)
  11. linux下编译和安装log4cxx,RedHat如何安装log4cxx日志库
  12. 有序关系中的上界+上确界+下界+下确界
  13. corosync+pacemaker+web集群
  14. Echarts结合百度地图API
  15. RAII (Resource Acquirement Is Initialization)
  16. 夏季晒黑如何变白?店湾妹教你几招,皮肤回归白嫩
  17. [Vulhub] ThinkPHP漏洞合集
  18. P2056 [ZJOI2007] 捉迷藏 【动态点分治】
  19. 【干货】使用EnCase来分析windows 7文件系统------认识元数据记录$MFT,数据恢复
  20. Java连接Access 2013

热门文章

  1. 如何使用CubeMx生成一个DFU工程
  2. python实训总结万能版3000字_实训总结万能版2000字
  3. 记一次失败的机械键盘拆机换轴经历(含失败的经验总结)
  4. 设计心理学2-与复杂共处【读书笔记】
  5. python除数为0报错_python——异常
  6. 嗅探(窃听网络上流经的数据包)
  7. Angular启动项目时报错
  8. 没有 本地计算机策略组,本地组策略编辑器没有mmc
  9. java的多态是什么意思_【Java】基础18:什么叫多态?
  10. html中放大镜字体图标,CSS3 放大镜应用图标