0

我正在 OpenCV 中使用 Visual Studio 2010、C++、SVM 构建 OCR 应用程序。当我用低于 181 个不同的标签训练 SVM 时没关系,但在超过 181 个标签时失败。下面是 IDE 和 OpenCV 错误消息和我的代码。请帮助我,非常感谢!

IDE 错误信息

OCR.exe 中 0x771e4b32 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0081da74 处的 cv::Exception。线程“Win32 线程”(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 );
4

1 回答 1

2

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

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