如何在mexopencv中保存svm文件

时间:2013-12-26 12:14:07

标签: matlab opencv file-io svm

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以尝试使用具有Matlab界面的libsvm。它有两个在svm中读写的函数(libsvmwritelibsvmread)。

答案 1 :(得分: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>

现在,您可以先将培训模型首先避免错误,然后再将其保存到文件中:)