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