我可以在OpenCV中增加SVM培训标签的数量吗?

时间:2013-09-11 15:53:22

标签: c++ opencv memory machine-learning svm

我正在OpenCV中使用Visual Studio 2010,C ++,SVM构建OCR应用程序。当我使用181种不同的标签训练SVM时可以正常,但是当超过181种标签时它会失败。下面是IDE和OpenCV错误消息和我的代码。请帮帮我,非常感谢你!

IDE错误消息

  

OCR.exe中0x771e4b32的第一次机会异常:Microsoft C ++   异常:cv ::内存位置0x0081da74的异常。线程   'Win32 Thread'(0xdac)已退出,代码为-1073741510(0xc000013a)。   程序'[2512] OCR.exe:Native'已退出,代码为-1073741510   (0xc000013a)。

OpenCV错误消息

  

...... \ src \ opencv \ modules \ core \ src \ datastructs.cpp:332:错误:( - 211)   请求的大小是负数还是太大

SVM的配置

CvSVMParams params; 
params.svm_type = CvSVM::C_SVC; 
params.kernel_type = CvSVM::LINEAR; 
params.term_crit  = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

SVM.train( training_vectors, training_labels, cv::Mat(), cv::Mat(), params );

1 个答案:

答案 0 :(得分:2)

libSVM使用“one vs all”技术来表示使用二进制SVM分类器的多类问题。这意味着,如果您有N>2)个标签,libSVM将生成N个不同的分类器,每个分类器都有不同的数据标签(因此它表示“one vs all”方案)。这可能会导致您遇到的内存问题。一些其他模型,例如神经网络或knn,可以代表没有这种开销的多类分类。因此,如果您的数据很大,以libsvm的方式处理它,您至少有三种可能的选择:

  • 将SVM更改为其他可以直接解决多标签分类的模型
  • 尝试使用其他更轻的库实现,特别是opencv不使用libsvm的最新实现(它可以帮助,但不必)
  • 您可以手动执行“one vs all”实施并保存每个单独的模型。这样就可以避免内存问题,因为在任何时候你都会分配最多的二进制问题所需的内存。最后,您只需从文件加载模型并应用简单的投票方案。如果保存的模型太大,则意味着您的模型过度拟合(在SVM中,过度拟合通常表示为支持向量过多,实际上这是定义模型所需的唯一内容 - 所以如果模型有太多的sv将它们加载到内存中,则意味着它很可能被错误地训练,你应该尝试不同的参数/内核)