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

本文介绍了基于BOF(Bag of Features)的图像检索技术,包括基本原理、BOW模型的构建和K-Means算法的应用。实验部分涉及SIFT特征提取、数据库建立、索引测试以及遇到的问题,如pysqlite2模块导入错误、数据库已存在等问题的解决。
摘要由CSDN通过智能技术生成


此次实验的内容主要有关于图像检索的内容,与教材《python计算机视觉编程》衔接,将展示如何利用文本挖掘技术对基于图像视觉内容进行图像搜索。

一、图像检索

由于暴力检索(即一张一张图像直接对比)需要花费大量的计算机运行时间和内存,考虑到检索效率,从20世纪70年代开始,有关图像检索的研究就已开始,当时主要是基于文本的图像检索技术(Text-based Image Retrieval,简称TBIR),利用文本描述的方式描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。到90年代以后,出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,即基于内容的图像检索(Content-based Image Retrieval,简称CBIR)技术。CBIR属于基于内容检索(Content-based Retrieval,简称CBR)的一种,CBR中还包括对动态视频、音频等其它形式多媒体信息的检索技术
总的来说图像检索就是从大量的图像数据库中检索出满足条件的图片,技术包括:

  • 基于文本的图像检索技术
  • 基于内容的图像检索技术

1.1基本原理

由于对于大场景数据集(如城市场景), 只有极少部分的图像对具有匹配关系,为了解决这一问题,我们利用图像整体特征实现匹配检索,而非局部特征点。
在检索原理上,无论是基于文本的图像检索还是基于内容的图像检索,主要包括三方面:

  • 一方面对用户需求的分析和转化,形成可以检索索引数据库的提问;
  • 另一方面,收集和加工图像资源,提取特征,分析并进行标引,建立图像的索引数据库
  • 最后一方面是根据相似度算法,计算用户提问与索引数据库中记录的相似度大小,提取出满足阈值的记录作为结果,按照相似度降序的方式输出。

1.2 BOW原理简述(同BOF原理)

为了将文本挖掘技术应用到图像中,我们首先需要建立视觉等效单词;这通常可以SIFT 局部描述子做到。它的思想是将描述子空间量化成一些典型实例,并将图像中的每个描述子指派到其中的某个实例中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词。所有这些视觉单词构成的集合称为视觉词汇,有时也称为视觉码本。对于给定的问题、图像类型,或在通常情况下仅需呈现视觉内容,可以创建特定的词汇。从一个(很大的训练图像)集提取特征描述子,利用一些聚类算法可以构建出视觉图像搜索,或在更加高级的场合下使用层次 K-means单词。聚类算法中最常用的是 K-means,这里也将采用 K-means。视觉单词并不高端,只是在给定特征描述子空间中的一组向量集,在采用 K-means 进行聚类时得到的视觉单词是聚类质心。用视觉单词直方图来表示图像,则该模型便称为 BOW 模型。
Bag-of-Words模型源于文本分类技术。在信息检索中,它假定对于一个文本,忽略其词序、语法和句法,将其仅仅看作是一个词集合,或者说是词的一个组合。文本中每个词的出现都是独立的,不依赖于其他词是否出现,即在任意一个位置选择词汇都不受前面句子的影响而独立选择的。
使用某种聚类算法(如K-means)将特征进行聚类,每个聚类中心被看作是词典中的一个视觉词汇(Visual Word),相当于文本检索中的词,视觉词汇由聚类中心对应特征形成的码字(code word)来表示(可看当为一种特征量化过程)。所有视觉词汇形成一个视觉词典(Visual Vocabulary),对应一个码书(code book),即码字的集合,词典中所含词的个数反映了词典的大小。图像中的每个特征都将被映射到视觉词典的某个词上,这种映射可以通过计算特征间的距离去实现。然后,统计每个视觉词的出现与否或次数图像可描述为一个维数相同的直方图向量,即Bag-of-Features。在Bag-of-Features方法的基础上,Andrew Zisserman进一步借鉴文本检索中TF-IDF模型(Term Frequency一Inverse Document Frequency)来计算Bag-of-Features特征向量。接下来便可以使用文本搜索引擎中的反向索引技术对图像建立索引,高效的进行图像检索。
Bag-of-Features更多地是用于图像分类或对象识别,鉴于SIFT的优异性能,本文提取的是SIFT特征

1.3 基于BOF的图像检索基本流程

  1. 特征提取
  2. 学习 “视觉词典(visual vocabulary)”
  3. 针对输入特征集,根据视觉词典进行量化
  4. 把输入图像,根据TF-IDF转化成视觉单词(visual words)的频 率直方图
  5. 构造特征到图像的倒排表,通过倒排表快速 索引相关图像
  6. 根据索引结果进行直方图匹配
1.3.1 sift特征提取

该特征提取原理可以参考我之前写过的博文,这里不多写:
sift特征提取
在这里插入图片描述

1.3.2 建立视觉单词

为了将文本挖掘技术运用到图像中,首先要建立视觉等效单词;可以采用SIFT局部描述算子获得,针对输入特征集,根据视觉词典进行量化。建立视觉单词的思想就是将描述算子空间量化成一些典型实例,并将图像中的每个描述算子指派到其中的某个实例中,这些典型实例可通过分析训练图像集确定。即从一个很大的训练集提取特征描述算子,利用一些聚类算法可以构建出视觉单词(聚类算法最常用的是K-means),视觉单词是在给定特征描述算子空间中一组向量集,采用K-means进行聚类得到的聚类质心;把输入图像,根据TF-IDF转化成视觉单词( visual words)的频率直方图 ,用视觉单词直方图来表示图像。如图下所示:
在这里插入图片描述

1.3.3 K-Means算法

关于K-Means算法的原理可以参考下面这篇博文:
Kmeans聚类算法
K值越大,噪声对聚类影响越小,但是K值取过大将无法得出聚类结果,所以聚类时K值的选取要适当。
K-Means算法基本流程:

  • 随机初始化 K 个聚类中心
  • 重复下述步骤直至算法收敛:
  • 对应每个特征,根据距离关系赋值给某个中心/类别
  • 对每个类别,根据其对应的特征集重新计算聚类中心

二、实验

2.1 实验环境

1.ptyhon3.7版本,win10 ,pycharm;
2.由于有用到sift特征提取,所以需要安装vlfeat,我安装的是0.9.20版本。vlfeat的win64里的vl.dll和sift.exe和vl.lib复制在项目里。
3.把PCV包放在项目下
4.安装PyQt5(直接pip就好了,加个镜像快很多,要不然容易超时)
5.安装cherrypy(同样直接pip,用于可视化检索)

2.2实验要求

在这里插入图片描述

2.3实验代码(实验分析也在其中)

1.生成sift特征文件

对每张图片生成相应的.sift文件,及视觉词汇,以便建立BOW模型。我所用的是图像集为104张(自己网络搜索的图片)。如果需要增加图像或减少只需要改代码里读取训练图像的数量,为了让sift特征提取速度变快,我将所有图片的大小调整成统一的大小,并且设置成400*300的分辨率,加快了代码的运行速度。
在这里插入图片描述
数据集

# -*- 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('E:/thirddown/computervision/untitled4/jsjsj/data/')
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])

# 生成词汇
#train的参数为(特征列表,读取图片数,训练数)
voc = vocabulary.Vocabulary('test')
voc.train(featlist, 104, 20)

# 保存词汇
# saving vocabulary
with open('E:/thirddown/computervision/untitled4/jsjsj/data/vocabulary.pkl'
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值