faceDetection对比实验

来源:互联网 发布:访问网站出现 php探针 编辑:程序博客网 时间:2024/06/07 12:57

对比实验


FDDB数据集概述

初探人脸检测,纵有多种deeplearning方法,工程限制,还是采用了最原始的方法。

速度上来说,首先深大教授的libfacedetection方法是最快的,其次dlib、再次opencv。
在我自己检测到的速度对比来看:

----------dlib------------avg:   0.0943026041667 ssum:   181.061 s------libfacedetection------avg:   0.00707299270073 ssum:   13.566 s----------opencv----------avg:   0.180855949896 ssum:   346.52 s

对于三种算法的对比实验,我采用了国际上广泛使用的数据集FDDB(homepage:http://vis-www.cs.umass.edu/fddb/)
在evaluation的readme中,官方指出了检测结果需要输出的格式:

...<image name i><number of faces in this image =im><face i1><face i2>...<face im>...

Face的检测结果支持两种格式,矩形和椭圆形:

  4 a. Rectangular regions       Each face region is represented as:       <left_x top_y width height detection_score>   4 b. Elliptical regions       Each face region is represented as:       <major_axis_radius minor_axis_radius angle center_x center_y detection_score>.

其中,除了检测到的感兴趣区域的一些基本信息,还需要的一项指标为detection_score.数据的标注中,detection_score均为1。

Dlib

查阅dlib的文档,发现python端口有直接输出分数的接口。在FDDB数据集上跑了一遍,发现得到的结果中的分数并不在(0,1)之间,并且出现了负数。筛选掉负数之后,得到:

maxScore = 3.9349198495200minScore = 0.0018603195987avgScore = 1.5157489330250

于是对所有的分数进行归一化处理:

finalScore=(ScoreminScore)/(maxScoreminScore)

得到最终的分数。

OpenCV

opencv中,并没有直接的detection_score的参数,外网上提到的也不多。有人提到将opencv人脸检测函数detectMultimScale还有一个重载函数:

void CascadeClassifier::detectMultiScale(InputArray image, vector<Rect>& objects, vector<int>& numDetections, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())void CascadeClassifier::detectMultiScale(InputArray image, std::vector<Rect>& objects, std::vector<int>& rejectLevels, std::vector<double>& levelWeights, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size(), bool outputRejectLevels=false )

直接暴力调用,将结果输出并且可视化,得到:

看起来和分数很像了。联系opencv中人脸检测算法采用的Adaboost方法训练出来的分类器,可以知道最终得到的分类器是一个级联分类器,如下图所示。

图片从从第一个分类器开始,当第一个分类器判断为True(是人脸),则送入下一个分类器,否则直接判断为不是人脸。通过一层一层分类器的判断,成功通过最后一个level的候选窗口才是正确的人脸。所以在函数参数中,rejectLevel表示被拒绝的层数,采用rejectLevel中最后一个level的levelWeight作为检测分数,还是有一定的道理。但是采用haarcascade模型得到的分数一般都很大,最后两层的输出基本在80~120以内,和dlib的分数相比差太多。并且在检测过程中如何进行筛选,每个level所采用的threshold到底是多少有待思考,我直接打开xml文件,文件描述的stagethreshold都在1~10之间,和得到的levelweight相差太大,还是有点找不到答案。

原创粉丝点击