c# - Emgu CV SVM example not working on version 3.0.0 -
i trying implement svm example code found here. official example provided @ emgu cv documentation, version 1.5 (at least). unless have been mistaken, lot of classes in example either work differently in version 3.0.0 or don't exist @ , have been substituted.
1 example svmparams
class shown here doesn't exist anymore.
also, traindata
class has been developed new input of trainauto
method of svm object, having substituted matrix<single>
class. have tried implement example after changing believe needed change code reaches bool trained = model.trainauto(td, 5);
line , returns divide 0 exception.
maybe there more issues after line far code compiles. here trying execute:
private void classify() { int trainingsamplecount = 150; int sigma = 60; #region generate training data , classes matrix<float> traindata = new matrix<float>(trainingsamplecount, 2); matrix<float> trainclasses = new matrix<float>(trainingsamplecount, 1); image<bgr, byte> img = new image<bgr, byte>(500, 500); matrix<float> sample = new matrix<float>(1, 2); matrix<float> traindata1 = traindata.getrows(0, trainingsamplecount / 3, 1); traindata1.getcols(0, 1).setrandnormal(new mcvscalar(100), new mcvscalar(sigma)); traindata1.getcols(1, 2).setrandnormal(new mcvscalar(300), new mcvscalar(sigma)); matrix<float> traindata2 = traindata.getrows(trainingsamplecount / 3, 2 * trainingsamplecount / 3, 1); traindata2.setrandnormal(new mcvscalar(400), new mcvscalar(sigma)); matrix<float> traindata3 = traindata.getrows(2 * trainingsamplecount / 3, trainingsamplecount, 1); traindata3.getcols(0, 1).setrandnormal(new mcvscalar(300), new mcvscalar(sigma)); traindata3.getcols(1, 2).setrandnormal(new mcvscalar(100), new mcvscalar(sigma)); matrix<float> trainclasses1 = trainclasses.getrows(0, trainingsamplecount / 3, 1); trainclasses1.setvalue(1); matrix<float> trainclasses2 = trainclasses.getrows(trainingsamplecount / 3, 2 * trainingsamplecount / 3, 1); trainclasses2.setvalue(2); matrix<float> trainclasses3 = trainclasses.getrows(2 * trainingsamplecount / 3, trainingsamplecount, 1); trainclasses3.setvalue(3); #endregion using (svm model = new svm()) { //changed example model.setkernel(emgu.cv.ml.svm.svmkerneltype.linear); model.type = svm.svmtype.csvc; model.c = 1; model.termcriteria = new mcvtermcriteria(100, 0.00001); traindata td = new traindata(traindata, emgu.cv.ml.mlenum.datalayouttype.rowsample, trainclasses); bool trained = model.trainauto(td, 5); //changes point (int = 0; < img.height; i++) { (int j = 0; j < img.width; j++) { sample.data[0, 0] = j; sample.data[0, 1] = i; float response = model.predict(sample); img[i, j] = response == 1 ? new bgr(90, 0, 0) : response == 2 ? new bgr(0, 90, 0) : new bgr(0, 0, 90); } } // changed getsupportvectors() mat supvec = model.getsupportvectors(); int c = supvec.height; (int = 0; < c; i++) { // way data received changed byte[] b = supvec.getdata(i); float[] v = new float[] { (float)b[0], (float)b[1] }; pointf p1 = new pointf(v[0], v[1]); img.draw(new circlef(p1, 4), new bgr(128, 128, 128), 2); } } //display original training samples (int = 0; < (trainingsamplecount / 3); i++) { pointf p1 = new pointf(traindata1[i, 0], traindata1[i, 1]); img.draw(new circlef(p1, 2.0f), new bgr(255, 100, 100), -1); pointf p2 = new pointf(traindata2[i, 0], traindata2[i, 1]); img.draw(new circlef(p2, 2.0f), new bgr(100, 255, 100), -1); pointf p3 = new pointf(traindata3[i, 0], traindata3[i, 1]); img.draw(new circlef(p3, 2.0f), new bgr(100, 100, 255), -1); } emgu.cv.ui.imageviewer.show(img); }
here part of stacktrace describes exception
at emgu.cv.ml.mlinvoke.cvsvmtrainauto(intptr model, intptr traindata, int32 kfold, mcvparamgrid& cgrid, mcvparamgrid& gammagrid, mcvparamgrid& pgrid, mcvparamgrid& nugrid, mcvparamgrid& coefgrid, mcvparamgrid& degreegrid, boolean balanced) @ emgu.cv.ml.svm.trainauto(traindata traindata, int32 kfold, mcvparamgrid cgrid, mcvparamgrid gammagrid, mcvparamgrid pgrid, mcvparamgrid nugrid, mcvparamgrid coefgrid, mcvparamgrid degreegrid, boolean balanced) @ emgu.cv.ml.svm.trainauto(traindata traindata, int32 kfold)
i have no idea why exception occurs data used method created per example.
any appreciated.
there 3 problems solve:
system.dividebyzeroexception
thrown (as @user3082029 explained) using incorrect typetrainclasses
,trainclasses1
,trainclasses2
,trainclasses3
. type should bematrix<int>
instead ofmatrix<float>
since introduction of optimize_linear_svm() function in opencv
emgu.cv.ml.svm.svmkerneltype.linear
wouldn't produce expected support vectors known example. in situation can modify opencv_ml module , replaceopencv_ml300.dll
in project. or can useemgu.cv.ml.svm.svmkerneltype.inter
to draw support vectors can use
var supportvectors = model.getsupportvectors(); var vectors = new matrix<float>(supportvectors.rows, supportvectors.cols, supportvectors.datapointer); (var = 0; < supportvectors.rows; i++) { var p1 = new pointf(vectors[i, 0], vectors[i, 1]); img.draw(new circlef(p1, 4), new bgr(128, 128, 128), 2); }
Comments
Post a Comment