一、BOW原理
最初的Bag of words,也叫做“词袋”。Bag of words模型是信息检索领域常见的文档表示方法。在信息检索中,假设一个文本,忽视它的词序和语法等要素,将其仅仅看作是一个词集合,文本中每个词的出现都是独立的。然后根据文本中的词频分布,构造文本描述子。
例如:文本1:Tom likes to eat cake, Jake likes too.
文本2:Tom likes to eat fruit .
基于这两个文本,构造一个词典:
dictionary={1:“Tom”,2:“likes”,3:“to”,4,:“eat”,5:“cake”,6:“fruit”,7:“Jake”,8:“too”}
这个词典一共包含8个不同的单词,利用词汇中的索引号,上面的两个文档每一个都可以用一个8维的向量表示某词在文档中出现的次数。
文本1:【1,2,1,1,1,0,1,1】
文本2:【1,1,1,1,0,1,0,0】
然后根据每个单词在文本中出现的权重,便可构造单词的频率直方图。
二、将Bag of words模型应用到图像检索中
为了表示一幅图像,我们可以将图像看作文档,即若干个“视觉词汇”的集合,同样的,视觉词汇之间没有顺序。
1、特征提取
由于图像中的词汇不像文本文档那样是现成的单词,所以我们首先要从图像中提取出相互独立的视觉词汇。然后为创建视觉单词词汇,第一步要做的就是提取特征描述子。
SIFT算法是提取图像中局部不变特征的应用最广的算法,所以我们可以采用SIFT算法才进行特征提取,SIFT特征的具体原理分析,请参见博客:https://blog.csdn.net/sinat_37751993/article/details/88578410
然后将每幅图像提取出的描述子保存在一个文件中,构建视觉词典
2、学习 “视觉词典(visual vocabulary)”
聚类是实现 visual vocabulary /codebook的关键 ,最常见的聚类方法就是,K-means 聚类算法。
(1)随机初始化 K 个聚类中心
(2)对应每个特征,根据距离关系赋值给某个中心/类别 。其中距离的计算可采用欧式距离:
(3)对每个类别,根据其对应的特征集重新计算聚类中心
重复(2)(3)步骤,直至算法收敛
3、 针对输入特征集,根据视觉词典进行量化
对于输入特征,量化的过程是将该特征映射到距离其最接近的视觉单词,并实现计数 。选择合适的视觉词典的规模是我们需要考虑的问题,若规模太少,会出现视觉单词无法覆盖所有可能出现的情况 。若规模太多,又会计算量大,容易过拟合 。只能通过不断的测试,才能找到最合适的词典规模。
4、把输入图像转化成视觉单词(visual words) 的频率直方图
利用SIFT算法,可以从每幅图像中提取很多特征点,通过统计每个视觉单词在词汇中出现的次数,可以得到如下直方图,(假设词汇中只有四个视觉单词)