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:

  1. system.dividebyzeroexception thrown (as @user3082029 explained) using incorrect type trainclasses, trainclasses1, trainclasses2 , trainclasses3. type should bematrix<int> instead of matrix<float>

  2. 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 , replace opencv_ml300.dll in project. or can use emgu.cv.ml.svm.svmkerneltype.inter

  3. 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

Popular posts from this blog

html - Firefox flex bug applied to buttons? -

html - Missing border-right in select on Firefox -

python - build a suggestions list using fuzzywuzzy -