参考资料:
https://blog.csdn.net/polly_yang/article/details/8241471
https://blog.csdn.net/tiandijun/article/details/51143765
https://blog.csdn.net/gdengden/article/details/80702007
https://blog.csdn.net/silence2015/article/details/77374910
http://yongyuan.name/blog/CBIR-BoW-for-image-retrieval-and-practice.html
Content-Based Image Retrieval using Local Features Descriptors and Bag-of-Visual Words
Mohammed Alkhawlani Ibb University, Ibb, Yemen
Mohammed Elmogy, Dept. of Information Technology, Faculty of Computers and Information, Mansoura University, Mansoura, Egypt
Hazem Elbakry, Dept. of Information Systems, Faculty of Computers and Information, Mansoura University, Mansoura, Egypt
利用bow模型构建图像检索系统:
BOW适用于图像分类,训练集一般是已分类的图像,学习其特征再将不同种类图像特征进行聚类;输入一张图片可将其准确划分到对应的分类当中;
讲bow运用到图像检索中,同一类的图片一般认为是相似的或者语义相似的,我们返回与查询图片同一类的图片集作为相似图片;
流程:训练集进行SIFT/SURF特征提取–>KMeans构建视觉码本–>图像量化,用视觉码本表示–>图像检索
为什么要用BOW模型描述图像?
SIFT特征虽然也能描述一幅图像,但是每个SIFT矢量都是128维的,而且一幅图像通常都包含成百上千个SIFT矢量,在进行相似度计算时,这个计算量是非常大的,通行的做法是用聚类算法对这些矢量数据进行聚类,然后用聚类中的一个簇代表BOW中的一个视觉词,将同一幅图像的SIFT矢量映射到视觉词序列生成码本,这样每一幅图像只用一个码本矢量来描述,这样计算相似度时效率就大大提高了。
1.BOW原理
Bag-of-words模型是信息检索领域常用的文档表示方法。在信息检索中,BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。例如有如下两个文档:
1:Bob likes to play basketball, Jim likes too.
2:Bob also likes to play football games.
基于这两个文本文档,构造一个词典:
Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”, 8. “games”, 9. “Jim”, 10. “too”}。
这个词典一共包含10个不同的单词,利用词典的索引号,上面两个文档每一个都可以用一个10维向量表示(用整数数字0~n(n为正整数)表示某个单词在文档中出现的次数):
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0]
向量中每个元素表示词典中相关元素在文档中出现的次数(下文中,将用单词的直方图表示)。不过,在构造文档向量的过程中可以看到,我们并没有表达单词在原来句子中出现的次序(这是本Bag-of-words模型的缺点之一,不过瑕不掩瑜甚至在此处无关紧要)。
将Bag-of-words模型应用于图像表示。为了表示一幅图像,我们可以将图像看作文档,即若干个“视觉词汇”的集合,同样的,视觉词汇相互之间没有顺序。
这里袋子中的视觉特征是通过①特征点检测②特征提取得到的。这里我们提取SIFT特征。
2.SIFT提取视觉特征
同一类目标的不同实例之间虽然存在差异,但我们仍然可以找到它们之间的一些共同的地方,比如说人脸,虽然说不同人的脸差别比较大,但眼睛,嘴,鼻子等一些比较细小的部位,却观察不到太大差别,我们可以把这些不同实例之间共同的部位提取出来,作为识别这一类目标的视觉词汇。
利用SIFT算法,从每类图像中提取视觉词汇,将所有的视觉词汇集合在一起,现在有三个目标类,分别是人脸、自行车和吉他。
3.KMeans创建视觉码本
K-Means算法是一种基于样本间相似性度量的间接聚类方法,此算法以K为参数,把N个对象分为K个簇,以使簇内具有较高的相似度,而簇间相似度较低。利用K-Means算法将词义相近的词汇合并,作为视觉码本中的基础词汇,假定我们将K设为4,
4.图像量化
利用视觉码本的中词汇表示图像。利用SIFT算法,可以从每幅图像中提取很多个特征点,这些特征点都可以用单词表中的单词近似代替,通过统计单词表中每个单词在图像中出现的次数,可以将图像表示成为一个K=4维数值向量。
针对人脸、自行车和吉他这三个文档,抽取出相似的部分(或者词义相近的视觉词汇合并为同一类),构造一个词典,词典中包含4个视觉单词,即Dictionary = {1:”自行车”, 2. “人脸”, 3. “吉他”, 4. “人脸类”},最终人脸、自行车和吉他这三个文档皆可以用一个4维向量表示,最后根据三个文档相应部分出现的次数画成了上面对应的直方图。
统计这些词汇在不同目标类中出现的次数可以得到每幅图像的直方图表示:
人脸: [3,30,3,20]
自行车:[20,3,3,2]
吉他: [8,12,32,7]
图像训练模型至此构建完毕,现在可以利用构建的视觉码本进行图像分类聚类。
输入quary_image,提取SIFT特征,用视觉码本表示,得到图像所在的分类。
两个非常好的介绍BOW的ppt:
1.https://wenku.baidu.com/view/6370f28d26fff705cc170aab.html
2.https://wenku.baidu.com/view/7782de2fc281e53a5902ff03.html