Так что общеизвестно, что из-за ошибки в 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.
Любая помощь очень ценится людьми
https://github.com/opencv/opencv/blob/master/modules/ml/src/svm.cpp#L1611
Вы обнаружите, что метод clear () вызывается каждый раз, когда вы вызываете cv :: ml :: SVM :: trainAuto или cv :: ml :: SVM :: train ()
Других решений пока нет …