Точность распознавания лиц с помощью Javacv

123
23 апреля 2019, 21:30

Я новичок в javacv. Пробую создать систему распознавания лиц и столкнулся с проблемой низкой точности распознавания. Для идентификации я использую EigenFaceRecognizer, а в качестве базы изображений для обучения использую Georgia Tech Face Database, а также свои собственные фото, все изображения в разрешении 640х480, лица расположены фронтально(10-12 фотографий для одного человека, всего 20 персон).

Результат распознавания получается очень нестабильным и работает через раз. Как можно повысить точность распознавания ? Стоит ли дополнительно редактировать фотографии перед обучением и распознаванием, или проблема заключается в неправильном обучении программы и стоит корректировать код ?

Заранее спасибо.

Функция обучения

public void train() {
        File imagesDir = new File("C:\\Java_Eclipse\\FaceRecognitionWebcam\\src\\image");
        FilenameFilter imgFilter = new FilenameFilter() {
            public boolean accept(File dir, String name) {
                name = name.toLowerCase();
                return name.endsWith(".jpg") || name.endsWith(".pgm") || name.endsWith(".png");
            }
        };
        File[] imageFiles = imagesDir.listFiles(imgFilter);
        MatVector images = new MatVector(imageFiles.length);
        Mat labels = new Mat(imageFiles.length, 1, CV_32SC1);
        IntBuffer labelsBuf = labels.createBuffer();
        int counter = 0;
        for (File image : imageFiles) {
            Mat img = imread(image.getAbsolutePath(), CV_LOAD_IMAGE_GRAYSCALE);
            int label = Integer.parseInt(image.getName().split("\\-")[0]);
            images.put(counter, img);
            labelsBuf.put(counter, label);
            counter++;
        }
        // FaceRecognizer faceRecognizer = FisherFaceRecognizer.create();
         FaceRecognizer faceRecognizer = EigenFaceRecognizer.create();
        // FaceRecognizer faceRecognizer = LBPHFaceRecognizer.create();
        System.out.println("Train started");
        faceRecognizer.train(images, labels);
        faceRecognizer.save("C:\\Java_Eclipse\\FaceRecognitionWebcam\\src\\train_result_eigen.xml");
        System.out.println("Train completed");
    }

Функция распознавания

public void findFaces(IplImage currentFrame) throws InterruptedException {
        IntPointer labels = new IntPointer(1);
        DoublePointer confidences = new DoublePointer(1);
        opencv_core.CvMemStorage storage = new opencv_core.CvMemStorage().create();
        opencv_core.CvSeq faces =
                cvHaarDetectObjects(currentFrame, classifierFace, storage, 1.6, 8, opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING);
        int total = faces.total();
        if(total > 0) {
            System.out.println("Total faces: " + total);
            for(int i = 0; i < total; i++) {
                opencv_core.CvRect r = new opencv_core.CvRect(cvGetSeqElem(faces, i));
                int x = r.x(); int y = r.y(); int w = r.width(); int h = r.height();
                IplImage greyImg = IplImage.create(currentFrame.width(), currentFrame.height(), IPL_DEPTH_8U, 1);
                cvCvtColor(currentFrame, greyImg, CV_RGB2GRAY);//resize
                rectangle(cvarrToMat(currentFrame), new Rect(x, y, w, h), new Scalar(0, 255, 0, 0), 2, 0, 0);
                faceRecognizer.predict(cvarrToMat(greyImg), labels, confidences);
                int label = labels.get(0);
                double confidence = confidences.get(0);
                String labelInfo = faceRecognizer.getLabelInfo(label).toString();
                System.out.println("---------");
                System.out.println("Person: " + i);
                System.out.println("label = " + label);
                System.out.println("confidence = " + confidence);

            }
        }
    }
Answer 1

Сначала вам надо разобраться с этим

Результат распознавания получается очень нестабильным и работает через раз.

У вас должен быть набор картинок для обучения (train set) и тестовый набор картинок (test set) как минимум. После обучения на первом наборе нужно проверить и замерить точность на втором наборе, чтобы она выражалась одним числом, самое простое это процент распознанных картинок (accuracy).

Только после того, как есть метрика, можно что-то улучшать.

Напоследок, советы как улучшить точность распознавания с англоязычного сайта (см ответ)

https://stackoverflow.com/questions/31191177/how-to-increase-the-accuracy-of-eigenfacerecognizer-it-recognizes-two-people-as

READ ALSO
JaperReports. Вычисление параметров для отчета по иерархии географических адресов

JaperReports. Вычисление параметров для отчета по иерархии географических адресов

Возникла необходимость реализации следующего отчета на JasperНа вход пользователю необходимо предложить выбрать один или несколько адресных...

161
Вопрос по строкам в Java

Вопрос по строкам в Java

Пример кода:

161
Как создавать кнопки динамически?

Как создавать кнопки динамически?

Подскажите как создать кнопки в jPanel при нажатии другой кнопки(Нажимаю кнопку, и на jPanel создается новая кнопка jButton1, нажимаю еще раз jButton2, и т

171