Ошибка утверждения OpenCV 3.1.0 checkDetectorSize в cv :: HOGDescriptor :: setSVMDetector

Я пытаюсь обучить SVM своими собственными изображениями и передать их в HOGDescriptor в OpenCV. Обучение проходит хорошо, но когда я пытаюсь передать модель дескриптору HOGDescriptor с функцией setSVMDetector, он терпит неудачу. Код для обучения

    Mat trainingImages = new Mat();
    Mat trainingLables = new Mat();

    String personsPath = "C:\INRIAPerson\\INRIAPerson\\96X160H96\\Train\\pos";

    for (File file : new File(personsPath).listFiles()) {
        if(file.isFile()){
            Mat img = Imgcodecs.imread(file.getPath());
            Mat newImg = new Mat();
            Imgproc.cvtColor(img, newImg, Imgproc.COLOR_BGR2GRAY);
            newImg = newImg.reshape(1,1);

            trainingImages.push_back(newImg);
            trainingLables.push_back(Mat.ones(new Size(1,1), CvType.CV_32SC1));
        }
    }


    String nonPersonsPath = "C:\\NRIAPerson\\INRIAPerson\\train_64x128_H96\\neg";
    for (File file : new File(nonPersonsPath).listFiles()) {
        if(file.isFile()){
            Mat img = Imgcodecs.imread(file.getPath());
            Mat newImg = new Mat();
            Imgproc.cvtColor(img, newImg, Imgproc.COLOR_BGR2GRAY);

            Imgproc.resize(newImg, newImg, new Size(160 , 96));
            newImg = newImg.reshape(1,1);

            trainingImages.push_back(newImg);
            trainingLables.push_back(Mat.zeros(new Size(1,1), CvType.CV_32SC1));
        }
    }

    trainingImages.convertTo(trainingImages, CvType.CV_32FC1);

    SVM trainer = SVM.create();
    trainer.setKernel(SVM.LINEAR);
    trainer.train(trainingImages, Ml.ROW_SAMPLE, trainingLables);

    HOGDescriptor hog = new HOGDescriptor(new Size(160, 96), new Size(8,8), new Size(4,4), new Size(4,4), 9);
    Mat supportVector = trainer.getSupportVectors();
    hog.setSVMDetector(supportVector);

Сообщение об ошибке

libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
OpenCV Error: Assertion failed (checkDetectorSize()) in cv::HOGDescriptor::setSVMDetector, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\hog.cpp, line 117
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\objdetect\src\hog.cpp:117: error: (-215) checkDetectorSize() in function cv::HOGDescriptor::setSVMDetector
]
    at org.opencv.objdetect.HOGDescriptor.setSVMDetector_0(Native Method)
    at org.opencv.objdetect.HOGDescriptor.setSVMDetector(HOGDescriptor.java:302)
    at feature.extraction.App.main(App.java:86)

Я не знаю, связано ли с этим предупреждение libpng. Это сводит меня с ума. У кого-нибудь есть идея?


person just_trying_stuff    schedule 01.04.2016    source источник


Ответы (1)


Я понял. Я делал пару вещей неправильно

  1. Я тренировался с изображениями, а не features
  2. Я забыл добавить -rho в вспомогательный вектор

Сначала я создал 2d float array. Заполните его характеристиками изображения с помощью функции compute из класса HOGDescriptor. Обучал SVM с массивом. После обучения я использовал функцию getDecisionFunction, чтобы получить rho, и добавил его к supportvector.

person just_trying_stuff    schedule 10.04.2016