【问题标题】:Bag of words training and testing opencv, matlab词袋训练和测试opencv、matlab
【发布时间】:2024-04-21 04:15:01
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • VLFeat 库,它为 Matlab 实现了 SIFT 等,有一个出色的 BOW demo 代码。
  • 这个演示在哪里?在您提到的网站中只有 sift
  • 我刚看到这个问题,遇到了和你一样的麻烦。发现此链接非常有用:masterravi.wordpress.com/2011/03/17/…。它还有一个 matlab zip 文件,但它是为 32 位处理器构建的。

标签: matlab opencv image-processing matlab-cvst object-recognition


【解决方案1】:

局部特征

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

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

视觉词袋

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

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

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

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

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

图像分类

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

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

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

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

【讨论】:

  • 答案仍然不完整。我明天会努力完成它。
  • 我在等你完成它
  • 到目前为止,我已经完成了 4 个步骤中的 3 个,并且我知道我必须创建直方图 .. 但是我真的需要了解更多关于分类的训练和测试部分的信息, ,到目前为止你写的东西真是太棒了..
  • 我很长一段时间都不知道你编辑这个,因为我没有收到任何通知,这是一个非常棒的答案,它向我宣布了这么多问题在我脑海中浮现......无论如何,我几乎没有问题要问,它们可能对我和其他人有用..
  • 问题,我已经做了你所说的直方图,我创建了一个文件,其中包含一个码本单词,它是 100*128 的向量,来自 10 个图像的 SIFT 特征,我做到了100 个单词,因为我想做简单的单词,然后用我的工作更新它,所以我的问题是,这些单词让我们说对象“汽车”我可以训练它们并将它们假设为正样本吗? “因为非常简单的训练只有两节课,而第二节课让我们说摩托车”..所以我必须制作另一个直方图文件并针对第一个进行训练?
【解决方案2】:

这是一篇非常好的文章,介绍了使用 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

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

【讨论】: