Viola-Jones人脸识别原理

时间:2024-03-03 19:41:17

 

粗略过程:

  1. 提取图片的特征矩阵
  2. 用Adaboost对每一个特征矩阵选择最优的弱分类器
  3. 选择效果最好的Top N个分类器线性组合成强分类器,强分类器在进行筛选式连接
  4. 非极大值抑制

 

 

 

 

1. 人脸特征及Haar特征

人脸有一些适于机器提取的特征:如下图,人的眼睛区域会比眉心区域要暗一些,鼻梁区域会比两边要亮一些,而牙齿区域要比周围的嘴唇区域亮一些。这些区别主要体现在图片的每一个像素的值上(你应该明白每张图片都是由N × M个像素组成,每个像素块的值表示灰度)

 

 

 

基于以上的特征,Viola Jones用了一下5种特征矩形表示

 

 

 

把这些特征矩形放到人脸图像上,将矩形框内白色区域的像素总和减去黑色区域的像素总和,得到的就是人脸的特征值

 

 

 

 

2.如何求矩形框的像素值

如下图,我们把s(x, y)表示为 (x , y)该点往左往上的所有像素值之和,即图中阴影面积,成为(x, y)的像素积分和,其中每一个点的像素值表示为f(x , y),即s(x , y)=∑∑f(x‘ ,y’) (x’≤x, y’≤y)

 

 

 

于是对于下图,ABCD表示各区域的像素和,1234表示各点的像素积分和

 

 

有:1=A,2=A+B,3=A+C,4=A+B+C+D

于是有B=2-1 ,C=3-1, D=4-3-2+1

这么定义的好处是计算出每一点的像素积分和,可以轻松的求出给定区域的像素积分之和

 

3.如何提取图像特征

 

 

 

如上图,像(a)(b)这样的图像,最小需要2个像素点来表示,(c)(d)这样的矩形特征需要至少3个像素点表示。那么假设有一个1×12的图像,它可以有多少6种(a)类矩形,其高度为1,长度分别为2,4,6,8,10,12。那么每种矩形在1×12的图像里边有多少个呢?根据矩阵卷积原理,一个W*H的矩阵与m*n的filter卷积,得到的矩阵大小为:(W-m+1)*(H-n+1)(默认步长为1),新矩阵有的大小就是矩形的个数,即(W-m+1)*(H-n+1)个矩形,根据这个式子,各位可以编写程序计算,对于一个24×24的图像,有162336个特征矩形

 

4.Viola Jones分类器

4.1 AdaBoost

  Viola-Jones分类器是一个有监督分类器。其学习算法是AdaBoost,

AdaBoost 将一系列的弱分类器通过线性组合,构成一个强分类器,如下所示:

 

 

 

h(x) 是一个强分类器, 是一个弱分类器,其为一个简单的阈值函数:

 

 

 

注:上图h(x ,f ,p ,θ)为弱分类器

θ为阈值, 为系数,f(x)表示将对样本x进行某种函数映射后的值,至于p,各位可以简单的将它消掉

 

4.2 训练弱分类器

 

计算所有训练样本的特征值,并将其从小到大排序,随机选取一个特征值作为阈值,

把所有元素分为两部分,小于阈值的一部分分类为人脸,大于阈值的一部分分类为非人脸。

举个例子:[1,3,4,6,8]是5个样本x1,x2,x3,x4,x5经f(x)映射后的值,假设x1,x4,x5为人脸,

如果有一个弱分类器h1(x),其θ为4,则其对5个样本的判决结果为x1,x2 ,x3为人脸,其误差为3,因为它将两张人脸识别为非人脸,将一张非人脸识别为人脸

如果有一个弱分类器h2(x),其θ为6,则其认为前个样本都是人脸,其误差为3

如果有一个弱分类器h3(x),其θ为1,则其认为后4个样本都不是人脸,误差为2

尽管这例子不甚合理,但我们仍能知道,对于一个识别分类器来说,选择适当的阈值θ是至关重要的,于是我们在经过3轮实验后,将分类器h3(x)选为最优的分类器

4.3 训练强分类器

Viola Jones在论文中运用的AdaBoost算法如下图

 

 

 

  1. 首先给出n个样本数据(X1, Y1) (X2, Y2)……(Xn, Yn),其中如果样本Xi是人脸,则Yi的值为1,否则为0,设有m个人脸样本,l个非人脸样本,设每个样本有k个特征,假设由
  2. 给每个样本赋予一个初始的权重,其中人脸样本赋予的权重为1/2m,非人脸的权重为1/2l
  3. 假设我们设定进行T次迭代,for t in T:

{

1.每次迭代开始前,对每个样本的权重进行重新归一化,Wt,i表示第i个样本的第t次迭代时的权重

 

 

 

注:如果不知道为什么这样做,先看完整个流程再回来思考

2.对所有样本的每一个特征,用对应的分类器训练一遍,找出

的最小值,即从所有特征分类器中挑出性能最优的分类器

注: 的取值为0≤≤1

3.更新所有样本的Wt+1,

 

 

 因为θ是从特征值中随机选一个数作为阈值,所以 不可能为1

}

经过T轮迭代后,我们就得到了T个最优特征和其对应的分类器,时间复杂度为O(Tnk),将T个迭代器进行线性组合形成一个强分类器

 

 

 

5.级联分类器

但是由于正常图像中,人脸区域占了很小得一部分,如果对所有特征都进行训练的话,运算量非常大

于是我们采取将多个强分类器级联的方法,排在前面的分类器负责用少量的特征将大部分的非人脸区域剔除掉,后面再利用更复杂的特征将更复杂的非人脸区域剔除掉

如果级联分类器的识别率(true positive rate)为D,误识率(false positive rate)为F, 

第 i层的分类器的识别率为 , 误识率为 ,则

               

假如每一级的分类器,都具有非常高的检测率(99.9%),

同时误检率也保持相当高(50%)。

那么,如果级联20个这样的小adaboost分类器,

人脸的识别率为

 

 

 

误检率为

 

 

 

5.1 级联分类器的训练

论文中给出了一种很有效的方法

  •  

     

6 非极大值抑制(NMS)

在人脸识别中,一张脸会出现非常多的窗口,如下图所示:

 

 

 

假设有N个窗口,根据分类器的分类概率从小到大排序,概率最大的框记为Z

非极大值抑制的工作步骤如下:

  • 从最大概率矩形框Z开始,分别判断其它框与X框的重叠度是否大于设定的阈值
  • 假设其中的B,C框超过了阈值,就扔掉B,C,并保留Z框
  • 从剩下的矩形框中,选择概率最大的(假设为Y),然后判断其它框与X框的重叠度是否大于设定的阈值,大于扔掉,并保留框Y
  • 一直重复这个过程,直到最后一个框