使用具有关键点的 SVM

Use a SVM with Key Points

所以我遇到了与此 post 中讨论的相同的问题。

Training of SVM classifier using SIFT features

我阅读了很多关于此的教程和 posts,但我对词袋模型、如何将我的描述符放入其中以及如何使用它训练 SVM 有一些理解问题。

在我当前项目的前一步中,我使用了 HOG+SVM,如果我的训练矩阵,每张图像都是一行。在我提取我的 HOG 描述符之前,我将图像重新调整为描述符的大小,所以我所有的行都具有相同的长度。

现在我想使用二进制描述符。例如,如果我在图像中检测到 36 个关键点并对其进行描述,我将得到一个 36x250 矩阵。对于另一个图像,一个 29x250 矩阵。现在我想我必须使用 OpenCV 中的 Bag of Words 方法为我的 SVM 构建字典。

所以我从关键点中提取描述符并将它们添加到我的 BOW 中,之后我将它聚类成一个词汇表,现在我退出了。 我读了很多教程和 posts,但我没有得到这一步。

有人可以解释一下之后发生了什么吗? 我的数据是如何存储的? BOWImgDescriptorExtractor 是如何工作的? 我是否将负样本和正样本放入 BOW?

如果这个问题已经被问了一百遍了,我很抱歉,但我不是专业的程序员,如果所有东西都集中在几个函数中并且每个人都说这很简单,我经常会遇到问题。

感谢您的帮助。

这比我认为您想象的要容易。为了方便阅读,我会分步写出来给大家看。

  1. 从你的训练集中获取所有的例子并应用 HOG 来获得特征——你完全忘记了 class 是什么只是确保你有来自每个 class 的例子。
  2. 然后您提取所有这些特征并使用聚类算法创建一个词袋 - 因此您将拥有 25 个 "visual words" 而不是 1000 个特征。
  3. 现在,当您训练算法时,您再次从每个图像中提取 HOG 特征,但您会发现哪个 "word" 最接近使用距离函数 - 通常是 L1 或 L2。现在,每个图像不再由 hog 表示,而是由您通常编号为 1-n 的单词表示。
  4. 将数据输入 svm 进行训练:)
  5. 当你去测试时,你再次提取 HOG,转换成 BOW,并将这个新的表示和模型输入到你的测试函数中。

希望对您有所帮助!