以YSQ人脸检测算法为例,测试其在FDDB上的精度。(其它算法可以自行生成检测结果,从第二步开始看)

一、生成FDDB人脸检测数据

使用ShiqiYu/libfacedetection项目,在windows下跑FDDB数据集。直接修改example/libfacedetect-example.cpp即可

#include <stdio.h>
#include <fstream>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "facedetect-dll.h"//#pragma comment(lib,"libfacedetect.lib")
#pragma comment(lib,"libfacedetect-x64.lib")//define the buffer size. Do not change the size!
#define DETECT_BUFFER_SIZE 0x20000
using namespace cv;void split_dir_name(std::string& s, std::vector<std::string>& v, const std::string& c)
{std::string::size_type pos1, pos2;pos2 = s.find(c);pos1 = 0;while (std::string::npos != pos2){v.push_back(s.substr(pos1, pos2 - pos1));pos1 = pos2 + c.size();pos2 = s.find(c, pos1);}if (pos1 != s.length())v.push_back(s.substr(pos1));
}int main(int argc, char* argv[])
{const char * dir = ".............../FDDB/originalPics/";   /* FDDB图片目录. */const char * out = "ysq_fddb.txt";   /* 输出的检测结果文件. */const char * in = ".............../FDDB/fold_all.txt"; /* FDDB图片列表(10-fold合在一起). */std::ifstream fbox(in, std::ios::in);if (!fbox.is_open()){std::cerr << "Can not open fbox from " << in << std::endl;std::cerr << "Set fbox using -f option. See usage: ." << std::endl;return -1;}std::ofstream output(out);output.close();while (!fbox.eof()){std::string filename = "";fbox >> filename;std::string full_filename = (std::string)dir + filename + ".jpg";std::cout << "Processing: " << filename << std::endl;//load an image and convert it to gray (single-channel)Mat image = imread(full_filename);if (image.empty()){fprintf(stderr, "Can not load the image file %s.\n", full_filename);return -1;}Mat gray;cvtColor(image, gray, CV_BGR2GRAY);int * pResults = NULL;//pBuffer is used in the detection functions.//If you call functions in multiple threads, please create one buffer for each thread!unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);if (!pBuffer){fprintf(stderr, "Can not alloc buffer.\n");return -1;}int doLandmark = 1;///// reinforced multiview face detection / 68 landmark detection// it can detect side view faces, better but slower than facedetect_multiview().////!!! The input image must be a gray one (single-channel)//!!! DO NOT RELEASE pResults !!!pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,1.08f, 3, 16, 0, doLandmark);int faces = pResults ? *pResults : 0;std::ofstream output(out, std::ios::app);output << filename << std::endl;output << faces << std::endl;output.close();printf("%d faces detected.\n", faces);//print the detection resultsfor (int i = 0; i < faces; i++){short * p = ((short*)(pResults + 1)) + 142 * i;int x = p[0];int y = p[1];int w = p[2];int h = p[3];int neighbors = p[4];int angle = p[5];// 把检测出来的人脸信息输出到output文件中,格式为:img_name, x, y, width, height, scorestd::ofstream output(out, std::ios::app);output << x << " " << y << " " << w << " " << 1.2 * h << " " << neighbors << std::endl;output.close();printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);}//release the bufferfree(pBuffer);}fbox.close();return 0;
}

二、使用FDDB评估程序生成评估结果

1. 官网下载evaluate code,Ubuntu下解压,cd到evaluate目录,make编译可执行程序。

注意如果你是用的是OpenCV 3.x版本,则需要修改Makefile才能编译通过

添加以下两行,并修改evaluate的顺序

INCS = -I/usr/local/include/opencvLIBS = -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui-lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_imgcodecs
evaluate: $(OBJS)
 $(CC) $(OBJS) -o $@ $(LIBS)

2. 将第一步生成的人脸检测结果ysq_fddb.txt 和 FDDB groundtrue文件 和评估程序放到一个文件夹,运行evaluate程序,参数可根据实际情况修改。

./evaluation/evaluate -a fold_all_ellipsetList.txt -d ysq_fddb.txt -f 0 -i ./originalPics -l fold_all.txt -r ysq_

这里将生成ysq_DiscROC.txt 和 ysq_ContROC.txt,这两个txt分别存着两种ROC曲线的数据,二者的区别可以看我的另外一篇博客FDDB evaluate生成ROC数据方法(源码剖析)通过分析源码来看这两种ROC曲线有什么区别。

三、根据结果画出ROC曲线

1. 这里需要安装Gnuplot,

sudo apt-get install gnuplot

2. 修改discROC.p或者自己新建编辑都可以,最后的plot是你的数据,只要把第一个参数指向刚刚evaluate生成的txt即可,上面的参数都是控制画图的,可根据需要修改。set output 即输出的ROC图片,plot下可以添加多行数据,对比不同算法的精度,这里对比了MTCNN人脸检测算法。

# Compare your discrete ROC curves with other methods
# At terminal: gnuplot discROC.p
set terminal png size 1280, 1200 enhanced font 'Verdana,18'
set size 1,1
set xtics 500
set ytics 0.1
set grid
set ylabel "True positive rate"
set xlabel "False positive"
set xr [0:2000]
set yr [0:1.0]
set key below
set output "discROC.png"
plot  "ret/mtcnn_ori_DiscROC.txt" using 2:1 title 'MTCNN-ori' with linespoints pointinterval 50 lw 3 , \
"ret/ysq_DiscROC.txt" using 2:1 title 'YSQ' with linespoints pointinterval 50 lw 3

结果如下图:

注意点:

1. windows下生成的output文件必须处理一下,不然txt的换行符不一样,导致使用evaluate程序的比较的时候把同一张图片的名字当作两个人的而报错:

2. 如果你的ROC曲线横轴方向不够宽,那么你需要在检测的地方降低置信度阈值,让检测器输出更多的框,即使她的置信度较低,这样FP才会多,ROC曲线也就变得更宽。

FDDB人脸检测测试集使用方法相关推荐

  1. 浅析人脸检测之Haar分类器方法

    浅析人脸检测之Haar分类器方法  [补充] 这是我时隔差不多两年后, 回来编辑这篇文章加的这段补充, 说实话看到这么多评论很是惊讶, 有很多评论不是我不想回复, 真的是时间久了, 很多细节我都忘记了 ...

  2. 人脸检测之Haar分类器方法

    浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸 ...

  3. 今日学习内容--机器学习的测试集选择方法

    机器学习测试集选择方法 目录 机器学习测试集选择方法 留出法 多次留出法选择 交叉验证法 留一法交叉验证 自助法 总结 目前来说总共有三种测试集选择方法: 留出法 交叉验证法 自助法 以下分别对三种方 ...

  4. 程序员的机器学习入门笔记(九):人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

    一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发 ...

  5. OpenCV中基于LBP算法的人脸检测测试代码

    下面是OpenCV 3.3中基于CascadeClassifier类的LBP算法实现的人脸检测,从结果上看,不如其它开源库效果好,如libfacedetection,可参考 https://blog. ...

  6. 人脸检测库libfacedetection使用方法

    libfacedetection介绍 libfacedetection是一个开源的人脸检测库,使用C编写,将模型文件转化为C的静态变量,不依赖外部第三方库,使用时可以直接把源代码拷到自己的工程,也可以 ...

  7. PyTorch 自定义 Dataset 及训练集、测试集划分方法

    实例 1:自定义数据集类,torch.utils.data.random_split() 划分训练集和测试集,通过普通遍历方式使用自定义数据集中的样本 import numpy as np impor ...

  8. insightface scrfd人脸检测测试

    scrfd 是insightface开源的一款人脸检测器,精度宣传挺高的,但是把代码下载下来,运行一直报错,花了一点时间,终于搞好了. Method Backbone Easy Medium Hard ...

  9. Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线,详细步骤

    原 Ubuntu 下使用 FDDB 测试人脸检测模型并生成 ROC 曲线 2018年08月01日 20:18:44 Xing_yb 阅读数:101 标签: FDDB 人脸检测 模型测试 ROC 曲线 ...

  10. 人脸检测dlib, mtcnnx对比,FDDB测试对比

    前面一直做人脸检测相关内容,然后对比了下dib以及MTCNN的人脸检测效果主要是速度,以及FDDB准确率.最后给出生成FDDB测试文件的C++代码. FDDB 测试结果 注本文的MTCNN效果检测准确 ...

最新文章

  1. mybatis使用注解开发
  2. Nature子刊:王四宝组揭示按蚊肠道共生菌抗疟的分子机制
  3. 线上直播丨KDD 2021预训练Workshop,谷歌MSRA等5位顶尖研究者参与研讨
  4. C# 利用SharpPcap实现网络包捕获嗅探
  5. 智能车竞赛技术报告 | 节能信标组 - 洛阳理工学院 - Since 2021
  6. Fishe向量Fisher Vecotr(一)
  7. matplotlib如何绘制两点间连线_如何用 Python 快速揭示数据之间的各种关系
  8. 你没有看错,爬网页数据,C# 也可以像 Jquery 那样
  9. 计算机系统与环境,COMPUTERS ENVIRONMENT AND URBAN SYSTEMS《计算机、环境与城市系统》SSCI论文投稿_万维书刊网...
  10. Linux运维面试题之--网页打开缓慢如何优化
  11. failed to read artifact descriptor for xx
  12. salt 安装MySQL-python和过程
  13. 算术编码数据压缩Matlab报告,用matlab实现算术编码
  14. PDF文件打印受到限制?
  15. 没有财务系统如何对账?
  16. Barefoot Networks进军白盒市场
  17. html图片旋转3种方式—— CSS3 transform
  18. Centos6.5安装后,网络连接显示红叉
  19. IFRS 9减值损失
  20. 交换机千兆和百兆对网速影响_千兆网线和百兆网线是否可以通用?

热门文章

  1. VS2010 正式版 破解方法详解 1
  2. 单片机喇叭如何响出报警声音 C语言程序,单片机报警器声音产生的方法(报警声音)...
  3. rose ha 配置
  4. 社工程序员(社会工程学)有关概述与讲解
  5. Sprintf函数用法
  6. Spring5全面详解
  7. matlab plot 折线变曲线
  8. 【saas公司案例】易快报与浦发云资金
  9. seo伪原创/百度链接推送/原创检测工具,python超简单POST案例
  10. Dmp文件导入(Imp命令)