2014-11-24 8 views
8

Wie Sie vielleicht wissen, hat sich in OpenCV 3 vieles geändert (im Vergleich zur openCV2 oder der alten ersten Version).Opencv 3 SVM Training

In den alten Tagen, zu trainieren, ein SVM verwenden würde:

CvSVMParams params; 
params.svm_type = CvSVM::C_SVC; 
params.kernel_type = CvSVM::POLY; 
params.gamma = 3; 

CvSVM svm; 
svm.train(training_mat, labels, Mat(), Mat(), params); 

In der dritten Version der API gibt es keine CvSVMParams noch CvSVM. Überraschenderweise gibt es a documentation page about SVM, aber es sagt alles, aber nicht, wie man es wirklich benutzt (zumindest kann ich es nicht erkennen). Außerdem sieht es so aus, als ob niemand im Internet SVM von OpenCV 3.0 verwendet.

Derzeit ich es geschafft, nur folgendes zu erhalten:

ml::SVM.Params params; 
params.svmType = ml::SVM::C_SVC; 
params.kernelType = ml::SVM::POLY; 
params.gamma = 3; 

Können Sie bitte geben Sie mir Informationen, wie 3 die tatsächliche Ausbildung OpenCV neu zu schreiben?

Antwort

26

mit opencv3.0, dann ist es auf jeden Fall anders, aber nicht schwer:

Ptr<ml::SVM> svm = ml::SVM::create(); 
// edit: the params struct got removed, 
// we use setter/getter now: 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::POLY); 
svm->setGamma(3); 

Mat trainData; // one row per feature 
Mat labels;  
svm->train(trainData , ml::ROW_SAMPLE , labels); 
// ... 
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary) 
Mat res; // output 
svm->predict(query, res); 
+0

Funktioniert wie ein Charme, danke für die sehr schnelle Antwort! Können Sie mir bitte sagen, wie ist das Ergebnis in res cv :: Mat dargestellt? Enthält es nur die gleichen Werte, die in Labels cv :: Mat enthalten sind? –

+0

res.at (0) enthält die ID. 'etwas' wird hier float oder int, abhängig vom Typ der Labels – berak

+0

Diese Information: "Mat query; // input, 1channel, 1 row (apply reshape (1,1) falls erforderlich)" hat den Erfolg meiner Implementierung stark verändert . Danke @berak – Koray

8

ich meinen Code wurde die Portierung von OpenCV 2.4.9 bis 3.0.0-rc1 und hatte das gleiche Problem. Leider hat die API-Änderungen, da die Antwort geschrieben wurde, so möchte ich es entsprechend aktualisieren:

Ptr<ml::SVM> svm = ml::SVM::create(); 
svm->setType(ml::SVM::C_SVC); 
svm->setKernel(ml::SVM::POLY); 
svm->setGamma(3); 

Mat trainData; // one row per feature 
Mat labels;  
Ptr<ml::TrainData> tData = ml::TrainData::create(trainData, ml::SampleTypes::ROW_SAMPLE, labels); 
svm->train(tData); 
// ... 
Mat query; // input, 1channel, 1 row (apply reshape(1,1) if nessecary) 
Mat res; // output 
svm->predict(query, res); 
Verwandte Themen