【计算机视觉-图像检索】


文本挖掘技术

矢量空间模型是一个用于表示和搜索文本文档的模型,它基本上可以用于任何对象类型,包括图像。该名字来源于用矢量来表示文本文档,这些矢量是由文本词频直方图构成的,矢量包含了每个单词出现的次数。由于其忽略了单词出现的顺序及位置,该模型也被称为BOW(Bag-Of-Words)模型。

通过单词计数来构建文档直方图向量v,从而简历文档索引。对于直方图向量中的每个元素,一般根据每个单词的重要性来赋予相应的权重。通常,数据集中一个单词的重要性和它在文档中出现的次数成正比,而与它在语料库中出现的次数成反比。

最常用的权重是tf-idf(term frequency-inverse document frequency,词频-逆向文档频率)
在这里插入图片描述
在这里插入图片描述

视觉单词

为了将文本挖掘技术应用到图像中,我们首先要建立视觉等效单词,这通常可以用SIFT做到。它的思想是将描述子空间量化成一些典型实例,并将图像中的每个描述子指派到其中的某个实例中。这些典型实例可以通过分析训练图像集确定,并被视为视觉单词,视觉单词的集合称为视觉词汇。

BoF(Bag Of Feature)借鉴文本处理的词袋(BoW,Bag Of Bag)算法,将图像表示成视觉关键词的统计直方图。

从一个很大的图像训练集中提取特征描述子,利用一些聚类算法可以构建出视觉单词,在这里采用最常用的K-means。

创建词汇

特征提取

为创建视觉单词词汇,首先需要提取特征描述子,采用SIFT特征描述子。
在这里插入图片描述

学习“视觉字典”

采用K-means来对这些向量进行聚类,聚类后得到这k个向量组成的视觉词典。
在这里插入图片描述

视觉词典的量化

对于图像中的每一个SIFT特征,可以找到一个最相似的视觉单词,这样,我们可以统计一个k维的直方图来代表该图像的ISFT特征在字典中的相似度频率

依据tf-idf生成频率直方图

依据BOW中单词的重要性不一致,可见图像中特征的重要性也不一样,应该降低每张图片都具有的共性特征的权重。
在这里插入图片描述

代码实现

数据集

duck、雨伞、鞋子、鸡

代码

import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift
#获取图像列表
imlist = get_imlist(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet')
nbr_images = len(imlist)
print('nbr_images:',nbr_images)
#获取特征列表
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('Image')
voc.train(featlist, 200, 10)#调用了PCV的vocabulary.py中的train函数
#保存词汇
with open(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet\vocabulary.pkl', 'wb') as f:
    pickle.dump(voc, f)#将生成的词汇保存到vocabulary.pkl(f)中
print ('vocabulary is:', voc.name, voc.nbr_words)

运行之后生成了.sift文件和.pkl文件
在这里插入图片描述

在这里插入图片描述

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(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet')
nbr_images = len(imlist)

#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

#载入词汇
with open(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet\vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)
    
#创建索引
indx = imagesearch.Indexer('testImaAdd1.db',voc)
indx.create_tables()

#遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:110]:
    locs,descr = sift.read_features_from_file(featlist[i])
    indx.add_to_index(imlist[i],descr)
    
#提交到数据库
indx.db_commit()
con = sqlite.connect('testImaAdd1.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

#载入图像列表
imlist = get_imlist(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet')
nbr_images = len(imlist)

#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

#载入词汇
with open(r'C:\Users\lenovo\Desktop\Code-resource\ImageSet\vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)
src = imagesearch.Searcher('testImaAdd1.db',voc)

#查询图像索引和查询返回的图像数
q_ind = 47
nbr_results = 5

# 常规查询(按欧式距离对结果排序)
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 matches
    matches = 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 count
    rank[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]) #重排后的结果

检索测试后匹配结果偶有偏差,但大体上能匹配正确
在这里插入图片描述
在这里插入图片描述
错匹配出现的情况很多,譬如鸡匹配鞋,雨伞匹配duck……
鸡匹配鞋我还能稍稍理解,毕竟鞋子的纹路和鸡的羽毛的特征相近,至于雨伞匹配duck嘛……留后再议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像检索是指在图像库中根据用户的需求查找相应的图像。基于深度学习的图像检索算法近年来得到了快速发展,取得了优秀的检索效果。 本文将介绍一种基于深度学习的图像检索算法,该算法主要基于卷积神经网络(CNN)和循环神经网络(RNN)进行图像特征提取和相似度计算。该算法的主要步骤包括图像预处理、CNN特征提取、RNN编码和相似度计算。 首先,对于输入的图像,需要进行预处理操作,包括图像缩放、裁剪、归一化等。预处理后的图像可以作为CNN的输入。 其次,使用预训练的CNN模型(如VGG、ResNet等)对输入的图像进行特征提取。CNN模型通常包含多个卷积、池化和全连接层,可以有效地提取图像的局部和全局特征。在本算法中,我们将CNN的中间层输出作为图像的特征表示。 接着,将CNN提取的特征输入到RNN中进行编码。RNN是一种递归神经网络,可以对序列数据进行建模。在本算法中,我们将CNN提取的特征序列作为RNN的输入,通过RNN编码得到图像的最终特征表示。 最后,使用余弦相似度计算两个图像之间的相似度。余弦相似度是一种常用的相似度计算方法,可以衡量两个向量之间的夹角余弦值,值越大表示两个向量越相似。在本算法中,我们将图像的特征向量作为余弦相似度的输入,得到两个图像之间的相似度分数。 在实验中,我们使用了一个包含数千张图像的数据集进行评估。实验结果表明,本算法可以在较短的时间内实现高效的图像检索,并且具有较好的检索效果。同时,在实验中,我们还比较了不同的CNN模型和RNN结构对检索效果的影响,得到了一些有价值的结论。 代码实现方面,我们使用了Python编程语言和深度学习框架TensorFlow。代码主要分为数据预处理、CNN特征提取、RNN编码和相似度计算四个部分。具体实现细节可以参考代码仓库(链接待补充)。 总的来说,基于深度学习的图像检索算法是一种非常有前景的研究方向,可以为图像检索领域带来更加高效和精确的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值