20

我正在通过使用 SIFT 功能在 opencv 中实现 Bag Of Words,以便对特定数据集进行分类。到目前为止,我一直在对描述符进行聚类并生成词汇表。据我所知,我必须训练 SVM ......但我有一些问题我真的很困惑。主要问题是实现背后的概念,这些是我的问题:

1-当我提取特征然后创建词汇表时,我是否应该提取所有对象(比如说 5 个对象)的特征并将它们放在一个文件中,所以我将它们全部放在一个词汇表文件中,其中包含所有字?以及稍后在进行分类时如何将它们分开?

2-如何实现SVM?我知道 openCV 中使用的函数,但如何?

3- 我可以在 MATLAB 中完成工作,我的意思是 SVM 培训的实施,但是有没有可用的代码可以指导我完成工作?我在这里看到了 Andrea Vedaldi 使用的代码,但他每次只使用一个类,另一个问题是他没有展示如何创建他在练习中使用的 .mat 文件。我能找到的所有其他实现,它们都没有使用 SVM。那么,您也可以在这一点上进行指导吗!

谢谢

4

2 回答 2

24

当地特色

使用 SIFT 时,您通常希望提取局部特征。那是什么意思?您有您的图像,并且从该图像中您将找到要从中提取局部特征向量的点。局部特征向量只是一个由数值组成的向量,描述了从中提取它的图像区域的视觉信息。尽管可以从图像 A 中提取的局部特征向量的数量不必与可以从图像 B 中提取的特征向量的数量相同,但局部特征向量的数量分量(即其维数)始终是相同。

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

视觉词袋

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

  1. 从您的图像集中提取 SIFT 局部特征向量;

  2. 将所有这些局部特征向量放入一个集合中。此时,您甚至不需要存储每个局部特征向量是从哪个图像中提取的;

  3. 在一组局部特征向量上应用聚类算法(例如 k-means),以便找到质心坐标并为每个质心分配一个 id。这组质心将成为您的词汇;

  4. 全局特征向量将是一个直方图,它计算每个质心在每个图像中出现的次数。要计算直方图,请为每个局部特征向量找到最近的质心。

图像分类

在这里,我假设您的问题如下:

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

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

基本上,您只需要根据ARFF 文件格式格式化全局特征向量和相应的图像标签,这基本上是一个全局特征向量的 CSV,后跟图像标签。

于 2012-07-24T02:16:14.283 回答
11

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

关于使用 Normal Bayes Classifier 进行图像分类的后续文章。 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

真的帮我澄清了很多问题。我希望它可以帮助某人。:)

于 2012-09-27T04:42:04.093 回答