人脸检测方法总结

本文将介绍:seetaface, opencv-Haar检测,深度学习mtcnn人脸检测

1.seetaface

该文章说:使用opencv的lbp人脸检测算法准确率、误检率表现均不是很好,另外算法需跑在ARM上,虽然深度学习一些算法如mtcnn效果很好,但速度很难保证。

算法思想概述

整个算法框架是呈漏斗型的,即先用计算量小的特征、分类方式快速过滤大量非人类窗口(图像上滑窗),然后用复杂特征、分类方式逐层筛选人脸。需要注意的是,论文上描述的是3个特征、3个分类模型(特征:LAB、SURF、SIFT,分类:boosted、MLP、MLP);而github上的源码并没有用到SIFT,最后几个MLP模型使用的都是SURF特征,MLP的输入维数分别为128、256、512,一共是4个分类模型(特征:LAB、SURF、SURF、SURF,分类:boosted、MLP-128、MLP-256、MLP-512)。
算法框架看起来并没有什么新意,都是用判别能力较弱、速度快的模型快速过滤掉大量非人脸,后采用精度更高、计算量大的模型。并且第一层特征LAB实际上就是opencv中的MB-LBP特征,只是LAB的lbp特征cell宽高都是固定3x3像素,opencv的MB-LBP特征cell有多种宽高。

算法步骤

主要描述源码的算法步骤,github上seetaface的模型参数文件seeta_fd_frontal_v1.0.bin中保存了算法用到的所有参数,包括LAB特征位置、boosted权重/阈值、MLP权重/偏置。

1.第一层LAB boosted分类模型

   1)一共有左侧脸、正脸、右侧脸三个LAB boosted模型。即有三份不同的特征、权重、阈值参数。

   2)每个LAB boosted模型中,包括150个弱分类器。可以理解为,40x40的滑窗中,不考虑边界情况共有1600个点,选取其中150个作为LAB特征的计算起点;每个LAB特征为9x9像素,3x3cell,cell宽高是3x3像素,计算输出为0~255;每个计算输出值对应一个累计权重值,用于分类器判断。因此,一个LAB boosted模型的参数为Point feat_[150],float thresh_[150],float weight_[150][256]。

   3)LAB的计算与opencv的稍有差异,在于lbp的9个顺序不一样、判断符号为大于等于号。

   4)弱分类器工作时,以10个为一组进行权重值累计,如果小于对应的累加权重值,则为非人脸窗口,继续下一个滑窗判断;如果15次累加结束(即150个弱分类器),大于对应的权重值,则判断为人脸窗口。

2.第二~四层SURF MLP分类模型

  1)一共有三个SURF MLP分类模型,每个模型在SURF窗口数、MLP神经网络层数、权重/偏置参数有不同,体现在模型文件中。

  2)SURF特征,均是2x2的cells,但特征的宽高比有5种(1:1 1:2 2:1 2:3 3:2)。比如(0,0,16,16)为1:1、(0,0,32,16)为2:1。每个cells计算得到8维数据[dx+、|dx|+、dx-、|dx|-、dy+、|dy|+、dy-、|dy|-],2x2cells即为2x2x8=32维数据,因此一个SURF特征为32维数据。三个模型在每个40x40滑窗中分别需计算4、8、16个SURF特征,即对应MLP的输入位数4x32=128、8x32=256、16x32=512。

  3)MLP的使用激活函数均为Relu,最后一层激活函数为Sigmoid。

  4)MLP输出结果为4维数据,0:score, 1:x回归,  2:y回归, 3:w/h回归。 所有MLP模型score > 0.5,且经过NMS后score累加大于默认阈值2,才判断为人脸。(可以理解为NMS前,这个位置至少要有3个窗口叠加,单个人脸窗口score一般为0.9多)

3.NMS非极大值抑制

   1)nms主要根据设置iou值(重叠区域/合并区域)来判断两个区域是否需合并。
   2)首先,先按score对人脸位置队列排序,高分放在最前面。并设置一个标记位mask_merged来判断对应区域是否已被合并。
   3)遍历人脸位置队列,分别与后面mask_merged为0的区域进行判断,如果重叠比例大于设定的iou值,则累加score,并将被合并的区域标记位置1。
   4)nms实际是根据iou值删除需被合并的人脸位置。

转载:https://blog.csdn.net/abc20002929/article/details/75193876
相关的值得收藏的文章:https://blog.csdn.net/hust_bochu_xuchao/article/details/53608540?utm_source=blogxgwz5
自己之前也写过一些使用seetaface的记录,seetaface+python+vs2015,https://blog.csdn.net/prolrj2015/article/details/89321383, 但是编译成功之后由于需要使用python调用dll文件,出现的问题待解决。(有同学解决了的话,希望告知呢)

2.Opencv自带的Haar特征分类器和dlib人脸检测方法

算法思想概述

CascadeClassifier为OpenCV中cv namespace下用来做目标检测的级联分类器的一个类。该类中封装的目标检测机制,简而言之是滑动窗口机制+级联分类器的方式

支持的特征

Haar、LBP和HOG,CascadeClassifier
1) Haar:因为之前从OpenCV1.0以来,一直都是只有用haar特征的级联分类器训练和检测(当时的检测函数称为cvHaarDetectObjects,训练得到的也是特征和node放在一起的xml),所以在之后当CascadeClassifier出现并统一三种特征到同一种机制和数据结构下时,没有放弃原来的C代码编写的haar检测,仍保留了原来的检测部分。另外,Haar在检测中无论是特征计算环节还是判断环节都是三种特征中最简洁的,但是笔者的经验中他的训练环节却往往是耗时最长的。

2) LBP:LBP在2.2中作为人脸检测的一种方法和Haar并列出现,他的单个点的检测方法(将在下面看到具体讨论)是三者中较为复杂的一个,所以当检测的点数相同时,如果不考虑特征计算时间,仅计算判断环节,他的时间是最长的。

3) HOG:在2.4.0中才开始出现在该类中的HOG检测,其实并不是OpenCV的新生力量,因为在较早的版本中HOG特征已经开始作为单独的行人检测模块出现。比较起来,虽然HOG在行人检测和这里的检测中同样是滑窗机制,但是一个是级联adaboost,另一个是SVM;而且HOG特征为了加入CascadeClassifier支持的特征行列改变了自身的特征计算方式:不再有相邻cell之间的影响,并且采用在Haar和LBP上都可行的积分图计算,放弃了曾经的HOGCache方式,虽然后者的加速性能远高于前者,而简单的HOG特征也使得他的分类效果有所下降(如果用SVM分类器对相同样本产生的两种HOG特征做分类,没有了相邻cell影响的计算方式下的HOG特征不那么容易完成分类)。这些是HOG为了加入CascadeClassifier而做出的牺牲,不过你肯定也想得到OpenCV保留了原有的HOG计算和检测机制。另外,HOG在特征计算环节是最耗时的,但他的判断环节和Haar一样的简洁。

CascadeClassifier检测的基本原理

xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定size特征(检测窗口)与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置,然后滑动窗口,检测图像的另一个区域,重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是50x50的区域,而训练时的是25x25,那么只有当输入图像缩小到一半的时候,才能匹配上,所以这里还有一个逐步缩小图像,也就是制作图像金字塔的流程。

void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects,
                                      double scaleFactor, int minNeighbors,
                                      int flags, Size minObjectSize, Size maxObjectSize)
{
    vector<int> fakeLevels;
    vector<double> fakeWeights;
    detectMultiScale( image, objects, fakeLevels, fakeWeights, scaleFactor,
        minNeighbors, flags, minObjectSize, maxObjectSize, false );
}	

参数意思:

  1. const Mat& image:输入图像
  2. vector& objects:输出的矩形向量组
  3. double scaleFactor=1.1:这个是每次缩小图像的比例,默认是1.1
  4. minNeighbors=3:匹配成功所需要的周围矩形框的数目,每一个特征匹配到的区域都是一个矩形框,只有多个矩形框同时存在的时候,才认为是匹配成功,比如人脸,这个默认值是3。
  5. flags=0:可以取如下这些值:
    CASCADE_DO_CANNY_PRUNING=1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域
    CASCADE_SCALE_IMAGE=2, 正常比例检测
    CASCADE_FIND_BIGGEST_OBJECT=4, 只检测最大的物体
    CASCADE_DO_ROUGH_SEARCH=8 初略的检测
  6. minObjectSize maxObjectSize:匹配物体的大小范围

由于人脸可能出现在图像的任何位置,在检测时用固定大小的窗口对图像从上到下、从左到右扫描,判断窗口里的子图像是否为人脸,这称为滑动窗口技术(sliding window)。为了检测不同大小的人脸,还需要对图像进行放大或者缩小构造图像金字塔,对每张缩放后的图像都用上面的方法进行扫描。由于采用了滑动窗口扫描技术,并且要对图像进行反复缩放然后扫描,因此整个检测过程会非常耗时。
以512x512大小的图像为例,假设分类器窗口为24x24,滑动窗口的步长为1,则总共需要扫描的窗口数为:以512x512大小的图像为例,假设分类器窗口为24x24,滑动窗口的步长为1,则总共需要扫描的窗口数为:1200000.即要检测一张图片需要扫描大于120万个窗口!!!计算量惊人,因此有必要采取某种措施提高效率,具体解决方案本文会给出。

此节转载:https://blog.csdn.net/qq_37791134/article/details/80583726

3.深度学习方法的mtcnn人脸检测

mtcnn-----Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks

该文章中说:人脸检测方法有许多,比如opencv自带的人脸Haar特征分类器和dlib人脸检测方法等。 对于opencv的人脸检测方法,有点是简单,快速;存在的问题是人脸检测效果不好。正面/垂直/光线较好的人脸,该方法可以检测出来,而侧面/歪斜/光线不好的人脸,无法检测。因此,该方法不适合现场应用。对于dlib人脸检测方法 ,效果好于opencv的方法,但是检测力度也难以达到现场应用标准。

本文中,我们采用了基于深度学习方法的mtcnn人脸检测系统。mtcnn人脸检测方法对自然环境中光线,角度和人脸表情变化更具有鲁棒性,人脸检测效果更好;同时,内存消耗不大,可以实现实时人脸检测。本文中采用mtcnn是基于python和tensorflow的实现(代码来自于davidsandberg,caffe实现代码参见:kpzhang93)

此节转载:https://github.com/chenlinzhong/face-login

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值