经过这些天的查找资料,基本上人脸识别的算法都搞清了。。。下面简述一下各种算法:
(1) FPGA硬件选型采用Xilinx公司的Vertex芯片。该单元由视频采集模块、
异步FIFO模块、视频解码模块、I2C 配置接口模块、图像帧存控制模块、图像低
级处理模块、通信接口模块和FPGA配置电路组成。
(2)由于嵌入式系统对于内存要求比较高,而且要求负载小、处理能力弱等局
限性特点,而原来扩展型的检测分类器比较庞大,不利于嵌入式系统的实现。所
以选择最基本的特征及扩展特征,重新训练级联分类器,以便得到一个比较小,
而检测率较高、误检率减小的分类器。
(3) 系统设计中,必然面对如何最好的软硬件划分问题。软硬件功能分配时,
既要考虑市场可以提供的资源状况,又要考虑系统成本、开发时间等诸多因素。
因此,软硬件功能划分是一个复杂而艰苦的过程,确定了人脸检测系统的软硬件
协同设计架构是整个任务流程非常重要的环节。
(4) 认真分析整个人脸检测过程,采用了改进型的检测策略:人脸检测时,
待检测图像不做金字塔式处理,大小不变;而是逐层放大检测窗口,再对检测窗
口内的图像进行模式匹配。
(5) 通过对算法耗时性分析,确定可行性的优化方案。
(6) 根据人脸检测算法的流程,确定软硬件协同设计方案的架构,实现所需
要硬件加速的模块,最后挂接视频输入输出模块,完成人脸检测系统的搭建。
对人脸检测技术的历史及当今的人脸检测方法做了概述。而后介绍了
Adaboost学习算法的由来,并且讨论了Adaboost学习算法适用于人脸检测的优
点,最后说明了Adaboost人脸检测算法的原理。
下面根据对比以前的级联分类器的训练,提出了新的训练方法。主要表现
在选取样本库的建立、特征选取的原则以及剔除、最后根据训练的过程做了一些
优化等。其中详细介绍了弱分类器、强分类器以及级联分类器的设计方法。
介绍了人脸检测的实现流程,从最开始的图像预处理,图像逐步式检
测方法的确定,到最后人脸检测的合并方法。
同时说明了人脸检测系统的开发环境,这里重点介绍了Xilinx的
Virtex-II Pro开发板。然后介绍了开发工具ISE、EDK,以及相应的处理器Power
PC和IBM的CoreConnect总线介绍。
通过软硬件协同设计原理,然后对算法进行分析,确定人脸检测系统
的软硬件协同设计框架。之后进行算法的移植及软件优化、通过算法的速度瓶颈
分析以方便其后的硬件加速。然后通过熟悉IBM的Coreconnect总线以及高速总线
PLB的挂接方式IPIF,然后通过挂接通过速度瓶颈分析后要加速的模块,譬如长
整型乘法,图像缩减以及除法模块。
由人脸检测系统的评价标准入手,检验了级联分类器训练的效果以及
分析各种指标,最后对整体的软硬件系统设计进行了测试,是否达到实时的效果。
人脸模式特点的分析
由于人脸是具有复杂特征的三维模式,是一种有弹性的局部可变形的非刚性
目标,与刚性目标的检测和识别相比,非刚性目标的处理更加复杂和困难。通过
对人脸模式的分析,发现人脸具有如下特点:
1). 人脸具有结构的恒常性: 人类脸部具有相同的生理结构,眼睛、鼻子、
嘴等脸部器官的排列和相对位置不因个体差异和外界因素而改变。
2). 人脸外观具有很强的可变性: 个体外貌差异、表情变化、光照的影响、
位姿变化的影响、眼镜和化妆等脸部附属物的影响。
3). 人脸视图具有丰富而细致的模式变化: 人脸视图的模式变化一方面来
源于人脸外观的可变性,另一方面还来源于不同的图象采集、处理过程所产生的
变化,包括图象分辨率的变化、几何变换(如旋转、缩放、平移、镜像等)以及通
过中间载体(如印刷的纸张)引入的纹理。
4). 人脸模式包含的特征具有复杂性和多样性: 人脸图象所包含的模式特
征十分丰富,如肤色颜色特征、椭圆轮廓特征、对称等结构特征、直方图特征等
口。
由人脸的这些特征可以看见,人脸检测的实现是一项具有挑战意义的课题。
人脸检测实际上是一个两类的人脸鉴别问题,即在一幅图像中只有“人脸”
和“非人脸”之分。其基本思想是基于知识或统计的方法对人脸建模,然后比较
所有可能的待检测区域与已建立模型的匹配度,从而得到可能存在的人脸区域。
人脸检测方法主要有一下几类。
2.2.1 基于模板匹配的方法
所谓基于模板(Template-based)的方法,是指从构造人脸或某个面部器官的
模板(模型)出发,通过各种模板搜索与匹配算法,结合对模板参数的调整,达到
检测和定位人脸的目的。模板匹配方法通常是基于特征的方法的进一步确认。早
期的基于模板匹配的方法是这样做的:首先建立一个标准的人脸模板,由包含局
部人脸特征的子模板构成,然后对一幅输入图像进行全局搜索,对应不同尺度大
小的图像窗口,计算与标准人脸模板中不同部分的相关系数,通过预先设置的阈
值来判断该图像窗口中是否包含人脸。这种简单模板匹配的方法易于实现,但是
也存在着缺点:图像噪声对检测结果影响很大,因此需要对输入图像作适当的预
处理,而且模板的大小是人为设定的,因此不能动态检测眼睛等器官的位置。
Yullie 等人[3]提出了基于弹性模板的方法.弹性模板是由一个根据被测物
体形状而设定的参数化的可调模板和与之相应的能量函数所构成,能量函数要根
据图像的灰度信息、被测物体轮廓等先验知识来设计.弹性模板的参数向能量减
小的方向调整,当能量达到最小时,这组参数对应的模板形状最符合特征形状.
由于弹性模板可调,所以能够检测不同大小、具有不同偏转角度的物体。Miao
等[12]人提出了一种重心模板的方法。重心模板是由六种人脸器官边缘的重心组
成:两条眉毛的边缘、两只眼睛的边缘、鼻子和嘴的边缘。在图像中提取可能对
应于眉毛、眼睛、嘴等器官的水平方向的马赛克边缘(Mosaic Edge),计算各段
边缘的“重心(Gravity Center)”后,使用“重心”模板检测出候选人脸。
2.2.2 基于器官特征的方法
基于器官特征的方法[14]也分为两种,一种是自顶向下的方法,即根据一个
人脸模型〔一般是正面人脸模型)先在一个比较大的范围内寻找人脸候选区,由
粗到精地在一个最佳范围内定位人脸候选区,然后检测各种人脸器官特征。另一
种是自底向上的方法,这种方法首先提取人脸器官图像特征,然后根据人脸中各
器官的几何关系来确认人脸的存在。比如利用大量的特征,包括几何、空间、灰
度等各种度量,对人脸进行粗定位。再将人脸的几何关系由一个树型结构表示,
并计算出概率属性,作为判断是否为人脸的条件。
2.2.3 示例学习
示例学习的基本思想是从某一概念的已经给出的所有正例和反例的集合中,
归纳产生出接受所有正例,同时排斥所有反例的该概念的一般规则。将人脸检测
视为从模式样本中区分非人脸样本和人脸样本的模式识别问题,通过对人脸样本
集和非人脸样本集进行学习以得到分类算法。为了获得较高的精度,学习过程需
要大量的样本。另外,样本数据本身是高维矢量。因此,研究通用而有效的学习
算法的关键是精确的可区分度和数据维数的降低。
在概率上,几乎所有的统计模式识别方法都应用到了人脸检测这个问题上。
这里有两个方面, 一个是在特征提取方法上,使用了统计的方法,譬如主成分
分析。主成分分析(PCA,Principal Component Analysis)是最小方差准则下最
优的描述方法,它将输入数据的维数从图像空间的象素数减少为特征空间的维
数。其中,特征脸方法得到了广泛应用,就是用一组特征向量的加权线J性组合
来代表人脸。主成分分析考虑的是样本模式的整体非几何的特征表示,而局部特
征分析(LFA,Local Feature Analysis)则从局部的几何特征出发进行数据空间
的降维。将它用于人脸检测,分析和实验证明LFA是一种有效的目标检测方法。
另一个是在判别分类的算法上使用了统计的方法,如支持向量机。支持向量机
(SVM,Support Vector Machines)是一种二次规划(Quadratic Programming)方
法,它在处理大批量的人脸正、反例时,只选取那些位于分界面附近的数据来完
成学习过程。
示例学习的另一条途径是将多个表示人脸模式的线性空间进行组合。比如在
采用了Kohonen[3]自组织映射网络对人脸样本和非人脸样本聚类中,对每一类样
本进行Fisher线性判别,得到每一类的判别平面,从而构成图像子空间,并运用
高斯模型描述每个子空间,估计出类条件概率密度函数;这样,对于测试图像,
计算其属于各个子空间的概率,分类决策为概率最大的类是它所属的类,从而判
断测试图像是否为人脸。这些方法一般用于正面人脸检测。
2.2.4 神经网络
从本质上讲,神经网络也是一种基于样本的学习方法。将神经网络用于人脸
检测,取得了很大的进展。MIT 的学者首先对人脸样本集和非人脸样本集聚类,
以测试样本与人脸样本集和非人脸样本集的子类之间的距离作为识别特征向量,
利用多层感知器(MLP)网络作为分类器。CMU的研究人员直接以图像作为神经网络
的输入,设计了一个具有独特结构的适用于人脸特征的神经网络分类器,并且通
过前馈神经网络对检测结果优化。他们工作的共同之处是都采用了自调整
(bootstrap) 的学习原理,对分类器一边训练,一边测试,并把在测试过程中的
错误分类结果作为反例样本加入学习过程,从而减少了样本集的规模,并逐步的
提高了神经网络的分类性能。
2.2.5 基于隐马尔可夫模型的方法
马尔可夫模型的概念是一个离散时域有限状态自动机,隐马尔可夫模型HM
是指这一马尔可夫模型的内部状态外界不可见,外界只能看到各个时刻的输出
值。HMM的打分、解码和训练相应的算法是前向算法、Viterbi算法和前向后向算
法。对于人脸模式来说,我们可以把它分成前额、眼睛、鼻子、嘴巴和下巴这样
一个序列。那么人脸模式就可以通过对这些区域的有序的识别来检测。这正好是
隐马尔可夫模型容易做到的。Samaria等人提出了使用明M模型进行人脸检测的算
法。他们使用人脸区域的结构信息作为隐马尔可夫模型的状态迁移的条件。
2.2.6 基于AdaBoost 的方法
Boosting是一种分类器融合算法。Adaboost 学习算法原本是用来提高某种
简单分类算法的性能的,例如,可以用来提高简单的感知器的性能。它通过对一
些弱分类器的组合来形成一个强分类器。在Adaboost算法中,简单的分类算法被
称为弱学习算法。Adaboost算法通过一个迭代的训练过程来得到一个强的分类
器。在第一次训练出一个弱分类器后,训练样本的权重得到调整,从而使没有被
第一次训练出的弱分类器正确分类的样本的权重增加。如此迭代下去,最终得到
的分类器是对每次训练得到的弱分类器的一个线性组合。Viola 和Jones提出了
一种基于AdaBoost和快速特征提取的正面实时人脸检测算法。他们的算法在个人
计算机上达到了15帧/秒的速度。在MIT和CMU的测试集上有很好的表现。MSR 通
过利用3个视角的这样的检测器,实现了一个多视角的人脸检测算法。
2.2.7 基于彩色信息的方法
人脸的肤色在颜色空间中的分布相对比较集中,利用这个特点可以检测人
脸。这种万法的最大优点是对姿态变化不敏感用彩色信息检测人脸的关键是合理
选择色度坐标。常用的方案是将彩色的R、G、B分量归一化。目前人们研究更多
的是如何提取彩色的色度信息,即将RGB彩色空间转化为其它彩色空间,以突出
色度信息。
H.Martin 设计了肤色模型表征人脸颜色,利用一个感光模型对输入图像修
正和补偿,并建立人脸颜色分类器,其输出作为神经网络的输入进行检测。Tony
等采用高斯混合模型(GMM,Gaussian Mixture Model)表示人脸肤色R、G、B各分
量的统计分布,通过阈值比较判断象素是否为人脸象素。YINGDA工等利用彩色信
息,并结合人脸的纹理特征,设计了SGLD 共发矩阵方法进行检测。Haiyuan Wu
通过在XYZ彩色空间中,对人脸肤色和头发颜色的分布建立基于模糊逻辑理论的
描述模型,通过计算隶属度来确定人脸肤色区域。
2.2.8 频域中的特征提取
频域分析是图像处理的一种有效工具。在人脸检测领域,通过将图像变换到
频域上,可以根据频率特性,或者提取人脸的特征区域(点),或者获取整个人脸
的频域描述特征量来作为分类决策器的输入。M.Zobel等人在JPEG图像的DCT系数
中提取出额头、眼睛、鼻子、嘴唇、下巴等特征区域,通过人脸结构模型检测人
脸。
Nastar 等研究了人脸面容变化及其频谱变化的关系,他们发现人像的表情
变化和少许遮掩值影响局部光强度流,如果用频率来表达,只会影响高频部分,
称为高频现象。因此,用小波变换的方法滤掉高频信息,采用低频图像的频谱来
表达图像将会取得更好的效果。Constantine[49] P.Papageorgiou、Mlchael
Oren、Tomas Poggio等使用人脸图像的Haar小波系数作为特征矢量,搜集了大量
正反例样本,通过SVM 机制实现人脸检测。Christophe Garcia和Georgios
Tziritias对人脸图像小波变换系数做了统计分析,刻画人脸图像纹理的特征,
然后通过基于概率分布的Bhattacharrya距离进行分类得到人脸和非人脸的判别
规则。另外, T .Kondo和H.Yan在图像的Haar小波变换的保持低频分量的子带图
像LL 上直接进行人脸检测的研究,他们着重考虑了非均匀光照下的图像,采用
梯度矢量来处理偏光的情况。
2.2.9 多模态信息融合
人脸检测要考虑的因素很多,研究者们从不同的角度出发根据不同的信息来
设计检测方法。实际上,人的大脑对人脸的判别过程,借助了多种信息, 比如
肤色、人脸结构、纹理等;因此可以认为这是一个多模态信息融合的过程。研究
者的实践也表明,各种方法在单通道上的可靠性是有限的,但是如果采用多种方
法来证实人脸的存在,那么会得到更高的检测效率。
S.J.Mckenna等介绍了一个动态序列图像中的人脸识别系统,其中根据运动
信息、肤色信息和面部结构模型实现了人脸检测算法。S.H.Kim等人同样结合人
脸的对称性和一致性、运动信息、肤色信息,对视频流中的人脸进行检测[32]。
综上所述:
我选择了,所以选择了基于分类融合的Adaboost算法
2.3.2 AdaBoost 方法概述
AdaBoost(Adaptive Boost)算法是目前最流行的Boosting算法,它的提出源
于Boosting算法应用到实际问题中时存在的问题。Schapire提出Boosting算法
后,Freund提出了一种对其进行改进的力法,通过这种方法可以产生一系列神经
网络,各神经网络的训练集决定于在其之前产生的网络的表现,被己有网络错判
的训练样本将以较大的概率出现在新网络的训练集中。这样,新网络将能够更好
地处理对已有网络来说很困难的样本。虽然Boosting方法能够增强神经网络集成
的泛化能力,但是同时也可能使集成过分偏向于某几个特别困难的样本。因此,
该方法不太稳定,有时能起到很好的作用,有时却没有效果。另一方面,
Schapire[20]和Freund[21]的算法在解决实际问题时有一个缺陷,即它们都要求
弱学习算法学习正确率的下限,这在实际问题中很难做到。于是,Schapire和
Freund[22]于1995年提出了与Boosting算法效率接近但却很容易应用到实际问
题中的AdaBoost算法。
作为一种Boosting算法,Adaboost算法也包括提升算法和基本算法两部分,
基本算法或弱学习算法实际上是去选择合适的判别函数,或者说去找弱分类器,
提升算法是一个迭代的过程,每一次迭代都要选择一个分类错误率最小的弱分类
器,同时调整所有训练样本的权值,增加被分类错误样本的权值,使以后选择的
弱分类器更加重视这些训练样本,以提高最终分类器的泛化能力。
Adaboost算法
2.4 基于Adaboost 的人脸检测
Paul Viola 和Michael J.Jones[2]使用了一种用Adaboost 方法训练得到的
基于多特征的分层人脸特征检测系统。与此前提出的人脸检测算法相比,他们的
系统具有极高的运行速度,在没有引入其他辅助信息(如相邻帧之间的差异等)
的情况下,检测准确率和错误接受率都能达到现有算法中最好的水平,因此,该
算法在人脸分析领域引起了广泛的关注,这一算法的特点是:1. 对图像做分类的时候,不是直接使用图像的灰度值,而是使用一些简单的图像特征(Haar-like
特征)作为分类的依据。2.在对新图像的表示方法上,采用积分图像,利用它可
以快速计算Haar-like特征值。3. 该方法提出了使用Adaboost 来选择少数重要
特征组成弱分类器(Weak Classifier)叠加成为强分类器。4. 为了进一步提高
系统的速度,还提出了一个瀑布式的程序框架,对每一层使用Adaboost 训练直
至得到最小的错误拒绝率,将强分类器串联成级联分类器用于检测人脸。
2.4.1 人脸特征表示(Haar-like 特征)
在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且
基于特征的系统比基于象素的系统要快得多。矩形特征对一些简单的图形结构,
比如边缘、线段,比较敏感,但是其只能描述特定走向(水平、垂直、对角)的
结构,因此比较粗略。如脸部一些特征能够由矩形特征简单地描绘,例如,通常,
眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。
鉴于以上原因,Viola提出的Haar型特征使用矩形特征作为分类的依据,因类似
与Haar小波而得名
最初特征库包含有三种类型5中形式的特征,如图所示
级联分类器试用及优化
一个人脸检测系统的核心在于有一个好的算法,而一个好的人脸检测算法的核心
又在于有一个好的级联分类器,能够迅速的分辨人脸与非人脸。但是原来基于PC平台
的人脸检测算法所需要的级联分类器非常庞大,并且训练所需要的人脸和非人脸样本
库数量多,训练的周期长,庞大的级联分类器以及运行时所受的负载空间都造成了嵌
入式系统性能的损失。因此本节主要针对以上问题从样本库选取,训练特征选取及分
类器生成方面做了优化。最终得到了一个基数少、虽然检测率和误检率比PC平台略低
的级联分类器,却满足了嵌入式人脸检测系统的需求的系统。
3.1 训练流程图
如图3所示,Adaboost算法模块的输入为训练样本的特征,共经过T次迭代,得到
T个分类能力较强的弱分类器。在每次迭代中,根据弱分类器的判断结果与样本的权
重分布,选择一个错误率最小的弱分类器作为本次迭代产生的弱分类器h(n),之后更
新每个训练样本的权值,更新的策略为增大h(n)所错分的样本的权值,这样,在下一
次的迭代中,这些被错分的样本将予以更大的重视,在经过T次迭代后,共产生T个弱
分类器,组合后便是分类能力较强的强分类器。
人脸检测过程
检测部分的主要工作:首先加载级联分类器,然后加载当前的图像;加载图
像后,重新生成一幅灰度图像,即把原来YUV格式的每点象素值用8位灰度值表示。
然后对图像进行积分图计算;接着对图像进行分步式检测,由一定规格的子图像
按一定策略对整幅图像分类,然后逐渐扩大子图像直到不比当前帧图像小;子图
像检测的整个过程,就是由简单到复杂的检测过程,首先选择人脸特征比较明显
的分类特性,去掉大部分没有人脸的子图像,然后通过每一级分类器筛选,最终
判断是否整幅图像含有人脸。
图 7 人脸检测流程图
一、 预处理
通过上一章所述的方法训练出来的多层级联分类器来检测人脸,但是检测输
入一般是按照视频口接入的,所以在检测之前需要做预处理工作。
1. 读取待检测图像,如果是彩色图像,然后转换为灰度图像。
2. 把训练得到的级联分类器的所有参数读入内存。
3. 设定检测窗口的初始大小为20*20,和训练样本大小一样。
4. 检测窗口放大比例为1.2。
二、 图像检测方法
在Viola提出多尺度方法[28]前,通常检测采用一种称为图像金字塔式的多
尺度检测方法,即按比例逐层缩小待检测图像形成一个图像金字塔,然后在图像
金字塔中穷举待检测子窗口把各个待检测子窗口作为分类器的输入,最后得到检
测结果。这种方法的特点主要是检测子窗口的大小固定而被检测图像则被不断的
缩小,这也导致了一个问题就是如果待检测图像比较大的话图像的缩小变换将会
占用大量时间,从而降低检测速度。
为了防止发生这种问题,本文采用的是Viola所使用的多尺度方法。即把待
检测图像的大小保持不变,逐层等比放大检测窗口,然后再用各层窗口穷举整张
待检测图像。因为这种方法不需要缩小图像所以相当于提高了检测速度,实际上
所谓的放大检测窗口只是修改检测窗口的长和宽(初始值为20*20 放大时乘以一
个放大系数) 。检测时根据检测窗口的位置大小截取子图像。
本文所采用的检测窗口实际上就是haar 矩形特征,所以放大检测窗口实际
上也就是对特征进行放大而对于haar 矩形特征而言,对于任意大小的矩形特征
特征值的计算代价是一样的,所以这也是采用矩形特征作为弱分类器的一个缘
故。这里放大系数越大检测窗口的放大次数就越少,被检测图像中被检测到的子
窗口数就越少,系统的检测率就会降低,但检测速度将提高;反之亦然。
Viola[28]的实验已经表明窗口放大系数为1.25 或1.2 时带来的漏检较少,
同时可以获得不错的检测速度。此外由于矩形特征对于位移并不是很敏感,所以
没有必要对每个像素位置都进行检测,当前检测窗口的位移步长加上当前检测窗
口的像素位置就是下一次检测的位置。假设一个20*20的标准检测窗口扫描的基
本位移步长为a, 当前检测窗口相对于20*20标准检测窗口的放大系数是b, 则
形式化的各种规模的检测窗口的位移步长就是a×b 。这里步长越大,检测速度
就越高,但检测率就越低;反之亦然。本文所使用的多尺度放大系数是1.2, 基
本位移步长是1或者2,当检测到人脸时,步长为2,没有检测到步长时,步长为2,
关于检测窗口的放大需要注意的是虽然检测窗口放大了,但是各个弱分类器的阈
值仍然保持不变。这个问题可以如下来证明。
如果检测窗口放大 1.2倍,其实可以相当于将样本图像和矩形特征也放大
1.2倍,然后重新训练样本得到新的级联分类器,最后使用这个新生成的级联分
类器对放大后的检测窗口进行检测。为了证明不用重新训练,只要证明想象中的
新级联分类器里的各弱分类器的阈值和原来一样即可。即只要弱分类器的阈值不
变,那么强分类器的阈值也不变。弱分类器的阈值其实是某个被选中的矩形特征
在某一样本图像上的特征值,简言之, 弱分类器的阈值就是一个特征值。如果
样本图像和矩形特征都放大1.2倍, 这时的矩形特征值
其中1 w 、2 w 是初始权值,是根据矩形特征的原型的权值比确定的,在训练
和检测过程中不变;area为原样本图像的面积,样本放大1.2倍其面积放大
;recsum是1 r 内所有象素灰度值之和,recsum是r 内所有象素灰度值之和
通过等比例计算,矩形特征值不变,弱分类器的阈值也不变,仍然是原来的
级联分类器,不必放大样本和矩形特征来重新训练生成新的级联分类器了。
所以矩形特征值不变弱分类器的阈值也不变也就不需要通过放大样本图像
和矩形特征来重新训练新的多层级联分类器。所以前面所述的把权值除以样本图
像的面积Area也就是为了实现在放大检测窗口的同时保持分类器的阈值不变的
目的。