我正在学习opencv和dlib,用于在大学项目中使用的面部检测器,而且我在整个机器学习和计算机视觉方面都很陌生。如何使用FDDB中的评估代码来评估我的面部检测代码?我使用dlib的CNN方法检测图像中的面部。
<manifest package="com.loser.facebooktest"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
正如您所看到的,代码非常简单,但我必须计算精度,召回率和F1分数来绘制ROC曲线,而我还不知道如何去做,关于该项目的自述github并没有帮助。
答案 0 :(得分:1)
至于我在ubuntu16中,我必须通过以下步骤完成:
下载检测到面部并获取检测结果的fddb原始图像数据集。您可以下载它here。这是我的目录:
将所有图像文件路径连接到txt文件,并将所有fddb注释连接到txt文件。 您可以下载所有文件here
关于我,我将所有FDDB-FOLD-%d.txt
移至目录all_file_path
,然后通过cat * > filePath.txt
将其加入一个文件
按FDDB-fold-%d-ellipseList.txt
cat *ellipse*.txt > annotFile.txt
到一个txt
请注意,您可能无需创建它,因为runEvaluate.pl
已在运行过程中为您执行此操作。
3.创建FDDB evalute exe,在此处下载源代码here 然后编译它,你可以更改makefile,查看原因here,添加
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文件(由evaluate 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评估txt文件:
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)
注意:在windows中创建上面的txt时,如果你在ubuntu中测试它,你可能会收到以下错误Incompatible annotation and detection files. See output specifications
:
只需将内容复制到新的txt文件(在ubuntu中创建)然后解决。
结果如下:
一些提示:
您可以看到runEvaluate.pl
并不难,可能不需要进行上述更改。您还可以更改runEvaluate.pl
中的某个变量,例如$GNUPLOT
,{{1 }} 等等。
将$imDir
添加到
system($ evaluateBin,“ - a”,$ annotFile,“ - d”,$ detFile,“ - f”,$ detFormat,“ - i”,$ imDir,“ - l”,$ listFile,“ - r”, $ detDir);
system($ evaluateBin,“ - a”,$ annotFile,“ - d”,$ detFile,“ - f”,$ detFormat,“ - i”,$ imDir,“ - l”,$ listFile,“ - r“,$ detDir,” - z“,”.jpg“);
您还可以阅读"-z", ".jpg"
代码(主要是易于理解的evaluate
代码),这样您就可以深入了解如何评估它。
答案 1 :(得分:0)
你能解释一下你所处的步骤吗?
您需要从以下位置下载标记数据: 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上构建评估,因为它更容易(至少对我而言)。
希望它有所帮助。