负载训练的SVM - Emgu CV

时间:2016-03-01 20:10:54

标签: opencv emgucv

我对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方法吗?我会假设有,我相信它很简单,但我不能为我的生活找到它。

3 个答案:

答案 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:

  

Load Method (fileName)

     

继承自StatModel

     

从文件中加载统计模型

     
    

fileName(String)

         

加载模型的文件   

对于EmguCV 3.0 +:

Load()不可用,您可以在源代码中看到:https://sourceforge.net/p/emgucv/code/ci/master/tree/Emgu.CV.ML/StatModel.cs