我通过使用 SIFT 功能在 opencv 中实现词袋,以便对特定数据集进行分类。到目前为止,我一直很擅长对描述符进行聚类并生成词汇表。据我所知,我必须训练 SVM ......但我有一些问题我真的很困惑。主要问题是实现背后的概念,这些是我的问题:
1- 当我提取特征然后创建词汇表时,我是否应该提取所有对象(假设 5 个对象)的特征并将它们放在一个文件中,所以我将所有这些都放在一个词汇表文件中有所有的话吗?以及稍后进行分类时如何将它们分开?
2-如何实现支持向量机?我知道 openCV 中使用的函数,但如何使用?
3- 我可以在 MATLAB 中完成工作,我的意思是实现 SVM 训练,但是是否有可用的代码可以指导我完成我的工作?我看过 Andrea Vedaldi 使用的代码, here但他每次只上一节课,另一个问题是他没有展示如何创建他在练习中使用的 .mat 文件。我能找到的所有其他实现都没有使用 SVM。那么,您也可以在这一点上进行指导吗?
谢谢
最佳答案
地方特色
使用 SIFT 时,您通常希望提取局部特征。这是什么意思?你有你的图像,你将从这个图像中找到你将从中提取局部特征向量的点。局部特征向量只是一个由数值组成的向量,描述了从中提取它的图像区域的视觉信息。尽管您可以从图像 A 中提取的局部特征向量的数量不需要与您可以从图像 B 中提取的特征向量的数量相同,但是局部特征向量的分量数(即它的维数)总是一样。
现在,如果您想使用局部特征向量对图像进行分类,您就会遇到问题。在传统的图像分类中,每个图像都由一个全局特征向量来描述,在机器学习的上下文中,可以将其视为一组数字属性。但是,当您提取一组局部特征向量时,您没有图像分类所需的每个图像的全局表示。可以用来解决这个问题的技术是词袋,也称为视觉词袋 (BoW)。
视觉词袋
这是(非常)简化的 BoW 算法:
从您的图像集中提取 SIFT 局部特征向量;
将所有这些局部特征向量放入一个集合中。此时你甚至不需要存储每个局部特征向量是从哪张图像中提取的;
对局部特征向量集应用聚类算法(例如 k-means)以找到质心坐标并为每个质心分配一个 ID。这组质心将成为您的词汇;
全局特征向量将是一个直方图,计算每个质心在每个图像中出现的次数。要计算直方图,请为每个局部特征向量找到最近的质心。
图像分类
这里我假设你的问题如下:
You have as input a set of labeled images and a set of non-labeled images which you want to assign a label based on its visual appearance. Suppose your problem is to classify landscape photography. You image labels could be, for example, “mountains”, “beach” or “forest”.
从每个图像中提取的全局特征向量(即它的视觉词袋)可以看作是一组数字属性。这组代表每幅图像视觉特征的数值属性和相应的图像标签可以用来训练分类器。例如,您可以使用 Weka 等数据挖掘软件。 ,它有一个 SVM 的实现,称为 SMO,可以解决您的问题。
基本上,你只需要根据 ARFF file format 格式化全局特征向量和相应的图像标签。 ,基本上是全局特征向量的 CSV 后跟图像标签。
关于matlab - 词袋训练和测试opencv,matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11602577/