web-dev-qa-db-ja.com

Opencv 3 SVMトレーニング

ご存知かもしれませんが、OpenCV 3では(openCV2または古い最初のバージョンと比較して)多くの点が変更されました。

昔は、SVMをトレーニングするには次のようにします。

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);

APIの3番目のバージョンでは、CvSVMParamsCvSVMもありません。驚くべきことに SVMに関するドキュメントページ がありますが、それはすべてを伝えますが、実際の使用方法は伝えません(少なくとも私はそれを理解できません)。さらに、インターネットの誰もOpenCV 3.0のSVMを使用していないようです。

現在、私は何とか次のものを得ることができました:

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

実際のトレーニングをopenCV 3に書き換える方法について教えてください。

11
Jack L.

opencv3.0では、これは明らかに異なりますが、難しくはありません。

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);
30
berak

OpenCV 2.4.9から3.0.0-rc1にコードを移植していて、同じ問題がありました。残念ながら、回答が投稿されてからAPIが変更されたため、それに応じて更新したいと思います。

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);
9
BloodyD

私はこれが古い投稿であることを知っていますが、同じ解決策を探してそれを見つけました。このチュートリアルは非常に役立ちます: http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

2
Jdban101