↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
Datawhale干货
作者:陈锴,Datawhale优秀学习者,中山大学数学系
人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来。
目前人脸检测的方法主要有两大类:基于知识和基于统计。
基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛、眉毛、嘴巴、鼻子等器官的特征以及相互之间的几何位置关系来检测人脸。主要包括模板匹配、人脸特征、形状与边缘、纹理特性、颜色特征等方法。
基于统计的方法:将人脸看作一个整体的模式:二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模式空间,根据相似度量来判断人脸是否存在。主要包括主成分分析与特征脸、神经网络方法、支持向量机、隐马尔可夫模型、Adaboost算法等。
本文主要基于统计的方法,通过Adaboost算法和Haar特征来构建Haar分类器,对人脸和非人脸进行分类。
本文目录
1. 算法要点
1.1. Haar分类器训练步骤
1.2. Haar的局限性
2. Haar原理解析
2.1. Haar特征
2.2. 积分图构建
2.3. 计算Haar特征值
2.4. Haar特征归一化
2.5. 级联分类器
3. 人脸检测案例
3.1. 人脸检测
3.2. 人脸检测+人眼检测
3.3. 调用摄像头的动态人脸检测
一、算法要点
1.1 Haar分类器训练步骤
Haar分类器=Haar特征+积分图方法+Adaboost+级联。
其训练的五大步骤:
准备人脸、非人脸样本集;
使用Haar特征做检测;
使用积分图(Integral Image)对Haar特征求值进行加速;
使用AdaBoost算法训练区分人脸和非人脸的强分类器;
使用筛选式级联把强分类器级联到一起,提高准确率
具体步骤在第2节中会详细介绍。
1.2 Haar的局限性
仅为人脸检测,非人脸“辩识”,即只能框出人脸的位置,看不出人脸是谁。
仅能标出静态图片和视频帧上的人脸、人眼和微笑,不能进行“活体识别”,即不能看出这张脸是真人还是手机上的照片,如果用于人脸打卡签到、人脸支付的话会带来潜在的安全风险。
仅为普通的机器学习方法,没有用到深度学习和深层神经网络。
二、Haar原理解析
2.1 Haar特征
Haar特征包含三种:边缘特征、线性特征、中心特征和对角线特征。每种分类器都从图片中提取出对应的特征。有点类似于卷积神经网络中的卷积核,每个卷积核提取出对应的特征。
我们最基础的卷积核(划掉),哦不haar特征为下图中的Basic Haar Set:
我们通常将Haar特征分为以下三类,我们根据名字就可以分辨出这三类的用途:
第一类是边缘特征:
第二类是线性特征:
第三类是中心特征:
特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。
例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。由于有时候人脸未必是定向的,可能是会有歪曲的,因此我们可以训练旋转一定角度的矩形特征来识别人脸。
总而言之,Haar特征就是利用一些固定的特征来模拟人脸中的相关特征。
矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。这样就有两个问题需要解决了:
(1)如何快速计算那么多的特征?---积分图大显神通;
(2)哪些矩形特征才是对分类器分类最有效的?---如通过AdaBoost算法来训练。
2.2 积分图构建
在一个图像窗口中,可以提取出大量的Haar矩形特征区域,如果在计算Haar特征值时,每次都遍历矩形特征区域,将会造成大量重复计算,严重浪费时间。积分图是一种快速计算矩形特征的方法,主要思想是将图像起始像素点到每一个像素点之间所形成的矩形区域的像素值的和,作为一个元素保存下来,即将原始图像转换为积分图(或者求和图),当求某一矩形区域的像素和时,只需要索引矩形区域4个角点在积分图中的取值,进行普通的加减运算,即可求得Haar特征值,整个过程只需遍历一次图像,计算特征的时间复杂度为常数(O(1)),可以大大提升计算效率。积分图中元素的公式定义如下:
上式含义是在
位置处,积分图中元素为原图像中对应像素左上角所有像素值之和,
表示一个积分图像。在具体实现时,可用下式进行迭代运算:
其中 是行方向的累加和,初始值