【发布时间】:2014-01-14 02:21:53
【问题描述】:
所以,我即将训练一个分类器,需要将分类器的结果保存在 mexopencv 中。
hello = cv.SVM;
hello.save('foo.xml')
我的 Matlab 编译器由于分段错误而崩溃。 As far as I know 这应该是 OpenCV 中的方式。有没有其他方法可以将通过SVM 训练的文件保存在mexopencv 中;还是这与 Matlab 文件写入选项有关。谢谢。
【问题讨论】:
所以,我即将训练一个分类器,需要将分类器的结果保存在 mexopencv 中。
hello = cv.SVM;
hello.save('foo.xml')
我的 Matlab 编译器由于分段错误而崩溃。 As far as I know 这应该是 OpenCV 中的方式。有没有其他方法可以将通过SVM 训练的文件保存在mexopencv 中;还是这与 Matlab 文件写入选项有关。谢谢。
【问题讨论】:
这实际上是 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文件:
<?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>
现在您可以通过在将模型保存到文件之前先训练模型来避免该错误:)
【讨论】:
svm->load("svm.xml"); 说"OpenCV Error: Parsing error (SVM model data is invalid, check sv_count, var_* and class_count tags)"
你可以试试libsvm,它有一个 Matlab 界面。它有两个函数可以在 svm 中读写(libsvmwrite 和 libsvmread)。
【讨论】: