2016-03-01 191 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; 
}