Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opencv 3 SVM training

As you may know, many things changed in OpenCV 3 (in comparision to the openCV2 or the old first version).

In the old days, to train SVM one would use:

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 the third version of API, there is no CvSVMParams nor CvSVM. Surprisingly, there is a documentation page about SVM, but it tells everything, but not how to really use it (at least I cannot make it out). Moreover, it looks like no one in the Internet uses SVM from OpenCV's 3.0.

Currently, I only managed to get the following:

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

Can you please provide me with information, how to rewrite the actual training to openCV 3?

like image 835
Jack L. Avatar asked Nov 24 '14 20:11

Jack L.


People also ask

Can SVM be used for 3 classes?

In its most simple type, SVM doesn't support multiclass classification natively. It supports binary classification and separating data points into two classes.

What is SVM in Opencv?

What is a SVM? A Support Vector Machine (SVM) is a discriminative classifier formally defined by a separating hyperplane. In other words, given labeled training data (supervised learning), the algorithm outputs an optimal hyperplane which categorizes new examples.

How does SVM training work?

SVM works by mapping data to a high-dimensional feature space so that data points can be categorized, even when the data are not otherwise linearly separable. A separator between the categories is found, then the data are transformed in such a way that the separator could be drawn as a hyperplane.


3 Answers

with opencv3.0, it's definitely different , but not difficult:

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);
like image 107
berak Avatar answered Oct 08 '22 22:10

berak


I was porting my code from OpenCV 2.4.9 to 3.0.0-rc1 and had the same issue. Unfortunately the API has changes since the answer was posted, so I would like to update it accordingly:

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);
like image 21
BloodyD Avatar answered Oct 08 '22 22:10

BloodyD


I know this is an old post, but i came across it looking for the same solution. This tutorial is extremely helpful: http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

like image 40
Jdban101 Avatar answered Oct 08 '22 21:10

Jdban101