我对SVM和对象识别有些新意,目前我正在尝试使用Emgu CV 3.0训练SVM,将其保存到文件中,然后加载它(用于HOGDescriptor.SetSVMDetector)。
但是,除了其他问题之外,我在保存后无法找到加载SVM的方法。
到目前为止,我的代码基本上执行以下操作:
SVM myFirstSVM = new SVM();
// do some stuff, set some parameters...
myFirstSVM.Train(someParameters);
myFirstSVM.Save("filePath");
从这里开始,问题在于保存后重新加载 SVM。我检查过几个帮助主题和页面,我发现的唯一相关内容与OpenCV相关,后者使用以下方法:
SVM mySecondSVM;
mySecondSVM.load("filePath");
但是,我找不到方法" .load()"在Emgu 3.0中,虽然它似乎出现在以前的版本中。在Emgu 3.0中有相同的OpenCV方法吗?我会假设有,我相信它很简单,但我不能为我的生活找到它。
答案 0 :(得分:2)
对于EmguCV 3.0.0,似乎不支持Save/Load
功能(Load
不存在),您可以改为使用Write/Read
。
保存SVM模型的功能:
public static void SaveSVMToFile(SVM model, String path) {
if (File.Exists(path)) File.Delete(path);
FileStorage fs = new FileStorage(path, FileStorage.Mode.Write);
model.Write(fs);
fs.ReleaseAndGetString();
}
加载SVM模型的函数提供了正确的路径:
public static SVM LoadSVMFromFile(String path) {
SVM svm = new SVM();
FileStorage fs = new FileStorage(path, FileStorage.Mode.Read);
svm.Read(fs.GetRoot());
fs.ReleaseAndGetString();
return svm;
}
答案 1 :(得分:1)
我使用指定的函数保存并读取了SVM模型。但我正在使用3.1.0版本,并希望它也适用于你:
我已将模型保存在XML文件中,因为就我所知,read函数适用于xml文件:
Emgu.CV.ML.SVM model = new Emgu.CV.ML.SVM();
model.SetKernel(Emgu.CV.ML.SVM.SvmKernelType.Linear);
model.Type = Emgu.CV.ML.SVM.SvmType.CSvc;
model.C = 1;
model.TermCriteria = new MCvTermCriteria(100, 0.00001);
bool trained = model.TrainAuto(my_trainData, 5);
model.Save("SVM_Model.xml");
我按如下方式阅读了该模型:
Emgu.CV.ML.SVM model_loaded = new Emgu.CV.ML.SVM();
FileStorage fsr = new FileStorage("SVM_Model.xml", FileStorage.Mode.Read);
model_loaded.Read(fsr.GetFirstTopLevelNode());
它正常工作。 我希望它对你有用。
答案 2 :(得分:0)
对于EmguCV 1.5.0:
继承自StatModel
从文件中加载统计模型
fileName(String)
从
加载模型的文件
对于EmguCV 3.0 +:
Load()
不可用,您可以在源代码中看到:https://sourceforge.net/p/emgucv/code/ci/master/tree/Emgu.CV.ML/StatModel.cs