【问题标题】:OpenCV SVM Classifier Image RecognitionOpenCV SVM 分类器 图像识别
【发布时间】:2019-08-15 11:55:13
【问题描述】:

我正在使用 C++ 和 OpenCV 3.3.1
我尝试使用 OpenCV 训练 SVM,我的步骤是:

  1. 预处理图像
  2. 使用 SURF 进行特征提取
  3. 创建用于学习正面和负面图像的数据集
  4. 重塑图像 1 行 1 功能
  5. 使用 -1 表示负数和 +1 表示正数来创建 labelmat
  6. 学习 SVM
  7. 预测

现在我的问题是: 假设我的图像是 128 x 128 并且在特征提取之后我得到了一个 Mat 重塑后有 16 行和 128 列,我得到了 1 行和 2048 列,现在是用这种大小的行和列训练的 SVM。当我尝试用我的 SVM 进行预测时,我遇到了一个问题,即 SVM 想要相同大小的特征 Mat(1 行和 2048 列),但我的预测图像与学习图像有更多的特征,所以预测的 Mat 是一种方法根据需要更大。

与我用于学习的图像相同的预测效果很好,所以我猜 SVM 有效。

如何将 SVM 用于更大的图像?

【问题讨论】:

    标签: c++ svm opencv3.0


    【解决方案1】:

    通过使它们成为 1X 2048 特征来使用 SURF/SIFT 描述符并不是一个好主意,原因有两个:

    1. 您正在限制每个图像的有用特征数量 (=16),如果特征数量不同于 16,则会出现错误。即使你每次都强制使用 16 个特征,你最终可能会丢失特征,因此结果会降级

    2. 您正在为 2048 维训练 SVM 分类器,而未利用提取的特征描述符之间的任何关系。

    更强大和更标准的方法是使用词袋。 您可以使用词袋和直方图方法从 SIFT 特征中获得 K 维描述符,然后在该 K 维描述符上训练 SVM 分类器,每个图像都将是相同的。

    此链接可能对您有所帮助,

    https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O

    如果你想使用 MATLAB;那么 vlfeat 就有了整个流水线的实现。

    【讨论】:

    • 现在我从每张图像中提取特征,将它们推回到一个 Mat 上,并用 KMeans 对它们进行聚类。在此之后,我使用来自 K-means 的字典和来自特征的描述符创建特征包。结果是一个垫弓描述符。之后,我将带有标签的 bowDescritpor 传入 SVM。 Bow 描述符中的每一行代表 1 个图像。 cols 是字典大小。语法有效,但如果我调用 svm->istrained() 它返回 false。预测总是 100%。知道有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 2017-07-10
    • 2013-03-25
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多