2016-03-01 192 views
0

我对SVM和对象识别有点新鲜,目前我试图使用Emgu CV 3.0训练SVM,将其保存到文件中,然后加载它(用于HOGDescriptor.SetSVMDetector中) 。加载训练SVM - Emgu CV

但是,除了其他问题,我找不到在保存后加载SVM的方法。

到目前为止,我的代码基本上执行以下操作:

SVM myFirstSVM = new SVM(); 

// do some stuff, set some parameters... 

myFirstSVM.Train(someParameters); 

myFirstSVM.Save("filePath"); 

从这里,问题在于被保存后重装的SVM。在Emgu 3.0

SVM mySecondSVM; 

mySecondSVM.load("filePath"); 

但是,我找不到任何方法“.load()”:我已经检查了好帮助主题和页面,唯一相关的东西,我能找到pertained到OpenCV的,它使用下面的方法,尽管它似乎在以前的版本中存在。 Emgu 3.0中有这种OpenCV方法吗?我会假设有,我相信这很简单,但我不能为我的生活找到它。

回答

0

对于EmguCV 1.5.0:

Load Method (fileName):从StatModel

装入统计模型继承

从文件

文件名(字符串)

文件从

加载模型对于EmguCV 3.0+:

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

+0

我做到了。对于SVM对象,Emgu中没有扩展方法“.Load(”file path“)”。 –

+0

@JohiasburgFrowell你确定吗?这些信息来自它的文档:http://www.emgu.com/wiki/files/1.5.0.0/Help/html/5c8147fa-4959-df3f-4d73-f1c549c06738.htm – Berriel

+0

我使用的是3.0版本的文档引用严重过时。 3.0文档可以在http://www.emgu.com/wiki/files/3.0.0/document/html/5c8147fa-4959-df3f-4d73-f1c549c06738.htm –

1

我已经使用指定的功能保存并读取了SVM模型。但我与3.1.0版本工作,希望它为你的作品,以及:

我曾在一个XML文件中保存的模型,因为读取功能的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

对于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; 
}