Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线

  FDDB 如此经典的测试基准,竟然缺少完整全面的测试流程教程。笔者自行梳理了在 FDDB 上测试人脸检测模型的流程,力求详细清晰,可复现。(版本: Ubuntu 16.04 和 OpenCV 3.4.2)

      • 1. 下载 FDDB
      • 2. 准备 .txt 文件
      • 3. 安装 OpenCV (版本 3.4.2)
      • 4. 修改 MakeFile
      • 5. 修改 common.hpp
      • 6. 把 CV_RGB 改成 Scalar
      • 7. make
      • 8. 执行 evaluate
      • 9. 利用 MATLAB 等软件绘图
      • 10. 安装 gnuplot
      • 11. 修改 runEvaluate.pl
      • 12. 执行 runEvaluate.pl
      • 附 为什么离散和连续的 ROC 曲线相差这么大?

1. 下载 FDDB

从官网下载 FDDB 数据集,解压得到 originalPics 文件夹,FDDB-folds 文件夹和 README.txt
到 results 页面下载评估程序,解压得到 evaluation 文件夹。

2. 准备 .txt 文件

新建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坐标 宽 高 置信度
例如
Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第1张图片
(当检测框为椭圆时,格式需要为长轴半径 短轴半径 角度 中心点x 中心点y 置信度)

注: 下载使用别人的 imList.txt 和 ellipseList.txt 可能会导致报错 Incompatible annotation and detection files. See output specifications. 这是 windows 下和 ubuntu 下的文件不同导致的。只需要在 ubuntu 下面新建一个 .txt 文件,然后将内容复制粘贴进去即可。

文件夹截图作为参考 (文件名称和路径不同时,后续步骤中的相应代码也应不同。)

Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第2张图片

3. 安装 OpenCV (版本 3.4.2)

完全按照此教程安装。

4. 修改 MakeFile

打开 evaluation 文件夹下的 MakeFile,将

evaluate: $(OBJS)
    $(CC) $(LIBS) $(OBJS) -o $@

修改为

evaluate: $(OBJS)
    $(CC) $(OBJS) -o $@ $(LIBS)

5. 修改 common.hpp

打开 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__

6. 把 CV_RGB 改成 Scalar

此时在 evaluation 文件夹中执行 make 仍会报错,可按照错误提示找到代码位置,将 CV_RGB 改成 Scalar,并添加using namespace cv;
Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第3张图片
CV_RGB 错误截图 2
CV_RGB 错误截图 3

7. make

全部修改完后,在 evaluation 文件夹中打开终端,执行 make clean,再执行 make,可以成功编译。
Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第4张图片


编译成功后,FDDB 测试流程已经基本完成。后续步骤有两种方式可选:(1) 执行第 8 和第 9 步。或者 (2) 执行第 10,11,12 步。


8. 执行 evaluate

继续在上述终端里执行

./evaluate -a ../ellipseList.txt -d ../results.txt -i ../originalPics/ -l ../imList.txt

注意若文件名称和路径与笔者 (见第 2 步中的截图) 不同,需要相应修改。
完成后,在 evaluation 文件夹中生成了 tempContROC.txt 和 tempDiscROC.txt 两个文件。

9. 利用 MATLAB 等软件绘图

在第 8 步中得到的两个 .txt 文件即为 ROC 曲线上的点的坐标信息,可以自行选择各种软件绘图了。只需注意文件中的第二列为横坐标,第一列为纵坐标,即可得到 ROC 曲线,至此可以关闭本教程


若选择另一种绘图方式 (官方提供的是这种),则可以跳过第 8 和第 9 步,依次执行下列第 10,11, 12 步。

10. 安装 gnuplot

重新打开一个终端,执行 sudo apt-get install gnuplot

11. 修改 runEvaluate.pl

打开 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 步中的截图) 不同,需要相应修改。

12. 执行 runEvaluate.pl

在 evaluation 文件夹的终端中执行 perl runEvaluate.pl
完成后在 out-folds 文件夹下生成了 ContROC.txt, DiscROC.txt, ContROC.png 和 DiscROC.png 四个文件。

Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第5张图片

Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线_第6张图片

可见此人脸检测模型过于保守,只有 70+ 的误检个数,而召回率较低。

附 为什么离散和连续的 ROC 曲线相差这么大?

这个问题在 YaqiLYU 的知乎专栏 找到了答案如下:

  结果有离散分数 discROC 和连续分数 contROC 两种,discROC 仅关心 IoU 是不是大于0.5,contROC 是 IoU 越大越好。鉴于大家都采用无限制训练加 FDDB 测试的方式,detector 会继承训练数据集的标注风格,继而影响 contROC,所以 discROC 比较重要,contROC 看看就行了,不用太在意。

你可能感兴趣的:(教程记录)