FDDB是全世界最具权威的人脸检测评测平台之一,是专门针对人脸识别算法的评测方法与标准。FDDB数据集官网:http://vis-www.cs.umass.edu/fddb/
下面介绍如何使用FDDB的源码生成人脸检测模型的ROC曲线。首先要有个人脸检测算法用来测试,这里使用MTCNN-Tensorflow人脸检测。
下载FDDB人脸图片数据集,解压后文件夹名是originalPics;下载FDDB标注文件,解压后文件夹名是FDDB-folds。
首先要用人脸检测器对FDDB数据集进行测试,生成测试结果文件。在MTCNN源码运行test/RunOnFDDBLandmark.py生成10个检测结果文件(源代码用的python2,用python3运行有些地方需要修改,具体看报错信息,这里有个错误是“TypeError: ‘float’ object cannot be interpreted as an integer”,找到对应的位置,有个相除,此时用//代替/即可,参考博客。并且源码里面的一些文件路径根据自己放的位置修改)。其中的一个文件如下,输出数据必须按照这种格式,FDDB官方有说明,数据最后一行是输出的人脸置信度。若是用opencv检测人脸,关于如何用opencv输出人脸置信度参考这篇文章。
把十个检测结果文件按文件名编号改为 fold-01-out.txt,fold-02-out.txt…fold-10-out.txt。然后把这10个txt文件合成一个文件,在文件夹中使用如下命令:
cat * > result.txt。
除了将算法检测结果文件打包成一个文件外,还需要将下载的FDDB标注文件打包。
FDDB-folds 文件夹中有 10 个 FDDB-fold-i.txt 文件,以特定顺序记录了所有图片的路径。在 FDDB-folds 文件夹中执行下面的指令来合并成一个文件。
cat FDDB-folds-%d.txt > imList.txt
FDDB-folds 文件夹中还有 10 个 FDDB-fold-i-ellipseList.txt 文件,记录了对应的人脸个数和位置信息。在 FDDB-folds 文件夹中执行下面的指令来合并成一个文件。
cat *ellipse*.txt > ellipseList.txt
编译FDDB测试源码需要用到opencv,如果没有安装opencv要安装opencv,注意:FDDB测试源码里面用的是老版本的opencv,这些已经在opencv4中去除了,所以只能用opencv4以前的版本,这里测试用的是opencv3.3。opencv3.3源码编译安装make过程出现了一个错误,解决办法看下面。
https://blog.csdn.net/guo_lei_lamant/article/details/81568346
https://m.douban.com/mip/note/685689002/
在FDDB官网左边菜单选择Results,下载测试源码,解压后文件夹名是evaluation。
进入evaluation文件夹,打开Makefile修改。网上一些教程说要将前面的头文件包含和库包含改成下面的,我运行的时候没有修改opencv的包含也运行成功了,修改了反而报错,这个看情况而定。
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
(1)将Makefile中
evaluate: $(OBJS)
$(CC) $(LIBS) $(OBJS) -o $@
修改为:
evaluate: $(OBJS)
$(CC) $(OBJS) -o $@ $(LIBS)
否则会出现“对‘cvxxx’未定义的引用”,参考自这篇博文
(2)打开 evaluation 文件夹下的 common.hpp,因为读取的FDDB数据集图片是jpg格式,要将
//#define __IMAGE_FORMAT__ ".jpg"
#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__
改为
#define __IMAGE_FORMAT__ ".jpg"
//#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__
首先make,经过前面的修改后,make就不会报错了。要使用FDDB源码直接绘制ROC曲线需要安装gnuplot。
sudo apt-get install gnuplot
然后运行evaluate,evaluate的参数如下:
# evaluate程序的参数说明
./evaluate [OPTIONS]
-h : print usage
-a fileName : file with face annotations (default: ellipseList.txt) # 注释文件必须是椭圆,因为代码中是按照椭圆的数据格式读取的
-d fileName : file with detections (default: faceList.txt)
-f format : representation of faces in the detection file (default: 0)
: [ 0 (rectangle), 1 (ellipse) or 2 (pixels) ]
-i dirName : directory where the original images are stored (default: ~/scratch/Data/facesInTheWild/)
-l fileName : file with list of images to be evaluated (default: temp.txt)
-r fileName : prefix for files to store the ROC curves (default: temp)
-s showMatchedImage # evaluate程序帮助中没有说明此参数,可以将椭圆及预测框画在对应图像上并显示出来
这里我测试使用命令,注意里面的文件路径需要根据自己存放的位置修改。
./evaluate -a ../ellipseList.txt -d ../results.txt -i ../originalPics/ -l ../imList.txt
运行完成后在 evaluation 文件夹中生成了 tempContROC.txt 和 tempDiscROC.txt 两个文件。文件中的第二列为横坐标,第一列为纵坐标,可使用python读取绘制ROC 曲线,也可以用gnuplot绘制ROC曲线,在FDDB官网下载脚本。
下载后解压,修改discROC.p,把里面plot的路径换成之前生成tempDiscROC.txt的路径。
然后用命令生成ROC曲线的图片保存在目录下:
gnuplot discROC.p
也可以用FDDB源码直接绘制ROC曲线,打开evaluation 文件夹下的 runEvaluate.pl,按照自己的路径修改前面的路径,最后三个分别是图片数据集,数据集标注,输出文件夹。
#### VARIABLES TO EDIT ####
# where gnuplot is
my $GNUPLOT = "/usr/bin/gnuplot";
# where the binary is
my $evaluateBin = "./evaluate";
# where the images are
my $imDir = "../originalPics/";
# where the folds are
my $fddbDir = "../FDDB-folds/";
# where the detections are
my $detDir = "../FDDB-PUTPUT/";
###########################
在evaluation文件夹下执行
perl runEvaluate.pl
生成了 ContROC.txt, DiscROC.txt, ContROC.png 和 DiscROC.png 四个文件
参考自:
http://www.freesion.com/article/879964870/
https://blog.csdn.net/haluoluo211/article/details/80698000
https://blog.csdn.net/jmu201521121021/article/details/87822352?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
FDDB问题:
https://www.jianshu.com/p/9a41c63f8706
关于ROC曲线:
https://www.cnblogs.com/dlml/p/4403482.html
https://www.jianshu.com/p/2ca96fce7e81
https://www.imooc.com/article/48072