【机器学习 Opencv】Opencv之Bag of Word模型(一)

Bag of Word, 顾名思义,即将某些Word打包,就像我们经常会把类似的物品装到一个柜子,或者即使是随意打包一些物品,也是为了我们能够方便的携带,在对大数据作处理的时候,为了能够方便的携带这些数据中的信息,与其一个一个的处理,还不如打包来的容易一点。
      Bag of Word 因其理论简单,易懂,在vision界得到了广泛的应用,有人将Bag of Word改成Bag of Visual Word来提出,充其量只是炒炒概念罢了,其基本思想还是BOW(bag of Word)
       Anyway, 简单谈一下关于Bag of Word的东西:
      
      Bag of Word实现步骤:
      step 1: 大数据聚类,找到适当的聚类中心点----Vocabulary
      step 2: 训练数据像聚类中心映射,得到每一个训练数据在该聚类空间的一个低维的表示。
      step 3: 得到每一个训练数据的低维表示后,选择适当的分类器训练。
      step 4: 对新来的样本先映射到聚类空间,然后利用得到的分类器进行预测。
      在视觉领域,很希望能够够利用已知的目标捉着图像去得到相关的信息,这在机器人......等领域有着很广泛的应用,所以利用视觉领域中图像检索这一块解释一些基本问题。

      Vocabulary建立(数据聚类):
      以SIFT 128维特征作为例子。例如现在有1000张训练图片,对每一张训练图片都提取SIFT的128特征,那么最终可以得到N(i) * 128的特征,N(i)代表第几张图片特征点的个数,因为图片并非完全相同,所以特征点的个数当然是不一样的。接下来就是建立词典的过程,利用现在常用的一些聚类算法,例如kmeans就OK,选择聚类中心点的个数,1000个也好,10000个也罢,聚类完成后,得到的就是一个1000(10000)*128聚类中心点的空间,称之为词典。
      这个词典就好比一个容器,通俗一点就是一个直方图的基,利用这个基去统计这些训练样本的信息。

      训练样本的映射:
      此时已经得到了一个直方图的基,如下图:
图1:图中,n表示聚类中心点的个数
       用BOW中的文字表示即字典的个数。
      这些直方图的基在像是在空间的一些三维空间的基向量i, j, k,利用这些基向量去构造别的向量,值需要知道特定的系数就行。所以接下来的步骤就是将原始的图像特征(SIFT 128维)向这些基向量作映射,得到相关的系数,如图:
图2:上图给出了两个类别的直方图
      通过相关的映射,得到不同类别直方图的统计,这样整个BOW特征提取过程就算是完全实现了。接下来如何进行匹配,就是选择分类器的问题了。

      分类器的选择:
      其实BOW之所以有bag的意思也是将相似的特征进行打包,得到统计的一个范围,这个范围就是直方图的某一个bin。在进行图像检索的时候,接下来就是进行分类器的训练与识别了,例如朴素贝叶斯分类器,支持向量机之类。一般利用BOW的时候,大多数人还是选择支持向量机这玩意儿,有实验证明BOW结合SVM效果好于其他的分类器。不过,我没做过实验,这里也算提一下。

       新来样本的识别:
      在训练好分类器后,对于新来的样本,同样先提取SIFT特征,然后将SIFT特征映射到上面图1中的词典中去,然后得到的直方图就可以通过分类器进行分类了。如:
图3 新图片的BOW直方图特征
      上图是一张新图映射到词典时得到的直方图,可以看出,这张图片相对于图2的情况而言,更接近类别1,所以通过分类器,理想的状态时判断为1。但是我们都知道,理想状态出现的可能性太小,所以BOW难免会有出错的时候,通过阅读几篇论文,发现BOW的识别率大概在60%-80%之间,当然了一方面是数据量巨大的问题,另外一方面也是因为图像之间的相似度高。所以整体来讲,BOW的识别率还是在可以接受的范围。

      心得:
      其实BOW没有什么特别的理论推导,我觉得仅仅只是将类似SIFT、HOG这些局部特征的统计方法从微观扩展到宏观的过程,利用直方图的统计特性,构造多个词典,利用简单的距离映射,得到每一副图片的BOW的特征,但是这样一个简单的扩展确实最重要的创新点,同时也构造了一个广泛应用的框架。

猜你喜欢

转载自blog.csdn.net/summer_and_opencv/article/details/74330427
今日推荐