Код оценки FDDB - PullRequest
       60

Код оценки FDDB

0 голосов
/ 26 мая 2018

Я изучаю opencv и dlib, для детектора лиц, который можно использовать в университетском проекте, и я действительно новичок в этом деле машинного обучения и компьютерного зрения.Как я могу использовать код оценки из FDDB , чтобы оценить мой код для обнаружения лица?Я использую dlib-метод CNN для обнаружения лиц по изображениям.

import cv2
import dlib

image = cv2.imread('..\\pessoas\\beatles.jpg')

detector = dlib.cnn_face_detection_model_v1("..\\mmods\\mmod_human_face_detector.dat")
detectedFaces = detector(image)

for face in detectedFaces:
    l, t, r, b, c = (int(face.rect.left()), int(face.rect.top()), int(face.rect.right()), int(face.rect.bottom()),
                 face.confidence)
    cv2.rectangle(image, (l, t), (r, b), (255, 0, 0), 2)

cv2.imshow("CNN Detector", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Как видите, код довольно прост, но мне нужно вычислить точность, вызвать и F1-показатель, чтобы построить кривые ROC.и я пока не знаю, как это сделать, файл readme по проекту github не помогает.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Что касается меня в Ubuntu16, я должен сделать это, выполнив следующие шаги:

  1. Загрузите набор исходных изображений fddb, который вы обнаруживаете, и получаете результат обнаружения. Вы можете скачать его здесь . Вот мой каталог: enter image description here

  2. Присоедините путь к файлу всех изображений в текстовый файл и объедините все файлы fddb.аннотации к текстовому файлу.Вы можете скачать все файлы здесь

enter image description here

Что касается меня, я перемещаю все FDDB-FOLD-%d.txtв каталог all_file_path, а затем соедините их в один файл с помощью cat * > filePath.txt

enter image description here

Объедините все FDDB-fold-%d-ellipseList.txt в один текст с помощью cat *ellipse*.txt > annotFile.txt

Обратите внимание, что вам может не понадобиться создавать его, потому что runEvaluate.pl сделал это за вас в процессе выполнения.

3. Создайте FDDB evalute exe, скачайте исходный код здесь здесь А затем скомпилируйте его, вы можете изменить make-файл, увидеть причину здесь , добавить

INCS = -I/usr/local/include/opencv

LIBS = -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui
       -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d 
       -lopencv_objdetect -lopencv_contrib -lopencv_legacy

в файл make.

Оценивайте, вы можете использовать runEvaluate.pl, чтобы оценить его, но что касается меня (ubuntu16), я не могу запустить его напрямую.

4.1 измените путь GUNPLOT (выследует сначала установить gnuplot, используя его для создания изображения ROC)

enter image description here

4.2 Я использую модель обнаружения прямоугольника, поэтому я изменяю$detFormat до 0.

my $detFormat = 0; # 0: rectangle, 1: ellipse 2: pixels

4.3 Относительный путь всех изображений:

my $listFile ="/home/xy/face_sample/evaluation/compareROC/FDDB-folds/filePath.txt";

4.4 Аннотации всех изображений

my $annotFile = "/home/xy/face_sample/evaluation/compareROC/FDDB-folds/annotFile.txt";

4.5. Roc-файл, который вы хотите сгенерировать (созданный при помощи команды exe):

my $gpFile ="/home/xy/face_sample/evaluation/compareROC/createROC.p";

4.6 Вы обнаружите файл (я дам позже, как его создать)

my $detFile ="/home/xy/face_sample/evaluation/compareROC/detDir/fddb_rect_ret1.txt";

It’s content like that:

enter image description here

В файле 'runEvaluate.pl' есть некоторая ошибка, измените оценку выполнения на следующую:

system($evaluateBin, "-a", $annotFile, "-d", $detFile, "-f", $detFormat, "-i", $imDir, "-l", $listFile, "-r", $detDir, "-z", ".jpg");

Вы также можете использовать команду для проверки:

enter image description here

xy@xy:~/face_sample/evaluation/compareROC$ ./evaluate \
> -a /home/xy/face_sample/evaluation/compareROC/FDDB-folds/annotFile.txt \
> -d /home/xy/face_sample/evaluation/compareROC/detDir/fddb_rect_ret1.txt \
> -f 0 \
> -i /home/xy/face_sample/evaluation/compareROC/originalPics/ \
> -l /home/xy/face_sample/evaluation/compareROC/FDDB-folds/filePath.txt \
> -r /home/xy/face_sample/evaluation/compareROC/detDir/ \
> -z .jpg

Использование python для создания текстового файла с оценкой fddb:

def get_img_relative_path():
    """
    :return: ['2002/08/11/big/img_344', '2002/08/02/big/img_473', ......]
    """
    f_name = 'E:/face_rec/face__det_rec_code/face_det/FDDB-folds/all_img_files.txt'
    lst_name = open(f_name).read().split('\n')

    return lst_name

def write_lines_to_txt(lst):
    # lst = ['line1', 'line2', 'line3']
    f_path = 'fddb_rect_ret.txt'
    with open(f_path, 'w') as fp:

        for line in lst:
            fp.write("%s\n" % line)

# For example use opencv to face detection
def detect_face_lst(img):
    """
    :param img: opencv image 
    :return: face rectangles [[x, y, w, h], ..........]
    """
    m_path = 'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'
    face_cascade = cv2.CascadeClassifier(m_path)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    return faces


def generate_fddb_ret():
    # The directory from which we get the test images from FDDB
    img_base_dir = 'E:/face_rec/face__det_rec_code/face_det/originalPics/'

    # All the images relative path, like '['2002/08/11/big/img_344', '2002/08/02/big/img_473', ......]'
    lst_img_name = get_img_relative_path()

    # Store detect result, like:
    # ['2002/08/11/big/img_344', '1', '10 10 50 50 1', .............]
    lst_write2_fddb_ret = []

    try:
        for img_name in lst_img_name:
            img_full_name = img_base_dir + img_name + '.jpg'
            img = cv2.imread(img_full_name)

            if img == None:
                print 'error %s not exists, can not generate complete fddb evaluate file' % img_full_name
                return -1

            lst_face_rect = detect_face_lst(img)

            # append img name like '2002/08/11/big/img_344'
            lst_write2_fddb_ret.append(img_name)

            face_num = len(lst_face_rect)
            # append face num, note if no face 0 should be append
            lst_write2_fddb_ret.append(str(face_num))

            if face_num > 0:
                # append each face rectangle x y w h score
                for face_rect in lst_face_rect:
                    # append face rectangle x, y, w, h score
                    # note: opencv hava no confidence so use 1 here
                    s_rect = " ".join(str(item) for item in face_rect) + " 1"
                    lst_write2_fddb_ret.append(s_rect)

    except Exception as e:
        print 'error %s , can not generate complete fddb evaluate file' % e
        return -1

    # Write all the result to txt for FDDB evaluation
    write_lines_to_txt(lst_write2_fddb_ret)

После запуска приведенного выше кода вы можете создать FDDBрезультат: enter image description here

NПримечание: когда вы создаете вышеупомянутый текст в Windows, если вы тестируете его в Ubuntu, вы можете получить следующую ошибку Incompatible annotation and detection files. See output specifications:

enter image description here

Просто скопируйтесодержимое в новый текстовый файл (созданный в Ubuntu), а затем решает.

Вот результат:

enter image description here

Несколько советов:

  1. Вы можете видеть, что runEvaluate.pl не сложно, вышеуказанные изменения могут не понадобиться. Вы также можете изменить некоторую переменную в runEvaluate.pl, например $GNUPLOT, $imDir и так далее.добавить "-z", ".jpg" в систему ($valuBin, "-a", $ annotFile, "-d", $ detFile, "-f", $ detFormat, "-i", $ imDir, "-l", $ listFile,"-r", $ detDir);

    system ($valuBin, "-a", $ annotFile, "-d", $ detFile, "-f", $ detFormat, "-i", $imDir, "-l", $ listFile, "-r", $ detDir, "-z", ".jpg");

  2. Вы также можете прочитать код evaluate(в основном это evaluate.cpp, что легко понять), поэтому у вас будет глубокое понимание того, как его оценить.

0 голосов
/ 11 июня 2018

Можете ли вы объяснить, на каком этапе вы находитесь?

Вам необходимо загрузить помеченные данные из: http://vis -www.cs.umass.edu / fddb / , где написано: Скачать базу данных

После этого вам необходимо загрузить исходный код результата: http://vis -www.cs.umass.edu / fddb / results.html

Затем вам нужно изменить свою программу так, чтобы выходные данные выглядели так:

2002/08/11/big/img_591
1
191 88 164 163 0
2002/08/26/big/img_265
3
52 39 95 95 0
282 59 114 114 0

Где сначала имя изображения, затем количество лиц на этом изображении, затемкоординаты для каждого лица и повторение ...

Я советую вам построить оценку на Linux, поскольку это намного проще (по крайней мере, для меня это было).

Надеюсь, это поможет.

...