FDDB 如此经典的测试基准,竟然缺少完整全面的测试流程教程。笔者自行梳理了在 FDDB 上测试人脸检测模型的流程,力求详细清晰,可复现。(版本: Ubuntu 16.04 和 OpenCV 3.4.2)
从官网下载 FDDB 数据集,解压得到 originalPics 文件夹,FDDB-folds 文件夹和 README.txt
到 results 页面下载评估程序,解压得到 evaluation 文件夹。
新建imList.txt FDDB-folds 文件夹中有 10 个 FDDB-fold-i.txt 文件,以特定顺序记录了所有图片的路径。按从 1 到 10 的顺序把它们复制粘贴到 imList.txt 中,或者在 FDDB-folds 文件夹中执行下面的指令来合并。
cat `ls|grep -v"ellipse"` > imList.txt
新建ellipseList.txt FDDB-folds 文件夹中有 10 个 FDDB-fold-i-ellipseList.txt 文件,记录了对应的人脸个数和位置信息。按从 1 到 10 的顺序把它们复制粘贴到 ellipseList.txt 中,或者在 FDDB-folds 文件夹中执行下面的指令。
cat *ellipse* > ellipseList.txt
生成结果文件 用你的模型按照 FDDB-fold-i.txt 的顺序检测图片,生成与之对应的 10 个 fold-i-out.txt,存放在 out-folds 文件夹中,并合并或复制粘贴成 results.txt。结果文件的格式需要为
...
image name i
number of faces in this image =im
face i1
face i2
...
face im
...
当检测框为矩形时, face im f a c e i m 为左上角的x坐标 左上角的y坐标 宽 高 置信度
例如
(当检测框为椭圆时,格式需要为长轴半径 短轴半径 角度 中心点x 中心点y 置信度
)
注: 下载使用别人的 imList.txt 和 ellipseList.txt 可能会导致报错 Incompatible annotation and detection files. See output specifications. 这是 windows 下和 ubuntu 下的文件不同导致的。只需要在 ubuntu 下面新建一个 .txt 文件,然后将内容复制粘贴进去即可。
文件夹截图作为参考 (文件名称和路径不同时,后续步骤中的相应代码也应不同。)
完全按照此教程安装。
打开 evaluation 文件夹下的 MakeFile,将
evaluate: $(OBJS)
$(CC) $(LIBS) $(OBJS) -o $@
修改为
evaluate: $(OBJS)
$(CC) $(OBJS) -o $@ $(LIBS)
打开 evaluation 文件夹下的 common.hpp,将
//#define __IMAGE_FORMAT__ ".jpg"
#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__
修改为
#define __IMAGE_FORMAT__ ".jpg"
//#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__
此时在 evaluation 文件夹中执行 make 仍会报错,可按照错误提示找到代码位置,将 CV_RGB
改成 Scalar
,并添加using namespace cv;
全部修改完后,在 evaluation 文件夹中打开终端,执行 make clean
,再执行 make
,可以成功编译。
编译成功后,FDDB 测试流程已经基本完成。后续步骤有两种方式可选:(1) 执行第 8 和第 9 步。或者 (2) 执行第 10,11,12 步。
继续在上述终端里执行
./evaluate -a ../ellipseList.txt -d ../results.txt -i ../originalPics/ -l ../imList.txt
注意若文件名称和路径与笔者 (见第 2 步中的截图) 不同,需要相应修改。
完成后,在 evaluation 文件夹中生成了 tempContROC.txt 和 tempDiscROC.txt 两个文件。
在第 8 步中得到的两个 .txt 文件即为 ROC 曲线上的点的坐标信息,可以自行选择各种软件绘图了。只需注意文件中的第二列为横坐标,第一列为纵坐标,即可得到 ROC 曲线,至此可以关闭本教程。
若选择另一种绘图方式 (官方提供的是这种),则可以跳过第 8 和第 9 步,依次执行下列第 10,11, 12 步。
重新打开一个终端,执行 sudo apt-get install gnuplot
打开 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 = "../out-folds/";
###########################
注意若文件名称和路径与笔者 (见第 2 步中的截图) 不同,需要相应修改。
在 evaluation 文件夹的终端中执行 perl runEvaluate.pl
完成后在 out-folds 文件夹下生成了 ContROC.txt, DiscROC.txt, ContROC.png 和 DiscROC.png 四个文件。
可见此人脸检测模型过于保守,只有 70+ 的误检个数,而召回率较低。
这个问题在 YaqiLYU 的知乎专栏 找到了答案如下:
结果有离散分数 discROC 和连续分数 contROC 两种,discROC 仅关心 IoU 是不是大于0.5,contROC 是 IoU 越大越好。鉴于大家都采用无限制训练加 FDDB 测试的方式,detector 会继承训练数据集的标注风格,继而影响 contROC,所以 discROC 比较重要,contROC 看看就行了,不用太在意。