CV笔记10:人脸检测之Haar-like特征


一、背景介绍

我们会经常听到人脸检测和人脸识别这两个名词,但是你真的分清了他两者的含义了吗?简单地讲,人脸检测的目标就是将图像中的人脸位置进行标记,通常使人脸位置以矩形框(bounding box)的形式给出,也就是说人脸识别就是找出图像中的人脸。在人脸识别中,其目标是判断图像中的人脸到底是哪一个人的,通常人脸识别包含了人脸检测步骤,也就是我先找出来图像中的人脸,再判断这个人脸是谁。
下面简单说明一下人脸检测的大体流程和思路,该流程思路其实为传统目标检测的具体化应用,也可以移植应用在其他的目标检测场景中,唯一不同的就是检测的具体目标不一样而已。例如,我可以将检测的目标换成小猫、小狗等。

1.1 人脸检测分类器训练流程

  • 构建人脸数据库,其中包含人脸的正负样本:
    <1> 正样本:包含我们想要检测的人脸样本
    <2> 负样本:不含有人脸的样本,如衣服、墙壁等的图片
  • 使用正负样本进行训练,得到二分类器
  • 分类器接受固定大小的输入图像,并判断输入的图像是否为人脸

1.2 人脸检测测试样例检测流程

经过上面的训练,我们已经得到了一个人脸的分类预训练模型,能够检测图片是否含有人脸,这里强调一点,预训练模型中使用的训练图像一般和需要检测的图像存在较大的差异:训练集一般就是一张图像含有一张人脸,如下面的灰度图中人脸数据集;待检测图像就可能里面含有很多个人脸,如下面的THE9图片。
在这里插入图片描述
那么对于一张预训练模型未曾见过的待检测图像,又是如何进行检测的呢?如上面的THE9图片中,由于人脸可能出现在图像的任何位置,在检测时我们可以使用滑动窗口算法,用大小固定的窗口对图像从上都下、从左到右进行扫描,判断每一个扫描框中的子图是否为人脸。同时,为了实现检测不同大小的人脸,可以缩放扫描窗口或缩放图像、构造图像特征金字塔等,对缩放后的图像使用滑动窗口进行扫描。

1.3 人脸检测使用的特征

通过上面的讲解,已经大致了解的人脸检测的流程,但在使用上面的流程进行人脸检测时,我们往往会对图像进行特征提取,而并不是直接使用原始的训练图像或测试时每一个扫描框中的子图进行人脸检测。因此我们也能够得到下面的人脸检测流程:
在这里插入图片描述
在人脸检测中,我们能够提取多种不同的特征用于检测,像LBP特征、Hog特征等,但是在本文我们主要讲解Haar-Like特征。

二、Haar-Like特征

在2001年,Viola和Jones提出使用积分图计算Haar-Like特征,使用级联的AdaBoost分类器构造检测器,并进行人脸检测的方法,该方法和之前的方法在检测速度和精度上都得到了提高,其流程如下:

  • 计算积分图
  • 根据积分图,计算Haar-Like特征值
  • 使用AdaBoost训练强分类器
  • 讲多个强分类器级联,得到级联分类器,进行人脸检测

2.1 Haar特征介绍

Haar-Like具有以下的简要特征:

  • 特征模板内有白色和黑色两种矩形
  • 模板的特征值 = = = 白色区域内像素值的和 − - 黑色区域内像素值的和 (一般公式)
  • Haar-Like特征值反映了图像的灰度变化情况

Haar(哈尔)特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。下图展示了基本的Haar特征。
在这里插入图片描述
对于图中的A, B和D这类特征,特征数值计算公式为: v = Σ 白 − Σ 黑 v=Σ_白-Σ_黑 v=ΣΣ,而对于C来说,计算公式如下: v = Σ 白 − 2 × Σ 黑 v=Σ_白-2×Σ_黑 v=Σ2×Σ;之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致。如下图, Σ 白 Σ_白 Σ为所有青色区域内像素值的和, Σ 黑 Σ_黑 Σ为所有紫色区域内像素值的和。
在这里插入图片描述
Haar-Like思想是脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深。同样对于其他目标,如眼睛等,也可以用一些矩形特征来表示。我们希望当把矩形放到人脸区域计算出来的特征值和放到非人脸区域计算出来的特征值差别越大越好,这样就可以用来区分人脸和非人脸。并且使用特征比单纯地使用像素点具有很大的优越性,并且速度更快。
在这里插入图片描述
R.Lienhart和J.Maydt对Haar特征进行扩展,如下图,从而实现了更多特征提取的可能。但是,这种矩形特征只能对一些简单的图形结构,像边缘、线段比较敏感。
在这里插入图片描述
在实际的应用中,通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。所以直接使用模板计算,会产生很大的计算量。

2.2 haar特征计算之积分图

为了能够快速的计算Haar特征,积分图就展示了其强大。积分图就是只遍历一次图像就可以求出图像中任一矩形区域像素和的快速算法,大大的提高了图像特征值计算的效率。如下图所示,积分图上的点 ( x , y ) (x,y) (x,y)的值等于图像左上角到点 ( x , y ) (x,y) (x,y)构成的矩形区域内所有点的像素值之和。
在这里插入图片描述
我们使用 i i ( i , j ) ii(i,j) ii(i,j)表示积分图上 ( i , j ) (i,j) (i,j)处的值,用 f ( k , l ) f(k,l) f(k,l)表示原图像在点 ( k , l ) (k,l) (k,l)的像素值,则可以得到积分图的公式:
i i ( i , j ) = ∑ k ≤ i l ≤ j f ( k , l ) ii(i,j)=∑_{\begin{matrix}k≤i \\ l≤j \end{matrix}}f(k,l) ii(i,j)=kiljf(k,l)因此可以得到如下的积分图计算方法:

  • 使用 i i ( i , j ) ii(i,j) ii(i,j)表示积分图在点 ( i , j ) (i,j) (i,j)的值,初始化 i i ( − 1 , j ) = 0 ii(-1,j)=0 ii(1,j)=0
  • 使用 s ( i , j ) s(i,j) s(i,j)表示图像第 i i i行、第0至 j j j列像素的累加和,初始化 s ( i , − 1 ) = 0 s(i,−1)=0 s(i,1)=0
  • 逐行扫描图像,递归计算每个点 ( i , j ) (i,j) (i,j)的累加和 s ( i , j ) s(i,j) s(i,j)和积分图像 i i ( i , j ) ii(i,j) ii(i,j)的值: s ( i , j ) = s ( i , j − 1 ) + f ( i , j ) s(i,j)=s(i,j-1)+f(i,j) s(i,j)=s(i,j1)+f(i,j) i i ( i , j ) = i i ( i − 1 , j ) + s ( i , j ) ii(i,j)=ii(i-1,j)+s(i,j) ii(i,j)=ii(i1,j)+s(i,j)
  • 从左上角到右下角,按从左到右,从上到下的顺序扫描一遍图像,便计算完了图像对应的积分图

当得到积分图之后,对与图像中任何矩阵区域像素累加和都可以通过简单运算得到,如图所示:
在这里插入图片描述
其中,A、B、C、D表示4个矩形区域,1、2、3、4表示D区域的4个顶点,那么D区域像素值的累加和为: D s u m = i i ( 1 ) + i i ( 4 ) − i i ( 2 ) − i i ( 3 ) D_{sum}=ii(1)+ii(4)-ii(2)-ii(3) Dsum=ii(1)+ii(4)ii(2)ii(3)我们以下图为例,体会计算过程:
在这里插入图片描述
图中,A、B、C、D表示4个矩形区域,1、2、3、4表示D区域的4个顶点,有: i i ( 1 ) = 49 i i ( 2 ) = 96 i i ( 3 ) = 88 i i ( 4 ) = 157 ii(1)=49\qquad ii(2)=96 \qquad ii(3)=88 \qquad ii(4)=157 ii(1)=49ii(2)=96ii(3)=88ii(4)=157D区域的像素值累加和为: D s u m = i i ( 1 ) + i i ( 4 ) − i i ( 2 ) − i i ( 3 ) = 49 + 157 − 96 − 88 = 22 D_{sum}=ii(1)+ii(4)-ii(2)-ii(3)=49+157-96-88=22 Dsum=ii(1)+ii(4)ii(2)ii(3)=49+1579688=22所以,对于Haar特征的计算过程如下,以边缘特征为例:
在这里插入图片描述
D ( w h i t e ) = 8 + 62 − 14 − 33 = 23 D(white)=8+62-14-33=23 D(white)=8+621433=23 D ( b l a c k ) = 8 + 62 − 14 − 33 = 25 D(black)=8+62-14-33=25 D(black)=8+621433=25Haar特征值为: D ( w h i t e ) − D ( b l a c k ) = 23 − 25 = − 2 D(white)-D(black)=23-25=-2 D(white)D(black)=2325=2所以,矩形特征的特征值,只与特征矩形的端点的积分图有关,而与图像的坐标无关。通过计算特征矩形的端点的积分图,再进行简单的加减运算,就可以得到特征值,正因为如此,特征的计算速度大大提高,也提高了目标的检测速度。

2.3 Haar特征的含义及归一化处理

Haar特征含义:
了解了特征值的计算之后,我们来看看不同的特征值的含义是什么。我们选取MIT人脸库中2706个大小为 20 × 20 20×20 20×20的人脸正样本图像,计算如下图所示的Haar特征:
在这里插入图片描述
其中,左边的特征对应人眼区域,右边特征没有具体意义。
在这里插入图片描述
可以看到,图中2个不同Haar特征在同一组样本中具有不同的特征值分布,左边特征计算出的特征值基本都大于0(对样本的区分度大),而右边特征的特征值基本均匀分布于0两侧(对样本的区分度小)。所以,正是由于样本中Haar特征值分布不均匀,导致了不同Haar特征分类效果不同。显而易见,对正负样本区分度越大的特征分类效果越好,即红色曲线对应图中的的左边Haar特征分类效果好于右边Haar特征。
那么看到这里,应该理解了下面2个问题:
(1)在检测窗口通过平移+缩放可以产生一系列Haar特征,这些特征由于位置和大小不同,分类效果也不同;
(2)通过计算Haar特征的特征值,可以有将图像矩阵映射为1维特征值,有效实现了降维。
Haar特征归一化:
从上图我们可以发现,仅仅一个 12 × 8 12×8 12×8大小的Haar特征计算出的特征值变化范围从-2000~+6000,跨度非常大。这种跨度大的特性不利于量化评定特征值,所以需要进行“归一化”,压缩特征值范围。假设当前检测窗口中的图像像素为 i ( x , y ) i(x,y) i(x,y),当前检测窗口为 w × h w×h w×h大小(例如上图中为 20 × 20 20×20 20×20大小),OpenCV采用如下方式“归一化”:
1、计算检测窗口中图像的灰度值和灰度值平方和:
s u m = ∑ i ( x , y ) sum=\sum i(x,y) sum=i(x,y) s q s u m = ∑ i 2 ( x , y ) sq_{sum}=\sum i^2(x,y) sqsum=i2(x,y) 2、计算平均值: m e a n = s u m w ∗ h mean = \frac{sum}{w*h} mean=whsum s q m e a n = s q s u m w ∗ h sq_{mean}=\frac{sq_{sum}}{w*h} sqmean=whsqsum3、计算归一化因子: v a r N o r m F a c t o r = s q m e a n − m e a n 2 varNormFactor=\sqrt{sq_{mean}-mean^2} varNormFactor=sqmeanmean2 4、归一化特征值: n o r m V a l u e = f e a t u r e V a l u e v a r N o r m F a c t o r normValue=\frac{featureValue}{varNormFactor} normValue=varNormFactorfeatureValue之后使用归一化的特征值𝑛𝑜𝑟𝑚𝑉𝑎𝑙𝑢𝑒与阈值对比。

三、后续

在第二节我们讲了可以使用级联分类器进行人脸检测,对于什么是级联分类器,本文只做简单的介绍:
在这里插入图片描述
如上图,每一个数字圆圈代表一个强分类器,并以此连接起来。在人脸检测的过程中,只有当检测窗口被所有的强分类器都判定为人脸时,才认为这个检测窗口真的是人脸,若在检测过程中,有一个强分类器判定当前的检测窗口不是人脸,都会将该检测窗口判定为nonface,不再传递给下一个强分类器。这个过程也加快了检测速度,同时提高了检测正确率。对于级联分类器更详细的说明可以参照《第九节、人脸检测之Haar分类器》中的第五小节。当然级联分类器不止能使用在人脸检测中,依然能够实现场景的移植使用。

参考

目标检测算法-特征提取之(一)Haar特征
第九节、人脸检测之Haar分类器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值