计算机视觉——Bag of features:图像检索作业

1、实验需求

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、语言和平台

语言:python2.7.13 (anaconda2)
平台:pycharm 2018.2

3、实验原理

Bag of Feature 算法
1、Bag-of-Features模型仿照文本检索领域的Bag-of-Words方法,把每幅图像描述为一个局部区域/关键点(Patches/Key Points)特征的无序集合。使用某种聚类算法(如K-means)将局部特征进行聚类,每个聚类中心被看作是词典中的一个视觉词汇(Visual Word),相当于文本检索中的词,视觉词汇由聚类中心对应特征形成的码字(code word)来表示(可看当为一种特征量化过程)。所有视觉词汇形成一个视觉词典(Visual Vocabulary),对应一个码书(code book),即码字的集合,词典中所含词的个数反映了词典的大小。图像中的每个特征都将被映射到视觉词典的某个词上,这种映射可以通过计算特征间的距离去实现,然后统计每个视觉词的出现与否或次数,图像可描述为一个维数相同的直方图向量,即Bag-of-Features。

2、Bag-of-Features更多地是用于图像分类或对象识别。对训练集提取Bag-of-Features特征,在某种监督学习(如:SVM)的策略下,对训练集的Bag-of-Features特征向量进行训练,获得对象或场景的分类模型;对于待测图像,提取局部特征,计算局部特征与词典中每个码字的特征距离,选取最近距离的码字代表该特征,建立一个统计直方图,统计属于每个码字的特征个数,即为待测图像之Bag-of-Features特征;在分类模型下,对该特征进行预测从实现对待测图像的分类。

Bag of Feature 算法过程
1、特征提取(sift)
局部特征提取:通过分割、密集或随机采集、关键点或稳定区域、显著区域等方式使图像形成不同的patches,并获得各patches处的特。其中,SIFT特征较为流行。
2、构建视觉词典
由聚类中心代表的视觉词汇形成视觉词典:
在这里插入图片描述
3、生成码书,即构造Bag of Features特征,也即局部特征投影过程:
在这里插入图片描述
4、SVM训练BOF特征得分类模型,对待测图像BOF特征预测:
在这里插入图片描述
实现检索的过程同分类的过程无本质的差异,更多的是细节处理上的差异:
1、局部特征提取;
2、构建视觉词典;
3、生成原始BOF特征;
4、引入TF-IDF权值:TF-IDF是一种用于信息检索的经常使用加权技术,在文本检索中。用以评估词语对于一个文件数据库中的当中一份文件的重要程度。词语的重要性随着它在文件里出现的频率成正比添加,但同一时候会随着它在文件数据库中出现的频率成反比下降。TF的主要思想是:假设某个关键词在一篇文章中出现的频率高。说明该词语能够表征文章的内容。该关键词在其它文章中非常少出现,则觉得此词语具有非常好的类别区分度,对分类有非常大的贡献。IDF的主要思想是:假设文件数据库中包括词语A的文件越少。则IDF越大,则说明词语A具有非常好的类别区分能力。
词频(Term Frequency。TF)指的是一个给定的词语在该文件里出现的次数。如:tf = 0.030 ( 3/100 )表示在包括100个词语的文档中, 词语’A’出现了3次。
逆文档频率(Inverse Document Frequency。IDF)是描写叙述了某一个特定词语的普遍重要性。假设某词语在很多文档中都出现过,表明它对文档的区分力不强,则赋予较小的权重;反之亦然。

4、代码

Visualdictionary.py
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:/PyCharm/dictionary/')
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('D:/PyCharm/dictionary/vocabulary.pkl', 'wb') as f:
    pickle.dump(voc, f)
print ('vocabulary is:', voc.name, voc.nbr_words)

Submitdata.py
遍历所有的图像,将它们的特征投影到词汇并提交到数据库

# -*- 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('D:/PyCharm/dictionary/')
nbr_images = len(imlist)
#获取特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

# load vocabulary
#载入词汇
with open('D:/PyCharm/dictionary/vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)
#创建索引
indx = imagesearch.Indexer('testImaAdd3.db',voc)
indx.create_tables()
# go through all images, project features on vocabulary and insert
    #遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:1000]:
    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('testImaAdd3.db')
print (con.execute('select count (filename) from imlist').fetchone())
print (con.execute('select * from imlist').fetchone())

Traversal
总代码,开始查找

# -*- 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('D:/PyCharm/dictionary/')
nbr_images = len(imlist)
#载入特征列表
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

#载入词汇
with open(r'D:/PyCharm/dictionary/vocabulary.pkl', 'rb') as f:
    voc = pickle.load(f)

src = imagesearch.Searcher('testImaAdd3.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 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[:8]) #常规查询
imagesearch.plot_results(src,res_geom[:8]) #重排后的结果

5、结果与分析

实验所用图片
在这里插入图片描述
生成的sift文件
在这里插入图片描述
生成视觉词典
在这里插入图片描述
生成数据库文件
在这里插入图片描述
实验结果
测试组1
测试图片
在这里插入图片描述
5张相关候选匹配图像集
常规查询
在这里插入图片描述
用单应性进行拟合建立RANSAC模型:
在这里插入图片描述
分析:图片为插座。整张图片基本以白色为主体。测试结果不错,能够匹配到5张相关图片。常规查询和ransac模型查询结果顺序不太一样。
测试组2
测试图片
在这里插入图片描述
5张相关候选匹配图像集
常规查询
在这里插入图片描述
用单应性进行拟合建立RANSAC模型:
在这里插入图片描述
分析:图片为建筑。整张图片广角拍摄,中间有经过旋转,调色,变成不同的图片。运行结果不错,常规查询和ransac模型查询结果顺序不太一样。

测试组3
测试图片
在这里插入图片描述
5张相关候选匹配图像集
常规查询
在这里插入图片描述
用单应性进行拟合建立RANSAC模型:
在这里插入图片描述
分析:图片为一本书。室内,从不同角度拍摄。运行结果不错,常规查询和ransac模型查询结果顺序不太一样。

测试组4
测试图片
在这里插入图片描述
5张相关候选匹配图像集
常规查询
在这里插入图片描述
用单应性进行拟合建立RANSAC模型:
在这里插入图片描述
分析:图片为客厅。室内,从不同角度拍摄。运行结果不错,常规查询和ransac模型查询结果顺序不太一样。
测试组5
测试图片
在这里插入图片描述
5张相关候选匹配图像集
常规查询
在这里插入图片描述
用单应性进行拟合建立RANSAC模型:
在这里插入图片描述
分析:图片和实验组2是同一个建筑,只不过不同角度拍摄,但是匹配到的结果却不一样。而且很明显有错误,匹配到了几张与其不相关的图片。

6、小结与遇到的问题

1、通过以上实验结果,一般来说,只要是ransac能查询正确的图片,常规查询也能正确查到,但顺序可能会不太一样,因为ransac的匹配点更‘’优秀”;若常规查询查询不正确的话,ransac模型查询也查询不正确。
2、虽然会出差错,结果大致是准确。但是数据集不够大,不够100张图片,数据词典数据库都不够完善。
3、出现错误:
在这里插入图片描述
解决办法:点击图片中的蓝体字进入该py函数
在这里插入图片描述
把红框中的这一行,改为如下即可
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值