【问题标题】:How to save a svm file in mexopencv如何在 mexopencv 中保存 svm 文件
【发布时间】:2014-01-14 02:21:53
【问题描述】:

所以,我即将训练一个分类器,需要将分类器的结果保存在 mexopencv 中。

hello  = cv.SVM;
hello.save('foo.xml')

我的 Matlab 编译器由于分段错误而崩溃。 As far as I know 这应该是 OpenCV 中的方式。有没有其他方法可以将通过SVM 训练的文件保存在mexopencv 中;还是这与 Matlab 文件写入选项有关。谢谢。

【问题讨论】:

    标签: matlab opencv file-io svm


    【解决方案1】:

    这实际上是 OpenCV 本身的错误,而不是 mexopencv。你应该report it...

    这是一个重现该错误的最小 C++ 程序:

    #include "opencv2/opencv.hpp"
    #include "opencv2/ml/ml.hpp"
    using namespace cv;
    
    int main()
    {
        Ptr<SVM> svm = new SVM();
        svm->save("svm.xml");
    
        return 0;
    }
    

    在调试器下运行,我located 有问题的代码:

    df_count = class_count > 1 ? class_count*(class_count-1)/2 : 1;
    df = decision_func;
    
    cvStartWriteStruct( fs, "decision_functions", CV_NODE_SEQ );
    for( i = 0; i < df_count; i++ )
    {
        int sv_count = df[i].sv_count;
        ...
    }
    

    此时SVM模型是未训练的,df是一个未初始化的指针。 class_count 等于 0,但 df_count 设置为 1,因此 df[i](与 i=0)会导致访问冲突...

    我认为这可以修复为:

    df_count = class_count > 1 ? class_count*(class_count-1)/2 : 1;
    if (class_count == 0) df_count = 0;
    

    在调试过程中将df_count更改为0,程序运行正常,我得到以下XML文件:

    svm.xml

    <?xml version="1.0"?>
    <opencv_storage>
    <my_svm type_id="opencv-ml-svm">
      <svm_type>C_SVC</svm_type>
      <kernel>
        <type>RBF</type>
        <gamma>1.</gamma>
      </kernel>
      <C>1.</C>
      <term_criteria>
        <epsilon>1.1920928955078125e-007</epsilon>
        <iterations>1000</iterations>
      </term_criteria>
      <var_all>0</var_all>
      <var_count>0</var_count>
      <sv_total>0</sv_total>
      <support_vectors></support_vectors>
      <decision_functions></decision_functions>
    </my_svm>
    </opencv_storage>
    

    现在您可以通过在将模型保存到文件之前先训练模型来避免该错误:)

    【讨论】:

    • fwiw,生成的 XML 文件无法正确加载!如果您尝试加载,OpenCV 这次将throw 异常:svm-&gt;load("svm.xml");"OpenCV Error: Parsing error (SVM model data is invalid, check sv_count, var_* and class_count tags)"
    【解决方案2】:

    你可以试试libsvm,它有一个 Matlab 界面。它有两个函数可以在 svm 中读写(libsvmwritelibsvmread)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多