【问题标题】:using svmlight model file in opencv在opencv中使用svmlight模型文件
【发布时间】:2014-09-25 02:38:08
【问题描述】:

我一直致力于训练基于 HOG 特征的行人检测分类器。目前我做了以下工作:

a) 提取所有文件的 HOG 特征,即正和负,并用标签保存这些特征,即 +1 表示正,-1 表示负。

b)下载 svmlight,提取二进制文件,即 svm_learn、svm_classify。

c) 将“训练文件”(特征文件)传递给 svm_learn 二进制文件,它为我生成了一个模型文件。

d) 将“测试文件”传递给 svm_classify 二进制文件并在预测文件中得到结果。

现在我的问题是“下一步该做什么以及如何做?”。我想我知道现在我需要在 openCV 中使用该“模型文件”而不是“预测文件”来检测视频中的行人,但在某处我读到 openCV 仅使用 1 个支持向量但我得到了 295 个 SV,那我该怎么做将其转换为一种适当的格式并使用它以及任何进一步的强制性步骤(如果有)。

感谢你的好意!

【问题讨论】:

    标签: opencv svmlight


    【解决方案1】:

    OpenCV 不是真的(大概你在谈论 CvSVM) 只使用一个支持向量。正如 QED 所指出的,OpenCV 所做的是将线性 SVM 优化为一个支持向量。我认为这个想法这里是支持向量定义了分类边界,但要进行实际分类只需要分离超平面,并且可以用一个向量来定义。

    由于您有一个 svmlight 模型文件,而 CvSVM 无法读取该文件,因此您有以下选择:

    1. 训练 CvSVM 并将模式保存为 CvStatsModel 文件,您可以稍后加载该文件以获得支持向量。
    2. 编写一些代码将 svmlight 模型文件转换为 CvStatsModel 文件(但为此您必须了解这两种格式)。
    3. 获取 svmlight 的源代码,即读取模型文件的位,并将其集成到您的 OpenCV 应用程序中
    4. 您可以改用 LIBSVM,但实际上您将面临与 svmlight 相同的问题。

    有关如何转换支持向量以便将它们与 HOG 检测器一起使用的想法,请参阅Training custom SVM to use with HOGDescriptor in OpenCV

    【讨论】:

    • 我一直在尝试选择你的第三个建议,但没有成功,这就是为什么我要求任何更简单的,在 opencv 之外但在 C++ 相关程序中,但感谢你的建议。目前我不得不转向 libsvm 软件。你的建议是什么:它也很好吗?
    • 我用过很多LIBSVM,很好用。并且 svm_predict 很容易为 OpenCV 包装。
    • 好的!我正在阅读这篇文章(stackoverflow.com/questions/19089256/…),到目前为止我所理解的是上传我的模型文件(这个模型来自 libsvm)。之后的下一步应该是什么。我的意思是“我应该直接在 DetectMultiScale 中使用这个文件吗?”
    • 要非常小心,您设置的所有参数都与用于创建特征的完全相同,并且 svmlight 已将偏差放入权重模型向量的最后一个槽中。现在,如果您可以从该文件中获得一个具有所有学习权重 + 偏差的向量,那么您可以调用 hogdesc. setSVMDetector(const vector&detector) 函数,向量为 arg。如果你得到断言错误,那么大多数概率。偏差不在最后,或者您设置了不同的 hog 参数。
    • @B... 如果你在 opencv 中使用线性内核,它有一些特殊的魔法函数,可以将所有支持向量转换为一个支持向量。之前它抓住了我,因为我认为拥有一个支持向量是一个错误。 github.com/Itseez/opencv/blob/master/modules/ml/src/svm.cpp line 1579 : void CvSVM::optimize_linear_svm() // 我们只优化线性 SVM:将所有支持向量压缩为一个。
    猜你喜欢
    • 2011-08-25
    • 2014-04-15
    • 2012-11-25
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多