人脸检测是人脸识别的第一步,对于人脸检测而言,毫无疑问,快速,有效,准确地在一个场景中识别出一个人脸是否存在,是影响整个人脸系统的关键性因素,那么人脸检测技术的可以采用哪些线索作为我们识别人脸是否存在的依据呢?人的皮肤颜色(对在图片或视频中),动作(人在视频中),人(头像的形状)人的表情,或者说这些因子的结合,都是可以用来推断人脸是否存在的一个关键性因素。那么,一旦讲这些关键性因素综合起来构成一个推测模型之后,我们就可以对整个图像进行穷举的方法,检测各种不同大小的 区块,从而判定人脸是否存在。下面我所要介绍的一个人脸检测框架,是一个十分通用的框架,即基于机器学习的方法进行检测的框架,也是现在绝大多数的人脸检测系统所采用的,也是这样的一个框架。
机器学习的框架的核心在于:通过学习大量的人脸数据和非人脸数据,形成对人脸数据知识库,再使用这样的一个知识库,新的照片进行检测,判断是否有人脸的存在。
基于外观和基于学习的方法:
对于基于外观和学习的方法技术的核心在于,我们没有必要对一个场景使用3D重构的复杂方法,而只需要对二维图像提取相关的特征即可做到,不同人的人脸虽然有所不同,但是人脸中的各个像素点之间是高度关联的,而在非人脸的图像中,则没有太好的一致性。
迄今为止,在人脸检测领域的几个重要的方法有:
1、主成份分析法(Principle Component Analysis)
主成份分析法由M.A.Turk 和 A.P.Pentland,基于主成份分析技术(Principle Component Analysis简称PCA)【1】用于检测人脸,B.Moghadddam 和A.Pentland【2】又提出了正交互补空间的方法,在该判别系统中,人脸出现的几率被建模为两个概率预测模型的混合,因此对于人脸检测有了更高的准确度。K.K. Sung和T Poggio提出了将人脸空间分解为一些人脸和非人脸的集合然后继续将这些集合分解为PCA和一些子空间。贝叶斯估计方法被用于估计获得有用的统计特征。H.Rowley S,Baluja等提出的系統使用神经网络模型,通过华东的窗口,在通过一个广延的预处理过程之后,输入图像通过滑动窗口被检测。Osuna提出了非线性支持向量机(support vertor machine SVM)的方法用于训练分类器来对人脸和非人脸进行训练。Yang et al使用SNoW(Sparse Network of Winnows)稀疏筛选网络的方法来学习人脸检测的结构,在这些系统中,boostrap algorithm(进化树方法)被迭代使用,从而从对重新训练探测器没有任何作用的不包含任何人脸的图片中来搜集一些有用的非人脸样本。
Scheneiderman 和Kanade使用对不同层级的小波使用多个层级的小波变换的方法,一个非线性人脸分类器从Adaboost方法中构建出的直方图中提取的统计。这个算法的计算代价非常高,对于一个320*240的图片,使用五个视图探测器需要一分钟时间才能检测到图片中所有的人脸。
Viola 和 Johns建立了一个快速、高效的人脸检测方法,在这个方法中AdaBoost方法被用于构建非线性分类器。AdaBoost方法被用于一下三个基本的步骤(1)从一个大的特征集中学习有用特征作为参考依据(2)基于选择的特征构建弱分类器(3)将这些弱分类器组合起来组成一个强分类器。弱分类器的选择是基于简单的哈尔小波特征而得到的,Viola和Johns使用了一些为了达到高效的计算效果使用了一些技巧性的处理方法,这些方法对于实时的应用都很有帮助。另外,一个从简单到复杂的分类器瀑布模型的提出使得检测的效率更加快速,实验证明对于前脸探测,对于320*240的图像每秒钟可以达到14帧的处理速度。
-
-
与护理
2.1皮肤颜色过滤
人类的皮肤和别的物体不一样,有着它自己颜色分布特征,人类的皮肤颜色可以被用于过滤图片以得到候选的人脸区域,它也可以被用于构建一个独立的基于颜色的人脸分类器。一个简单的基于颜色的人脸探测算法包括一下两个步骤(1)对可能的区域进行分段(2)区域整合
一个肤色概率模型,例如:p(color|face)可以从肤色颜色样本中推导出来,这个可以在HSV颜色空间或者正规化红绿蓝颜色空间,一个对p(color|face)建立的高斯混合模型可以导致更好的颜色建模。p(H|face)大于0.3并且S和V在特定的范围之内,那么一个肤色图则指示可能的候选人脸区域,而精确的人脸区域可以基于空间和颜色信息进行拼接而得到。例如:一个人脸包括眼睛,而该眼睛的区域通常颜色要比周边的区域要暗,一个成熟的基于颜色的人脸探测算法在Hsu中提到。
虽然基于颜色的人脸他呢系统在计算效率上非常吸引人,但是单凭颜色限制信息来获得高效率的人脸探测算法是远远不够的,这是由于存在大量的不同的条件(光找,阴影和种族)而导致的不同的颜色变化。而事实上,相比于颜色而言,人脸结构信息更加适合于获得人脸的特征,而肤色信息则更加适合于在视频中得到应用以达到更好的人脸探测效率。
2.2、图像正规化
基于人脸外观的方法需要在一个固定的子窗口上进行操作,因此对图像进行大小的转化十分有必要,对像素的正规化能够帮助我们纠正因为不同的相机或者光照条件下导致的图像的参数变化。正规化图像的意义是能够帮助纠正这些变化从而获得较好的样本,正规化操作包括平均值正规化没直方图正规化,和光度纠正,下面我们会对这些操作进行讨论。
一个简单的光度正规化操作叫做线性延伸(Linear Stretching).直方图正规化操作能够帮助我们降低极端值,子窗口I(x,y)通过一下的线性公式进行调整I'(x,y)=a*x+b*y+c,其中abc可以通过最小方差方法,而极端的光照条件在I''(x,y)=I(x,y)-I'(x,y),在进行正规化之后,子窗口的亮度分布变得紧凑和正规化,从而降低人脸识别的复杂度,这里必须要注意这些都是是全局的操作,因此每一个像素都会收到影响,亮度正规化也可以被用于局部子区域中,从而获得局部的哈尔小波特征。
2.3高斯混合模型
一个人脸和非人脸的子窗口的分布在高维空间上是非常复杂的,通常情况下,单高斯分布无法解决所有的这些变化,因此Sung和Poggio提出一个用于解决这个复杂度的方法,这个方法通过讲人脸训练数据分为许多类,而非人脸训练数据也可以分为多个类,这些类的选取是非常主观的,而这些集合则是基于Mahalanobis距离通过K-means的方法求得。
-
-
神经网络和基于核的方法
人脸探测的非线性分类器也可以使用神经网络的或者基于核的方法, 使用神经网络的方法,分类器可以被直接用于预处理和正规化的人脸和非人脸训练子窗口中,
-
-
基于AdaBoost的算法
对于Adaboost算法而言,我们的目标是获得一个强分类器HM(x),这个强分类器由多个简单的弱分类器所组成,构建的方法为:
其中x是需要被分类的模式, 是M个弱分类器, 是正规化因子,在离散版本的Adaboost算法中, 取值±1,而在连续的Adaboost算法中, 则为连续值,同时 也是连续值,因此预测 ,而对于选取结果的置信值为 。
Adaboost学习过程的目标在于学习一系列最好的弱分类器 和组合权重值 。我们通过一组训练数据 ,其中 是类标签,用于标记 ,用于标记训练样本 的权重分布 在每一次计算后被升级,而在每一次升级之后,难以被分类的样本 则会被赋予更大的权重,因此在协议轮迭代计算中,更多的计算将会被强调在这些权值比较大的样本上。
在Viola和Jones的人脸探测工作中,弱分类器 通过对向量特征 设定阈值从而获得结果,在Adaboost算法的连续实数模型,例如LogitBoost和RealBoost算法中,弱分类器也可以通过相同的方法获得。
4.1类哈尔特征
Viola和Johns提出了四种基本的对人脸探测进行探测的向量特征如下图所示:
这种块状的特征它所探测的子窗口和子区域的大小位置发生的变化和变化,例如对于20*20的咨询黄口,那么将会有十万个这样不同大小,位置,形状的类哈尔特征的存在,对于特征k,标量值 可以被认为是将一组数据从400维转化到实数集中,这些标量数据集合形成了一个完备的特征集用于隐性的低维度的人脸模版。
这些类哈尔特征有意义的地方在于一下两点:1、可以基于这些类哈尔特征进行人脸分类器的构建 2、可以使用积分图像技术进行快速的特征计算。
积分图像是对图像的一个简单的处理方法,其中积分图像定义为:
获得这个积分图像也无需采取对每个像素都使用以上的公式进行计算,只需要通过下面的式子:
S(x,y)为像素点(x,y)所在的行的左边所有的像素之和,其中 ,那么使用积分图像,任何计算都可以通过四个数组元素引用进行计算,而无需对每个像素都进行计算,从而节省大量的时间代价,我们可以举例:
例如在上面的积分图像中,矩形D中的任何大小和位置都可以被有效地计算,例如 ,其中V=4+1-2-3即为D当中所包含的所有的像素值之和。
4.2构建弱分类器
正如前文中所提到,Adaboost算法的目的在于学习一系列的最佳弱分类器 ,通过和相应的权值 进行整合,他解决了以下三个问题:(1)从大量的特征集中选取有效的特征(2)通过选取的特征构建弱分类器(3)将这些弱分类器组合为一个强分类器。
Adaboost算法假设有一个选取弱分类器的过程,这个过程的任务在于从候选特征中选取最重要的特征,在离散Adaboost方法中,最简单的生成弱分类器的方法为“剪枝”,当特征是连续值的时候,剪枝可以通过对选取的特征值选取阈值的方法得到,如果特征值是离散值,那么可以通过对特征设定离散值标签的方法进行“剪枝”
对于离散Adaboost算法,剪枝可以通过一下的方法进行:假设我们已经构建了M-1个弱分类器并且我们想要构建 ,其中 。
在这个形式中, 由两个参数决定:标量特征 和阈值 ,这两个值可以由以下的特征决定:(1)最小加权分类误差值(2)在给定的人脸探测率的条件下最小错误分类率
假如我们希望通过最小化连续值特征的加权分类误差,那么我们可以对每个特征值 设定阈值 从而对加权误差值进行最小化,然后从所有候选特征中选择一个最好的特征,使得获得最小的加权误差值。
假如我们希望获得在给定的人脸识别率的基础上获得最小的错误识别率,那么我们可以通过对每一个 选择一个 ,这样特定的检测率可以通过 得到,因此,对应于这个新的 错误检测率。(还没理解。。。)
这里还有一个参数可以被用于平衡检测率和错误识别率
4.3组合成强分类器
Adaboost算法学习一系列弱分类器 并且讲他们组合为一个强分类器 ,通过最小化分类误差的上界来达到目的,这个指数误差上界为:
其中i是训练样本的下标,Adaboost算法对 分阶段进行最小化,已知当前的 和弱分类器 ,那么最佳的组合系数 的取值为:
最小值为:
加权误差率为:
其中 当C为真时为1,C为假时为0.
每一轮迭代之后权值以下面的公式被重新更新:
Opencv中的Adaboost算法
在opencv中,对Adaboost算法提供了非常好的支持,在Opencv中存在一个特殊的结构。。。
强分类器瀑布选择模型
强分类器能够有效地消除非人脸的子窗口,同时保证较高的人脸探测率,然而,一个强分类器可能并不能满足达到非常低的错误检测率的要求(例如低于10^-6),解决的方法是讲多个强分类器组合起来组成一个强分类器瀑布模型:
Viola和Johns讲这个概念扩张到训练强分类器瀑布模型中,正如上图所示,我们通常需要10到20个强分类器组成的,在人脸探测中过程中,如果人脸图片在前一个节点中没有被探测到,那么在下一个节点也不再会被继续探测,从而节省大量的时间,提高效率。
后续处理技巧
我们在对同一个图片进行人脸探测,由于我们对图片进行穷举搜索,因此在人脸存在的区域可能存在重叠度较高的子窗口区域,这些区域可能都会被标注为人脸,但是对于同一个人脸得到了多次搜索结果,其实也导致了冗余。
编辑WX:biyezuopin
网友评论