一.实验内容
- BOW(Bag of words)模型:使用一组无序的words来表示一段文字或者一个文档。近年被广泛应用于计算机视觉中。
基本思想:是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是将每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后根据袋子里装的词汇对其进行分类。 - Bag of words-> Bag of features
特征袋BOF是词袋BOW的一种改进,用于图像处理问题。将BOW的思想引入到图像中来,words在图像中用一种特定的特征描述子来代替,但这样完全忽略了图像的空间布局关系。
- Bag of features模型的构建
按照Bag of Features算法的思想,我们要找到图像中的关键词,这些关键词必须具备较高的区分度,通常会采用「SIFT」特征。
有了特征之后,我们会将这些特征通过聚类算法得出很多聚类中心。这些聚类中心通常具有较高的代表性。典型的聚类算法有k-means算法。我们将这些聚类中心组合在一起,形成一部字典。 - 训练字典( visual vocabulary )
提取完特征后,由于提取的特征点太多,不适合做分析操作,我们会采用一些聚类算法对这些特征向量进行聚类。最常用的聚类算法是 k-means。
聚类完成后,我们就得到了这 k 个向量组成的字典,这里每个类,我们就称为一个词(codeword)。
这时,所有的类(词codeword)就会构成词典(codebook) - 直方图表示:根据字典重新提取图像的高层特征,对于图像中的每一个SIFT特征,都可以在字典中找到一个最相似的visual word,这样我们可以统计一个 k 维的直方图(或者K维的特征向量),代表该图像的SIFT特征在字典中的相似度频率。
- 训练分类器:当我们得到每幅图片的直方图向量(反映了字典各词出现的频率)后,接下来就是传统的分类问题,训练分类器模型。对于需要预测的图片,先一样的提取sift特征,再根据字典量化直方图向量,用分类器模型对直方图进行分类,常用的方法有SVM。
- 引入TF-IDF权值:TF-IDF 最早是在文献检索领域中被提出的,用关键字检索文章为例,一般关键词的词频越高,文章相关性越强。词频(Term Frequency)就是TF-IDF中的TF。
但是这样的话可能会造成不想关的词汇频率很高的问题,例如汉语中的“的,地,得”等。所以要对其进行忽略。
齐次,对一些对于检索没有帮助,所以我们要对词赋予权重,通用的词汇赋予较小的权重,预测能力较强的词汇权重较大,因为它们更加容易锁定目标。IDF(Inverse Document Frequency):如果文件数据库中包含词语A的文件越少,则IDF越大,则说明词语A具有很好的类别区分能力。 - 加权 BOF:将TF-IDF思想应用在图像检索中,为了更精确地度量相似性,我们也在原来直方图向量的基础上,为向量的每一项增加权重。
- 倒排索引:倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
二.实验步骤
-
构造不小于 100张图片的数据集
-
针对数据集,做SIFT特征提取
-
针对数据集,调用PCV下imagesearch中的文件vocabulary.py,创建一个词汇类,以及在训练图像数据集上训练出一个词汇。train()函数是从文件中读取特征然后将所有特征并在一起,以便进行K-means聚类。根据SIFT特征提取结果,采用k-means算法产生“视觉词典. (visual vocabulary)”。
-
针对数据库中每张图片的特征集,根据视觉词典进行量化 以及TF-IDF解算。每张图片转化成特征向量。
-
根据IDF原理,计算每个视觉单词的权
-
对于输入的检索图像(非数据库中图片),计算SIFT特征,并根据TF-IDF转化成频率直方图/特征向量(步骤1,5)
-
建立索引,在索引前要建立一个数据库来保存之前生成的视觉单词形成的频率直方图/特征向量,构造检索图像特征到数据库图像的倒排表,快速索引相关候选匹配图像集。这里使用了SQlite作为数据库。
-
加入图像建立图像数据库,实现方法为在pcv包的imagesearch.py 文件里的add_to_index()方法,此方法主要是获取一幅带有特征描述子的图像,投影到词汇上添加进数据库中。
-
针对候选匹配图像集与检索图像进行直方图特征匹配。
三.代码实现
(1)提取sift特征,用于建立BOW模型,将数据保存