motiur
motiur

Reputation: 1680

How to save a svm file in mexopencv

So, I am about to train a classifier and needed to save the result from the classifier, in mexopencv.

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

My Matlab compiler crashes due to segmentation fault. As far as I know this is supposed to be the way in OpenCV. Is there any other way to save files trained via SVM in mexopencv ; or is this something to do with Matlab file writing option. Thanks.

Upvotes: 2

Views: 923

Answers (2)

Amro
Amro

Reputation: 124563

This is in fact a bug in OpenCV itself, not mexopencv. You should report it...

Here is a minimal C++ program to reproduce the bug:

#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;
}

Running this under a debugger, I located the offending code:

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;
    ...
}

At this point, the SVM model is untrained, and df is an uninitialized pointer. class_count equals 0, but df_count gets set to 1, hence df[i] (with i=0) causes an access violation...

I think this could be fixed as:

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

Changing df_count to 0 during debugging, the program runs correctly and I get the following XML file:

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>

For now you could avoid the bug by training the model first before saving it to file :)

Upvotes: 1

carandraug
carandraug

Reputation: 13091

You can try libsvm which has a Matlab interface. It comes two functions to read and write in svm (libsvmwrite and libsvmread).

Upvotes: 1

Related Questions