人脸检测方法研究记录

--------------------- 本文来自 HamTam12 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy

常见的人脸检测方法:

1.OpenCV人脸检测方法  
2.Dlib人脸检测方法 
3.libfacedetect人脸检测方法 
4.Seetaface人脸检测方法
5.单个CNN人脸检测方法
6.级联CNN人脸检测方法

1.OpenCV人脸检测方法  

采用的是harr-like特征提取 + adaboost级联分类器构成的人脸检测算法,可以设置要检测的人脸大小范围,召回率高,但有时会出现误检;当设置要检测的人脸比较大时,检测速度很快,可以达到实时检测;检测到的人脸框位置不够精细。

2.Dlib人脸检测方法 

dlib人脸检测采用的是经典的梯度方向直方图(HOG特征)提取 + 线性分类器 + 图像金字塔 + 滑动窗口的人脸检测方法,速度很快,只能检测80x80或更大的人脸,但可以通过图像上采样来检测更小的人脸。相比于opencv的人脸检测,召回率更高,误检率更低,且人脸框更准确,检测速度也同样很快。

3.libfacedetect人脸检测方法 

libfacedetect,该库调用非常简单,只有一个函数,纯C语言编译而成,不依赖任何第三方库。通过连续的优化,其人脸检测算法可以做到3.6毫秒处理一张VGA图像(最小48x48人脸),无论是检测速度、效果和人脸框位置的准确性都胜过opencv!!!
libfacedetect提供了四套接口,分别为frontal、frontal_surveillance、multiview、multiview_reinforce,其中multiview_reinforce效果最好,可以检测侧脸,速度比其它接口稍慢,但仍然比opencv的正脸检测要快,总而言之,非常好用,用起来非常简单!!!
此外,libfacedetect和dlib一样提供了人脸特征点检测,且libfacedetect对侧脸检测仍有不错的效果。

4.Seetaface人脸检测方法

SeetaFace人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块SeetaFace Detection、面部特征点定位模块SeetaFace Alignment以及人脸特征提取与比对模块SeetaFace Identification。它是一套包括所有技术模块的、完全开源的基准人脸识别系统。开源Github地址 

其中,SeetaFace Detection采用了一种结合传统人造特征与多层感知机(MLP)的级联结构,在FDDB上达到了84.4%的召回率(100个误检时),并可在单个i7 CPU上实时处理VGA分辨率的图像。 

人脸检测模块SeetaFace Detection采用的是一种结合经典级联结构和多层神经网络的人脸检测方法实现,其所采用的漏斗型级联结构(Funnel-Structured Cascade,FuSt)专门针对多姿态人脸检测而设计,其中引入了由粗到精的设计理念,兼顾了速度和精度的平衡。

5.单个CNN人脸检测方法

首先训练一个判断人脸非人脸的二分类器。例如采用卷积神经网络caffenet进行二分类,可以在imagenet数据集训练过的模型,利用自己的人脸数据集,进行微调。也可以自定义卷积网络进行训练,为了能检测到更小的人脸目标,我们一般采用小一点的卷积神经网络作为二分类模型,减小图像输入尺寸,加快预测速度。
然后将训练好的人脸判断分类网络的全连接层改为卷积层,这样网络变成了全卷积网络,可以接受任意输入图像大小,图像经过全卷积网络将得到特征图,特征图上每一个“点”对应该位置映射到原图上的感受野区域属于人脸的概率,将属于人脸概率大于设定阈值的视为人脸候选框。
图像上人脸的大小是变化的,为了适应这种变化,最暴力的办法就是使用图像金字塔的方式,将待检测的图像缩放到不同大小,以进行多尺度人脸检测。对多个尺度下检测出来的所有人脸候选框,做非极大值抑制NMS,得到最后人脸检测的结果。


6.级联CNN人脸检测方法

采用级联网络来进行人脸检测,参考2015年CVPR上的一篇论文A Convolution Neural Network Cascade for Face Detection,它采用了12-net,24-net,48-net级联网络用于人脸检测,12-calibration-net,24-calibration,48-calibration边界校订网络用于更好的定位人脸框。它最小能够检测12x12大小的人脸,相比于单个CNN的人脸检测方法,大大加快了人脸检测的速度,并提高了人脸框的准确度,人脸检测的准确率和召回率也很高,在FDDB数据集上达到了当时最高的分数。

(1)12-net:首先用一个输入为12 x 12图像的小网络来训练人脸非人脸二分类器,将最后的全连接层修改成卷积层,这样的全卷积网络即12-full-conv-net就可以接受任意大小的输入图像,输出的特征图表示对应感受野区域属于人脸的概率。在检测时,假设要检测的最小人连尺寸为K x K,例如40 x 40,将待检测的图像缩放到原来的12/K,然后将整幅图像输入到训练好的12 x 12的全卷积网络,得到特征图,设定阈值过滤掉得分低的,这样就可以去除绝大部分不感兴趣区域,保留一定数量的候选框。
(2)12-calibration-net:训练一个输入为12 x 12图像的校订网络,来矫正上一步12-net得到的人脸框边界,它实质上是一个45类分类器,判断当前图像中包含的人脸是左右偏了、上下偏了还是大了小了,即包括:
x方向上-0.17、0、0.17共3种平移
y方向上-0.17、0、0.17共3三种平移
以及0.83、0.91、1.0、1.1、1.21共5种缩放尺度
检测时,将上一步12-net得到的所有人脸候选框作为12-calibration-net的输入,根据其分类结果对候选框位置进行校订。
(3)localNMS:对上述12-calibration-net矫正后的人脸候选框做局部非极大值抑制,过滤掉其中重叠的得分较低的候选框,保留得分更高的人脸候选框。 

(4)24-net:训练输入为24 x 24图像的人脸分类器网络。测试时,以上一步localNMS得到的人脸候选框缩放到24 x 24大小,作为24-net网络输入,判定是否属于人脸,设置阈值保留得分较高的候选框。
(5)24-calibration-net:同样训练一个输入图像为24 x 24大小的边界校订分类网络,来矫正上一步24-net保留的人脸候选框的位置,候选框区域图像缩放到24 x 24大小,其它与12-calibration-net一致。
(6)localNMS:将24-calibration-net矫正后的人脸候选框进行局部非极大值抑制,过滤掉重叠的得分较低的候选框,保留得分更高的。

(7)48-net:训练一个更加准确的输入为48 x 48的人脸非人脸分类器。测试时,将上一步localNMS得到的人脸候选框缩放到48 x 48大小,作为48-net输入,保留得分高的人脸候选框。
(8)globalNMS:将48-net得到的所有人脸候选框进行全局非极大值抑制,保留所有的最佳人脸框
(9)48-calibration-net:训练一个输入为48 x 48的边界校订分类网络。测试时,将globalNMS得到的最佳人脸框缩放到48 x 48作为输入进行人脸框边界校订。

因此,我们需要先单独训练人脸非人脸二分类12-net,24-net,48-net网络,以及人脸框边界校订12-calibration-net,24-calibration,48-calibration网络。测试时,用图像金字塔来做多尺度人脸检测,对于任意的输入图像,依次经过12-net(12-full-conv-net) -> 12-calibration-net -> localNMS -> 24-net -> 24-calibration-net -> localNMS -> 48-net -> globalNMS -> 48-calibration-net,得到最终的人脸框作为检测结果。
其中localNMS和globalNMS(Non-maximum Suppression,NMS,非极大值抑制)的区别主要在于前者仅使用了IoU(Intersection over Union),即交集与并集的比值,而后者还用到了IoM(Intersection over Min-area),即交集与两者中最小面积的比值,来过滤重叠的候选框。
博主没有自己训练,而是直接用了作者训练好的模型。使用CNN_face_detection-master\face_detection文件夹下的face_cascade_fullconv_single_crop_single_image.py脚本可以对但张图像进行测试,代码如下,其中需要注意的是,我们可以根据需求来设置检测最小的人脸尺寸min_face_size,它与检测速度直接相关,如果我们需要检测的人脸比较大,例如在128x128以上时,检测可以达到实时水平。

小结

对比上述六种人脸检测方法,其中opencv、dlib和libfacedetect、seetaface都提供了人脸检测的接口可以直接调用,检测效果上个人认为是dlib ≈ libfacedetect ≈ seetaface > opencv,检测速度上,libfacedetect > dlib ≈ seetaface ≈ opencv。另外,后两种是采用深度学习的方法,单个CNN做人脸检测,效果一般速度较慢,但实现简单,而级联CNN人脸检测方法检测效果和速度都与dlib接近,但训练起来可能麻烦点。对于一般的应用需求,除了单CNN的方法,另外五种基本都能达到要求,其中libfacedetect具有最好的实时性,seetaface优势在于有一整套的人脸识别系统。
1.OpenCV人脸检测方法  
2.Dlib人脸检测方法 
3.libfacedetect人脸检测方法 
4.Seetaface人脸检测方法
5.单个CNN人脸检测方法
6.级联CNN人脸检测方法

--------------------- 本文来自 HamTam12 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy

 

 

 

 

 

https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值