Haar特征与人脸检测

计算机视觉关心的一大话题就是试图告诉机器去理解、模拟人类的视觉过程,尽管从目前来看人类还未从根本上解释这一过程,不过一些铺垫性的工作告诉我们这其中的共性,比如科学家认为人类触发视觉的过程是一个从低级到高级的过程,大脑皮层视觉细胞首先能感知到低级的边缘特征,然后这些边缘特征通过叠加可以得到浅层的“线”形或者“棒”形的特征,其次是这些特征构成的较为高级的“弯曲”特征,最后综合而成为真正意义上的高级特征,可以说卷积神经网络的成功应用是对这一方面的很好地诠释。当然,本篇文章不是来探讨深度神经网络,而是指出诸如“边缘检测”等方法在计算机视觉发展过程中的重要应用,因此想写一个系列,主要说明一下像SIFT特征、Haar特征、HOG特征、LBP特征等等非常具有代表性的技术,尽管现在的神经网络在各个领域都已非常流行,而且基于深度神经网络的算法并不需要显示的去提取某种单一的特征,但是这些经典的算法在图像预处理、目标检测或跟踪等应用中发挥除了极大的作用。在本篇文章里首先介绍基于Haar特征和Adaboost的人脸检测方法。

1. Haar特征

很多人提到人脸识别主要关心的点就是人脸分类,但是在真正进行分类之前有一个非常关键的步骤即人脸检测。在学术领域人脸检测和分类是两个截然不同的领域,而在现实生活中我们的分类工作往往难以获得比较好的人脸样本,比如在进行实时监控的时候,人脸检测面临尺度不确定、分辨率不一致、人脸角度、表情、遮挡或者光照等等因素的综合影响,因此和人脸分类动辄99+的精度相比,其前期的处理工作人脸检测显得相当重要。人脸检测有一个非常非常经典的算法,也就是2001年Viola Jones的那篇Rapid Object Detection using a Boosted cascade of simple features中提到的使用Haar特征加Adaboost级联分类器进行人脸检测的框架,这篇文章自CVPR发表以来在学术界和工业界都取得了重大成果~本文将通过这篇文章的理解做一个介绍~这个框架主要分成两个部分,一个是使用简单的Haar特征提取人脸相关区域的集合特征,另一个是使用提取特征构成的弱分类器级联,最终达到检测的目的。Haar特征本质上是一个通过矩形模板进行匹配比较的过程,对于一张人脸图像,我们直觉上想到的是其中包含一些特殊的走向的特征,比如眼眶周围水平的走向,鼻子垂直的走向,而且这些特征可以被矩阵模板进行匹配比较:对于眼眶内部的眼睛一般会比眼眶外部要黑或者深一些,鼻梁外侧比鼻梁要深,嘴唇比嘴巴外部要深一些,如下图所示:Haar人脸检测就是利用上图中小可以伸缩、可以平移地模板和人脸图像(也可以叫做人脸检测器)进行匹配,按黑白区域的像素权重计算出像素和的差值,对于某一个大小和方向的模板可以认作是一种特征,并且每一种特征都可以训练构成一个简单的弱分类器,然后利用集成学习的思想级联这些弱分类器构成强分类器进而达到检测的目的,因此从本质上看人脸检测也可以看成是一个分类的过程。但是从这个过程我们可以看出对于某个类型的矩形模板,由于方向和尺度不一而造成总的特征数目巨大,比如对于上图中的第一个模板, Rainer Lienhart计算出其包含的特征多达43200个。假设窗口大小为W\times H\这种矩形模板的大小为w\times h\其包含的特征数计算公式为XY\cdot(W+1-w\frac{x+1}{2})\cdot (H+1-h\frac{y+1}{2})\

2. 积分图

1中我们知道某个矩形模板匹配的特征值定义为:相应区域的白色像素区域之和减去黑色像素区域之和得到的差值,由于矩形模块数据众多,因此对于给定的模板,每次都统计区域的像素和需要很大的计算量,在Viloa的文章中给出了积分图(Integral Image)的概念,让这个过程的时间开销大大降低。积分图的概念非常类似定积分的计算过程,如下图:

K7HO7`N`{E%AUM%DHLKE)HD.png

对于任意给定的横坐标t\,如果从0\t\之间的面积是已知的为,那么对于不同两点a\b\和曲线f(x)\围城区域的面积等价于下式:

\int_{a}^{b}f(x)=\int_{0}^{b}f(x)-\int_{0}^{a}f(x)\

而对于图像来说是一个二维矩阵,比如下图s_{1}\

LFY$[$]JI~QP{H}55OFSUXV.png

定义S_{1},S_{2},S_{3},S_{4}\分别为1,2,3,4点到坐上角定点围成的矩形的面积,如果现在需要求图中区域D\的面积,那么显然可以通过S_D=S_{4}+S_{1}-S_{2}-S_{3}\得到,而且这样给我的一个启发是:只需要对原始图像遍历一遍,得到任意一点和顶点围成的矩形区域的面积,那么对于任意矩形模板的区域像素和都可以轻松计算,这样能够大大减少计算。这个思想实际就是积分的思想,只不过这里是二维离散的形式,本质上并无区别。

3. Aadboost算法

Adaboost是一种典型的集成学习算法,集成学习在机器学习历史上曾经经历了辉煌的阶段,特别是在90年代和支持向量机争天下的风光年代~早期的boosting方法、后来的adaboost算法、随机森林,以及现在工业界广泛使用的梯度增强决策树方法,都是集成学习的思想。据说viloa文章提出的四五年后haar+adaboost的方法被工业界用于数码相机的芯片中,而且opencv中开源的人脸检测接口也是用这一套去实现的。在学习理论中有“强学习”和“弱学习”的概念,强学习是指某个预测或者学习能够获得显著性效果的提升,这种学习一般很难直接获得;弱学习是指那些仅比随机猜测略好一点的学习过程,但是这些学习过程很容易获得,比如上节中通过矩形模板匹配构造的haar特征,计算学习理论认为只要拥有足够的数据,那么可以通过集成弱分类器达到任意精度,而对于人脸检测来说,构造的每一个矩形模板都可以形成一个弱分类器,即判断黑白像素之差是否大于或者小于某个阈值,通过多次迭代依据上一轮迭代的错误率来赋予那些错分样本较高的权值,在下一轮重点考察这些样本,最终构造出一个基于多个弱分类投票决策的强分类器从而达到分类的目的。基于haar特征+adaboost分类器分类的步骤如下:

  • 输入一系列图像样本(x_{1},y_{1}),(x_{2},y_{2}),...(x_{n},y_{n})\x\表示图像样本,y\为标签,即这张图像是否是人脸,下标表示样本序列,标签取1或者0表示是或者不是人脸;
  • 初始化每个样本的权重,取w_{1,i}=\frac{1}{2m},\frac{1}{2l}\m\l\分别代表正负类样本的个数;
  • 开始迭代过程1,2...t,..T\
  1. 标准化每个样本的权值:w_{t,i}\leftarrow \frac{w_{t,i}}{\sum_{j=1}^{n}w_{t,i}}\

  2. 学习最优弱分类器:\epsilon _{t}=min_{f,p,\theta }\sum_{i}^{ }w_{i} \left | h(x_{i},f,p,\theta)-y_{i} \right|\,即对于本轮已经给定的每个样本分配的权重,使总的样本分类误差较小;

  3. 定义h_{t}(x) = h(x,f_{t},p_{t},\theta_{t})\,即本轮学习得到的自由弱分类器;

  4. 更新权重值:w_{t+1,i}=w_{t,i}\beta_{t}^{1-e_{i}}\,当正确分类时e_{i}\取值0,误分类时取值1,\beta_{t}=\frac{\epsilon _{t}}{1-\epsilon _{t}}\。这里权重值的更新似乎和其他地方介绍的有所不同,不过观察可以发现如果误分类的时候相当于不更新此样本的权重,但是正确分类的时候需要更新,并且会乘以\beta_{t}\,而误差值\epsilon_{t}<0.5\,因此\beta_{t}<1\;换句话说就是正确分类的时候减小此样本的权重值,误分类的时候不变。

  • 多次迭代之后最后得到强分类器:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注