0

因此,众所周知,由于 OpenCV 中的错误,当您在保存非线性内核 SVM 后尝试加载它时会出现错误。

请参阅此处了解更多信息: OpenCV 3.1.0:保存和加载经过训练的 SVM

人们已经加载了 SVM,但无法获得相同的结果(加载后分类器数据已损坏)。我尝试通过编写自己的 svmloader 函数来测试它。

Ptr<SVM> svmloader(const String& filepath)
{
    FileStorage fs;
    fs.open(filepath, FileStorage::READ);

    Ptr<SVM> svm = Algorithm::read<SVM>(fs.getFirstTopLevelNode());
    return svm;
}

这可行,但我现在可以确认我已经在加载前和加载后测试了模型,加载后的结果似乎更糟。那是在你训练一个分类器并测试它之后,它会很好,但是如果你保存它并再次加载它,它会变得很糟糕。

所以我想我想用C++的对象序列化来解决这个问题。如何将任意对象写入文件,然后从该文件中读取?

也有人可以确认上述错误是否已在 OpenCV 3.2.0 中修复,我无法在 RELEASENOTES 中找到任何内容

非常感谢任何帮助

4

1 回答 1

0

https://github.com/opencv/opencv/blob/master/modules/ml/src/svm.cpp#L1611

你会发现每次调用 cv::ml::SVM::trainAuto 或 cv::ml::SVM::train() 时都会调用一个 clear()

于 2017-04-09T18:57:09.577 回答