BoW实现图像分类报告

在一般图像处理中常用的几种特征有:
SIFTSURFORBOpponentColor
对一张图片,其存在以上几类不同的特征点,这些特征点具有尺度不变性,所以放大缩小或者旋转,都不影响特征点的匹配。

因此,我们可以认为

将训练集中一张图片上的所有相应特征提取出来,进行分类学习。那么对于测试集合中的图片,我们可以根据其中所有的特征点属于某一类的概率,计算出这张图片最有可能属于的类。


但是,这样的做法确是低效的,而且效果不良好的。

主要原因有(不妨假定,我们现在提取的是SIFT特征):

  • 每张图片都有成千个SIFT特征,因此1000张的测试图片提取出来的特征向量可能有超过1e6个。数据量过于庞大。
  • 每张图片中本身存在一些实际上为噪音的特征点。比如,背景上的SIFT特征,对于我们的分类本身属于一定程度的干扰,当然我们可以对SIFT特征进行一些筛选。
  • 每张图片能提取出的SIFT特征数目与图片的大小有关。在实际测试中,比较大的图片上,比如fruits等等类的图片可以有几千个特征点,而bear类因为每张图片比较小只有几百个特征点。这样会导致训练数据的失衡。(此处的SIFT特征还没有筛选)

针对上述问题,我们使用的是bag-of-words的方法来对每张图片提取特征。其主要的思路如下:

(1)依然是对每张图片提取其特征点,比如提取了SIFT特征点
(2)对所有图片的所有的SIFT特征点,整体进行kmeans聚类,将词划分成多个不同的类,类的个数定义为wordCount。
(3)对每张图片,计算不同的类的SIFT特征的个数,对应所要得到的特征向量中的一个维度。则我们可以对每张图片生成一个wordCount维的向量。


形象的理解bag-of-words可以这么看。
比如对于两张狗的照片:


BoW实现图像分类报告_第1张图片
dog1
BoW实现图像分类报告_第2张图片
dog2

它们两个是不同的。如果把眼睛部分截取出来,作为一个单词,相似度就会很高。而这两点相似度很高的局部,对应的SIFT特征也是很高的匹配度的。


BoW实现图像分类报告_第3张图片
word
word

对所有的狗来讲,可能每个与dog eye这个词有关SIFT特征都会出现一次或者多次,而在其他类里面很可能这个词有关的特征就不会出现。

所以我们可以认为所有的SIFT特征是可以划分出不同的类的,也就是不同的词(比如dog eye),这些被划分出来的词在不同的类中的出现频率是不一样的。而这个分类,我们使用kmeans实现。

那么,比如狗、世界杯、枪的特征通过聚类,可以被划分成如下的单词本。

BoW实现图像分类报告_第4张图片
words

则相应的,比如dog类在dogeye维度上的频率就会更高一些,worldcup在football维度上频率会更高一些。


最后,使用的是SIFT+BoW模型+线性SVM,结果如下:
(截图here)

其实并没有那么理想,也是在意料之中的,因为对文本来讲单词的顺序也许不是那么重要。但对于图像来讲,图像的结构还是很重要的,而我们在从使用SIFT特征开始就已经破坏了图像的结构特征。所以这也是这种方法不能得到完美的原因。

你可能感兴趣的:(BoW实现图像分类报告)