Что касается меня в Ubuntu16, я должен сделать это, выполнив следующие шаги:
Загрузите набор исходных изображений fddb, который вы обнаруживаете, и получаете результат обнаружения. Вы можете скачать его здесь . Вот мой каталог:
Присоедините путь к файлу всех изображений в текстовый файл и объедините все файлы fddb.аннотации к текстовому файлу.Вы можете скачать все файлы здесь
Что касается меня, я перемещаю все FDDB-FOLD-%d.txt
в каталог all_file_path
, а затем соедините их в один файл с помощью cat * > filePath.txt
Объедините все 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)
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:
В файле 'runEvaluate.pl' есть некоторая ошибка, измените оценку выполнения на следующую:
system($evaluateBin, "-a", $annotFile, "-d", $detFile, "-f", $detFormat, "-i", $imDir, "-l", $listFile, "-r", $detDir, "-z", ".jpg");
Вы также можете использовать команду для проверки:
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результат:
NПримечание: когда вы создаете вышеупомянутый текст в Windows, если вы тестируете его в Ubuntu, вы можете получить следующую ошибку Incompatible annotation and detection files. See output specifications
:
Просто скопируйтесодержимое в новый текстовый файл (созданный в Ubuntu), а затем решает.
Вот результат:
Несколько советов:
Вы можете видеть, что 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");
Вы также можете прочитать код evaluate
(в основном это evaluate.cpp
, что легко понять), поэтому у вас будет глубокое понимание того, как его оценить.