我正在使用SIFT功能在opencv中实现Bag Of Words,以便对特定数据集进行分类。到目前为止,我一直是苹果集群描述符并生成词汇。据我所知,我必须训练SVM ...但我有一些问题,我真的很困惑他们。主要问题是实现背后的概念,这些是我的问题:
1-当我提取特征然后创建词汇表时,我是否应该提取所有对象的特征(比如5个对象)并将它们放在一个文件中,所以我将它们全部放在一个词汇表文件中有所有的话?以及在我进行分类时如何将它们分开?
2-如何实施SVM?我知道openCV中使用的函数但是如何?
3-我可以在MATLAB中完成工作,我的意思是SVM培训的实施,但有没有可用的代码可以指导我完成我的工作?我已经看过Andrea Vedaldi使用的代码, here但他每次只使用一个类,而另一个问题是他没有展示如何创建他在练习中使用的.mat文件。我能找到的所有其他实现,他们都没有使用SVM。所以,你能指导这一点吗?
谢谢
答案 0 :(得分:24)
使用SIFT时,通常需要提取本地功能。这意味着什么?您有图像,从该图像中可以找到从中提取局部特征向量的点。局部特征向量只是由数值组成的向量,该数值描述从中提取它的图像区域的视觉信息。虽然可以从图像A中提取的局部特征向量的数量不需要与可以从图像B中提取的特征向量的数量相同,但是局部特征向量的数量分量(即其维数)始终是同样的。
现在,如果您想使用本地特征向量对图像进行分类,则会出现问题。在传统的图像分类中,每个图像由全局特征向量描述,在机器学习的上下文中,可以将其视为一组数字属性。但是,当您提取一组局部特征向量时,您没有图像分类所需的每个图像的全局表示。可以用来解决这个问题的技巧就是一袋词,也被称为视觉词袋(BoW)。
这是(非常)简化的BoW算法:
从您的图像集中提取SIFT局部特征向量;
将所有这些局部特征向量放入一个集合中。此时,您甚至不需要存储从中提取每个局部特征向量的图像;
在局部特征向量集上应用聚类算法(例如k均值),以便找到质心坐标并为每个质心指定一个id。这组质心将是你的词汇;
全局特征向量将是一个直方图,用于计算每个图像中每个质心出现的次数。要计算直方图,请找到每个局部特征向量的最近质心。
我假设您的问题如下:
您输入一组带标签的图像和一组未标记的图像 您想要根据其视觉分配标签的图像 出现。假设你的问题是对风景摄影进行分类。 您的图像标签可以是,例如,“山”,“海滩”或 “森林”。
从每个图像(即,其视觉词袋)中提取的全局特征向量可以被视为一组数字属性。表示每个图像的视觉特性的这组数值属性和相应的图像标签可用于训练分类器。例如,您可以使用数据挖掘软件,例如Weka,它具有SVM实现(称为SMO)来解决您的问题。
基本上,您只需要根据ARFF file format格式化全局特征向量和相应的图像标签,{{3}}基本上是全局特征向量的CSV,后跟图像标签。
答案 1 :(得分:11)
这是一篇非常好的文章,介绍使用OpenCV v2.2进行分类的Bag of Words模型。 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
真的帮我澄清了很多问题。我希望它对某人有帮助。 :)