训练和测试OpenCV、Matlab中的词袋模型

20
我正在使用SIFT特征在OpenCV中实现词袋模型,以便为特定数据集进行分类。到目前为止,我已经能够聚类描述符和生成词汇表。据我所知,我需要训练SVM...但我有一些问题,我对它们感到非常困惑。主要问题是实现背后的概念,以下是我的问题:
1-当我提取特征然后创建词汇表时,我应该为所有对象(比如说5个对象)提取特征并将它们放在一个文件中,这样我就可以把所有的特征都放在一个词汇文件中吗?之后我如何分开它们进行分类?
2-如何实现SVM?我知道OpenCV中使用的函数,但怎么使用?
3-我可以在MATLAB中完成工作,也就是SVM训练的实现,但是否有任何可用的代码可以指导我的工作?我看过Andrea Vedaldi使用的代码,在这里,但他每次只处理一个类,并且另一个问题是他没有展示如何创建他在练习中使用的.mat文件。我找到的所有其他实现都没有使用SVM。所以,在这一点上,你能指导我吗?
谢谢

1
VLFeat库是一个实现了Matlab中SIFT等功能的优秀库,其中包含了出色的BOW演示和代码。 - Maurits
这个演示在哪里?你提到的网站上只有SIFT。 - Mario
我刚刚看到这个问题,面临着与你一样的麻烦。我发现这个链接非常有用:https://masterravi.wordpress.com/2011/03/17/object-recognition-using-bag-of-features/#comment-262。它还有一个Matlab压缩文件,但是它是为32位处理器构建的。 - roni
2个回答

24

本地特征

当您使用SIFT时,通常希望提取本地特征。这是什么意思?您有您的图像,并从该图像中定位点,从这些点中提取本地特征向量。本地特征向量只是由数字值组成的向量,描述了从中提取的图像区域的视觉信息。虽然您可以从图像A中提取的本地特征向量的数量不需要与您可以从图像B中提取的特征向量的数量相同,但本地特征向量的组成部分(即其维数)始终相同。

现在,如果您想使用本地特征向量对图像进行分类,则会遇到问题。在传统的图像分类中,每个图像都由全局特征向量描述,这在机器学习的上下文中可以看作是一组数字属性。但是,当您提取一组本地特征向量时,您没有每个图像的全局表示,这是图像分类所需的。可以用来解决此问题的技术是词袋,也称为视觉词袋(BoW)。

视觉词袋

以下是(非常)简化的BoW算法:

  1. 从图像集中提取SIFT局部特征向量;
  2. 将所有这些局部特征向量放入单个集合中。此时,您甚至不需要存储每个局部特征向量来自哪个图像;
  3. 应用聚类算法(例如k-means)于局部特征向量集以查找质心坐标并为每个质心分配ID。这组质心将成为您的词汇表;
  4. 全局特征向量将是一个直方图,它计算每个图像中每个质心出现的次数。要计算直方图,请找到每个局部特征向量的最近质心。

图像分类

在此假设您的问题如下:

您的输入是一组带有标签的图像和一组未标记的图像,您想根据其视觉外观为其分配标签。假设您的问题是对景观摄影进行分类。您的图像标签可以是“山脉”,“海滩”或“森林”等。

从每个图像中提取的全局特征向量(即其视觉单词袋)可以看作一组数字属性。这组数字属性表示每个图像的视觉特征,以及相应的图像标签,可以用来训练分类器。例如,您可以使用数据挖掘软件Weka,它具有SVM的实现,称为SMO,来解决您的问题。

基本上,您只需要按照ARFF文件格式格式化全局特征向量和相应的图像标签,这是一种CSV格式,其中包含全局特征向量,后跟图像标签。


答案仍然不完整。我会尝试明天完成它。 - Alceu Costa
我在等你完成它。 - Mario
到目前为止,我已经完成了4个步骤中的3个,我知道我必须创建直方图..但是我真的需要更多关于分类的训练和测试部分的信息,迄今为止你所写的真的很棒。 - Mario
我不知道你已经编辑了这么长时间,因为我没有收到通知。这是一个非常出色的答案,解决了我心中许多问题... 无论如何,我有几个问题要问,它们可能对我和其他人都有用。 - Mario
关于直方图,我按照您的建议做了。我创建了一个包含码本单词的文件,该文件是由10个图像的SIFT特征的100*128向量组成的。我选择了100个单词,因为我想先做简单的,然后再根据我的工作更新它们。我的问题是,以“汽车”为例,这些单词能否用来训练并将其视为阳性样本?“非常简单的训练,仅有两个类别,第二个类别将是“摩托车”。那么我需要创建另一个直方图文件并针对第一个进行训练吗? - Mario
第二个问题是,为什么我必须制作ARFF文件格式,我可以在Matlab中简单地标记它。第一个直方图文件是类“1”,第二个是类“2”,这可能吗? - Mario

11

这里有一篇非常好的文章,介绍了使用OpenCV v2.2进行分类的词袋模型。http://app-solut.com/blog/2011/07/the-bag-of-words-model-in-opencv-2-2/

接下来的文章介绍了使用正态贝叶斯分类器进行图像分类。http://app-solut.com/blog/2011/07/using-the-normal-bayes-classifier-for-image-categorization-in-opencv/

此外,还提供了一个关于Caltech-256数据集的约200行代码演示。http://code.google.com/p/open-cv-bow-demo/downloads/detail?name=bowdemo.tar.gz&can=2&q=

这里有一个直观了解图像分类过程的方法:

http://www.robots.ox.ac.uk/~vgg/share/practical-image-classification.htm

对我来说真的帮助很大,希望能帮到其他人。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接