Перейти к содержимому
Compvision.ru
kurenchuksergey

OpenCV 3.4 Assertion failed (checkDetectorSize()) in setSVMDetector

Recommended Posts

Здравствуйте, пытался обучить SVM hog дескрипторами. Но в момент установки svm модели , выбрасывает исключение

Находил похожие вопросы на answer opencv (Вопрос), от туда выяснил, как добавлять rho и автор советовал перейти на float массив

попытался, но ситуация не изменилась 

Код обучения (свой картинки, 28*28)

(Ошибок не возникает, файл создается )

HOGDescriptor hog = new HOGDescriptor(new Size(28,28),new Size(8,8),new Size(4,4),new Size(4,4),9);
  Mat trainingLabels = new Mat();
  MatOfFloat temp = new MatOfFloat();
  File negativeDir = new File("/home/kurenchuksergey/HogSignTrainingData/negative");
  File positiveDir = new File("/home/kurenchuksergey/HogSignTrainingData/positive");
  int i = -1;
  float[][] hogdescriptor = new float[13992][]; //13992 - image count
  for(File file:negativeDir.listFiles()){
              Mat con = Imgcodecs.imread(file.getAbsolutePath(),Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
              hog.compute(con, temp);
              trainingLabels.push_back(Mat.zeros(new Size(1,1),CvType.CV_32S));
  }  
  for(File file:negativeDir.listFiles()){
        Mat con = Imgcodecs.imread(file.getAbsolutePath(),Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
        hog.compute(con, temp);
        hogdescriptor[++i] = temp.toArray();
        trainingLabels.push_back(Mat.ones(new Size(1,1),CvType.CV_32S));
    }


    Mat Labels = new Mat();
    trainingLabels.copyTo(Labels);
    Labels.convertTo(Labels,CvType.CV_32S);

    Mat mat  = new Mat(hogdescriptor.length,hogdescriptor[0].length,CvType.CV_32FC1);
    for(int j = 0;j<hogdescriptor.length;j++)
        mat.put(i,0,hogdescriptor[i]);



    TrainData trainDataHog = TrainData.create(mat,Ml.ROW_SAMPLE,Labels);

    SVM svm = SVM.create();
    svm.setType(SVM.C_SVC);
    svm.setKernel(SVM.RBF);
    svm.setDegree(0.1);
    // 1.4 bug fix: old 1.4 ver gamma is 1
    svm.setGamma(0.1);
    svm.setCoef0(0.1);
    svm.setC(1);
    svm.setNu(0.1);
    svm.setP(0.1);
    svm.setTermCriteria(new TermCriteria(1, 20000, 0.0001));
    svm.train(trainDataHog.getSamples(),Ml.ROW_SAMPLE,trainDataHog.getResponses());
    svm.save("SVMHog");

Далее пытаюсь воспользоваться моделью (Test.java)

SVM svm1 = SVM.load("SVMHog");
 HOGDescriptor hog = new HOGDescriptor(new Size(28,28),new Size(8,8),new Size(4,4),new Size(4,4),9);
 Double rho = svm1.getDecisionFunction(0,new Mat(),new Mat());
 int size = (int)(svm1.getSupportVectors().total() + 1) * svm1.getSupportVectors().channels();
 float[] temp = new float[size];
 svm1.getSupportVectors().get(0, 0, temp);
 temp[temp.length - 1] = (float)-rho;
 MatOfFloat vector = new MatOfFloat(temp);
 hog.setSVMDetector(vector);

И получаю исключение (47 - строка - hog.setSVMDetector(vector); )

OpenCV Error: Assertion failed (checkDetectorSize()) in setSVMDetector, file /home/kurenchuksergey/opencv/modules/objdetect/src/hog.cpp, line 117
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: /home/kurenchuksergey/opencv/modules/objdetect/src/hog.cpp:117: error: (-215) checkDetectorSize() in function 
setSVMDetector
]
at org.opencv.objdetect.HOGDescriptor.setSVMDetector_0(Native Method)
at org.opencv.objdetect.HOGDescriptor.setSVMDetector(HOGDescriptor.java:306)
at com.company.Test.main(Test.java:47)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

судя по  

  svm.setKernel(SVM.RBF);

у вас RBF функция, а HOGDescriptor принимает только линейную (https://docs.opencv.org/3.4.1/d5/d33/structcv_1_1HOGDescriptor.html). 

 

virtual void cv::HOGDescriptor::setSVMDetector ( InputArray  _svmdetector )  
virtual

Sets coefficients for the linear SVM classifier.

Ну и вызовите getDescriptorSize да сравните с размером вашего детектора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   1 пользователь

×