1、摘 要摘 要人脸检测是指任意给定一副图像或者一组图像序列,判定该图像或图像序列中是否存在人脸。本文研究人脸检测以及实时性人脸检测问题。在人脸检测环节中,本文采用了基于AdaBoost算法的人脸检测以及图片预处理技术,并通过调用OpenCv里的函数来实现人脸检测的实时性。AdaBoost的人脸检测从一个较大的特征集中选择少量关键的haar-like特征,产生一个高效的强分类器。再用级联方式将单个的强分类器级联成为一个更加复杂的级联分类器。分类器的好坏决定了一个人脸检测系统的好坏。在图像预处理环节,本文采用直方图均衡化、中值滤波的处理方法,能够大大加快人脸检测的速度。最后,在实现实时性的时候,通过
2、调用CvCapture- FromCAM函数从视频当中获取图片,实现本系统的实时性。关键字:人脸检测,AdaBoost算法,图像处理IABSTRACTABSTRACTWe mainly study human face detection and real-time face detection problem. In the part of the face detection, we use the algorithm based on AdaBoost to realize face detection,and call the function in the OpenCv to ach
3、ieve real-time face detection. AdaBoost face detection is a method which select a small number of key haar-like features from a larger feature, resulting in an efficient and strong classifier. Then we cascade to a single strong classifier which is cascaded into a more complex cascade classifier. The
4、 quality of the classifier determines a face detection system good or bad. In image preprocessing, histogram equalization and median filtering approach can greatly accelerate the speed of face detection. Finally, to realize “real-time”, we call cvCaptureFromCAM functions to obtain pictures from the
5、video.Keywords: Face detection, AdaBoost algorithm , Image processing目 录目 录第1章 引 言11.1选题背景11.2国内外发展现状21.3人脸检测方法31.3.1特征不变量方法31.3.2基于知识的方法41.4研究思路4第2章 AdaBoost算法62.1 AdaBoost算法简介62.2矩形特征72.3积分图92.4级联分类器112.5AdaBoost算法描述11第3章 AdaBoost算法训练过程133.1AdaBoost算法训练过程133.2弱分类器163.3强分类器183.4分类器训练183.5人脸检测过程203.
6、6实验结果分析23第4章 图像预处理254.1 直方图均衡化254.2灰度变换264.3 中值滤波27第5章 实时性人脸检测研究295.1 实时性人脸检测系统描述295.2 OpenCv视觉函数库305.3 实时性人脸检测实验结果及分析31第6章 结束语36参考文献37致 谢38附 录39外文资料原文46外文资料译文5459第1章 引言第1章 引 言1.1选题背景 长期以来,计算机就好像一个盲人,需要被动地接受由键盘、文件输入的信息,并不能主动从这个世界获取并自主处理信息。人们为了让计算机看到这个世界并主动从这个世界寻找信息,发展了机器视觉;为了让计算机自主处理和判断所得到的信息,发展了人工智
7、能科学。人们梦想,终有一天,人机之间的交流可以像人与人之间的交流一样畅通和友好。 迄今为止,机器视觉的发展已经历了一个漫长的过程。经过研究者们的不懈努力,新的信息技术和媒体手段的出现,使得更加有效和友好的人机交互方式得到了发展,新型的人机交互将不再依赖传统的输入设备。而且,计算性价比的提高和视频获取成本的降低,使得计算机视觉系统能够向桌面级和嵌入式系统发展, 这意味着计算机视觉系统能够安装在一切电子系统之中。 相信在不久的将来,拥有高级视觉系统的智能电子产品会给我们的生活带来更大的方便。 计算机视觉要处理的一个重要内容,就是对人脸的视觉处理。人脸分析的相关研究希望用户的身份、状态和意图的信息能
8、够从图像中提取出来,然后由计算依此做出反应(比如通过观察用户脸部表情来分析心情并进行相应反应) 。由于人脸和脸部表情已经被心理学家、神经科学家和工程师们研究了多年,所以人脸和脸部表情识别的研究得到了更多的关注。 人脸分析主要包括人脸检测(face detection)和人脸识别(face recognition)第1章 引言两部分。 最初人脸分析主要集中在人脸识别领域。 与指纹、 视网膜、虹膜、基因、掌纹等其它人体生物特征识别系统相比,人脸识别更加直接、友好,其使用者无心理障碍。人脸识别技术应用背景十分广泛,可用于公安系统刑侦破案的罪犯身份识别、身份证及驾驶执照等证件验证、银行及海关的监控、自
9、动门视频会议、机器人的智能化研究以及医学等方面。 早期的人脸识别算法都是在假设已经得到了一个正面人脸或者假设人脸很容易获得的前提下进行的, 但是随着人脸分析应用范围的不断扩大和开发实际系统需求的不断提高,这种假设下的研究不再能满足需求。人脸检测开始作为独立的研究内容发展起来了。 人脸检测是人脸分析的第一步,指对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果含有则返回人脸的位置、大小和姿态。本篇论文关注的是进行实时性的人脸检测。1.2国内外发展现状人脸识别的研究历史比较悠久,Galton早在1888年和1910年就分别在Nature杂志发表了两篇关于利用人脸进行身份
10、识别的文章,对人类自身的人脸识别能力进行了分析,但当时还不可能涉及到人脸的自动识别问题。最早的关于人脸识别问题的研究论文见于1964年Bertillon在Panoramic Research Inc.发表的技术报告,和1965年Chan在Panoramic Research Inc.发表的技术报告,到现在已有四十余年的历史。近年来,人脸识别研究得到了诸多研究人员的青睐,涌现出了诸多技术方法。尤其是1990年以来,人脸识别更得到了长足的发展,每年都有大量的学术论文发表。现在,几乎所有知名的理工科大学和IT产业的主要公司都有研究组在从事人脸识别的研究。人脸识别的研究大致可分为四个阶段1。第一个阶段
11、以Bertillon,Allen和Parke为代表,主要研究人脸识别所需要的面部特征。该阶段是人脸识别研究的初级阶段,非常重要的成果不是很多,也基本没有获得实际应用。第二个阶段是人机交互识别阶段。该阶段代表性工作是Goldstion,Harmon和Lesk等用几何特征参数来表示人脸正面图像。他们用21维特征矢量表示人脸面部特征,并设计了基于这一特征表示的识别系统。在这个阶段,Kanade博士于1973年在京都大学完成了第一篇人脸识别方面的博士论文。该阶段的方法仍摆脱不了操作员的干涉。第三个阶段是真正的机器自动识别阶段。这一阶段时间相对短暂,但却是人脸识别研究的高潮期,不但诞生了主成分分析、线性
12、判别分析、弹性图匹配、局部特征分析、独立分量分析、支持向量机、神经网络、隐马尔可夫模型、柔性模型 (FlexibleModels)(包括主动形状模型(ASMs)和主动表观模型(AAMs)等若干代表性的人脸识别算法,美国军方还组织了著名的FERET人脸识别算法测试,并出现了若干商业化运作的人脸识别系统,最为著名的是Visionics(现为Idenfx)的Facelt系统。这一阶段的人脸识别技术发展非常迅速,所提出的算法在较理想图像采集条件、用户配合、中小规模正面人脸数据库上达到了非常好的性能。从技术方案上看,2D人脸图像线性子空间判别分析、统计表观模型、统计模式识别方法是这一阶段的主流技术。第四
13、个阶段是鲁棒的人脸识别技术的研究阶段。近几年来,研究人员针对影响人脸识别的一些主要因素,例如光照、姿态、表情、年龄、遮挡、低分辨率等变化因素,提出了很多解决方法。如对于光照变化的处理方法主要有熵图像法、光照锥法、球谐波函数法、九点光源法等。对于姿态变化的处理方法主要有多视角法、局部到整体几何特征变换匹配法、通用3D模型法、3D形变模型法、光流场法7等。目前在实际中应用的人脸检测方法多为基于Adaboost学习算法的方法,这种检测方法最初由剑桥大学的两位大牛Paul Viola和Michael JonesViolaJones01提出,并由另一位大牛英特尔公司的Rainer LienhartLie
14、nhart02对这一方法进行了改善。总体而言,目前非理想成像条件下(尤其是光照和姿态)、用户不配合、大规模人脸数据库上的人脸识别问题逐渐成为研究的热点。解决这类问题的方法的特点是通过描述和补偿变化因素,从而提高算法的性能。非线性建模方法、基于Boosting的学习技术、基于3D模型的人脸建模与识别方法等逐渐成为备受重视的技术发展趋势。目前,国外对人脸识别问题的研究很多,比较著名的有CMU( 卡耐基 梅隆大学)、MIT( 麻省理工学院)、YALE( 耶鲁大学) 等机构;国内的清华大学、中国科学院自动化研究所、上海交通大学、南京理工大学、哈尔滨工业大学等单位都有人员从事人脸识别相关工作的研究。关于
15、人脸识别研究的重要国际会议有IEEE 的FG(IEEE International Conference Automatic Face and Gesture Recognition)、ICIP(International Conference on Image Processing)、CVPR(Conference on Computer Vision and Pattern Recognition ) 等。1.3人脸检测方法1.3.1特征不变量方法这个方法的目标是寻找那些即使当姿势、 视角和光线条件变化时仍然存在的结构特征,并利用这些特征来定位人脸。由于人类能够毫不费劲地“看到”在不同光线
16、和姿态下的人脸和物体,因此研究人员认为有一个潜在的假设:存在一些关于人脸的不依赖于外在条件的属性或者特征。 有许多方法就是按照这个潜在假设,首先去寻找这种脸部特征(通过大量样本学习的方法) ,然后用寻找到的特征去检测人脸。这种基于特征的方法是自下而上的。 人的肤色被证明是人脸检测的一个有效特征。人脸肤色聚集在颜色空间中一个较小的区域,因此可利用肤色特征能够有效地检测出图像中的人脸。利用肤色特征检测出的人脸区域可能不够准确, 但如果在整个系统实现中作为人脸检测的粗定位环节,它具有直观、实现简单、快速等特点,可以为后面进一步进行精确定位创造良好的条件,以达到最优的系统性能。 本论文的AdaBoos
17、t方法就是基于人脸特征的方法。在后面的章节里面,可以通过AdaBoost来看到基于特征方法的主要处理过程。1.3.2基于知识的方法这个方法2将人类有关典型的脸的知识编码成一些规则。通常这些规则包括了脸部特征之间关系的知识。这个方法主要用于人脸的定位。一些关于人脸的知识,可以归纳成下面几个简单的规则: (1)轮廓规则 人脸的轮廓可近似地被看成一个椭圆,则人脸检测可以通过检测椭圆来完成。对任意一幅图像,首先进行边缘检测,并对细化后的边缘提取曲线特征,然后计算各曲线组合成人脸的评估函数来检测人脸。 (2)器官分布规则 虽然人脸因人而异, 但都遵循一些普遍适用的规则, 即五官分布的几何规则。检测图像中
18、是否有人脸,即是否存在满足这些规则的图像块。这种方法一般是先对人脸的器官或器官的组合建立模板,然后检测图像中几个器官可能分布的位置,对这些位置点分别组合,用器官分布的知识规则进行筛选,从而找到可能存在的人脸。(3)对称性规则人脸具有一定的轴对称性,各器官也具有一定的对称性。(4)运动规则若输入图像为动态图像序列,则可以利用与人脸或人脸的器官相对于背景的运动来检测人脸,比如利用眨眼或说话等动作的探测来实现人脸与背景的分离。基于知识的方法是一种自上而下的方式。 它其中一个困难是如何将人类知识转化成为有效的规则:如果规则制定得太细,那么可能有许多人脸无法通过规则的验证;如果规则制定得太宽泛,那么可能
19、许多非人脸会被误判为人脸。1.4研究方法 本文所采用的人脸检测方法为基于AdaBoost算法的人脸检测算法,主要方式是通过训练一个级联分类器以及调用OpenCv函数库来实现人脸检测。 在实现人脸检测的过程中,对图片进行预处理也是一个比较重要的环节。在图像预处理环节,本文采用直方图均衡化、中值滤波的处理方法,能够大大加快人脸检测的速度。最后,在实现实时性的时候,通过调用CvCapture- FromCAM函数从视频当中获取图片,实现本系统的实时性。第2章 AdaBoost算法第2章 AdaBoost算法2.1 AdaBoost算法简介给定一个特征集合和一个包含正样本和负样本图像的训练集,任何机器
20、学习的方法都可以用于通过学习来训练分类函数。我们回想一下,每个图像的子窗口有45,396个矩形特征,这个数字远远超过了像素的个数。即使每个特征能够很快的计算出来,计算这么多的矩形特征也是不可能的。实验已经证实了我们假设,也就是很小一部分的这种特征可以结合起来组成一个有效的分类器。主要的问题就是如何找出这些特征。 采用AdaBoost方法3,用于选择特征和训练分类器。AdaBoost学习方法是用来达到简单学习算法的分类效果的。它通过结合一组弱分类函数来组成一个强大的分类器。这种简单学习算法被称为弱学习机。我们称其为学习机是因为,这个分类器的学习算法会对一个分类器集做一个搜索,运用选择算法来找出那
21、些分类错误最小的分类器,这是一个学习的过程。而这种学习机被称为弱学习机是因为我们不指望那些被找出来的分类器,哪怕是最好的分类函数,能非常好的区分训练数据。为了让弱学习机能构架起来,它被用于解决一个多重的,循环的学习问题。在第一轮的学习结束以后,训练集范例将被重新赋权值,目的是为了强调那些被前一个弱分类器错误分类的范例。而最终的强分类器由许多带权值的弱分类器组成,并且其本身还有个阈值。 AdaBoost算法是一种用来分类的方法,它的基本原理就是“三个臭皮匠,顶个诸葛亮”。它把一些比较弱的分类方法合在一起,组合出新的很强的分类方法。例如图2-1中,需要用一些线段把红色的球与深蓝色的球分开,然而如果
22、仅仅画一条线的话,是分不开的。图2-1 AdaBoost算法示意图1图2-2 AdaBoost算法示意图2使用AdaBoost算法来进行划分的话,先画出一条错误率最小的线段如图2-2(a),但是左下脚的深蓝色球被错误划分到红色区域,因此加重被错误划分球的权重,再下一次划分时,将更加考虑那些权重大的球,如图2-2(c)所示,最终得到了一个准确的划分,如图2-3所示。图2-3 AdaBoost算法示意图32.2矩形特征在给定有限的数据情况下,基于特征的检测能够编码特定区域的状态,而且基于特征的系统比基于象素的系统要快得多。矩形特征4对一些简单的图形结构,比如边缘、线段,比较敏感,但是其只能描述特定
23、走向(水平、垂直、对角)的结构,因此比较粗略。如图2-4,脸部一些特征能够由矩形特征简单地描绘,例如,通常,眼睛要比脸颊颜色更深;鼻梁两侧要比鼻梁颜色要深;嘴巴要比周围颜色更深。图2-4 矩形特征在人脸上的特征匹配。上行是2020子窗口内选出的矩形特征,下行是子窗口检测到的与矩形特征的匹配。我们将使用简单矩形组合作为我们的特征模板。这类特征模板都是由两个或多个全等的矩形相邻组合而成,特征模板内有白色和黑色两种矩形(定义左上角的为白色,然后依次交错),并将此特征模版的特征值定义为白色矩形像素和减去黑色矩形像素和。最简单的5个特征模板如图2-5图2-5 特征模版特征模板可以在子窗口内以“任意”尺寸
24、“任意”放置,每一种形态称为一个特征。找出子窗口所有特征,是进行弱分类训练的基础。假设一个矩形区域大小为24x24,那么,如果穷举区域内所有可能的矩形个数,总数将有45396个。显然这比这个区域内所有的像素个数(576个象素)要多得多。我们不可能把所有的这些特征都用于检测,否则我们的计算消耗将是不可估计的大了。我们的目的即是尽可能少的选取最能区分人脸和非人脸的图像的那些特征,从而大大降低计算开销。现在已经有了简单的特征,我们还需要一些简单的分类器。为了能使得这些分类器足够的简单,我们就把分类器和这些矩形特征做个一一对应。亦即每个分类器就由一个特征的值来决定。于是我们得到如下的简单分类器原型:
25、(2-1)其中就是基于简单特征的分类器,就是待检测子窗口,就是对于子窗口的矩形特征值计算函数,就是一个符号因子(对于不同的特征,计算得到的特征值中有可能负例的值小于正例,也有可能负例的值大于正例,因此正例不都是小于区分正负例的阈值的,也有可能大于,所以引入一个符号因子来确定不等式方向),就是对应分类器的阈值。2.3积分图针对已经引入的矩形特征,为了进一步降低所需要的计算成本我们引入了积分图的概念。这是一种对原图像的中间表达方式,这种表达方式可以使得矩形特征的值能非常快地得到计算。 所谓的积分图像5其实就是对原图的一次双重积分(先是按行积分,然后是按列积分)。那么它的积分表示即为: (2-2)其
26、中,是原图像,是积分图像。又因为我们计算的是原图中某一点左上方所有象素值的和,可见是一个离散的加和,因此在点x,y的积分图像的计算方法就如下所示: (2-3)其中是计算后的积分图像,是原图像,如图2-6所示。图2-6在(x,y)点的积分图像的值是所有在这个点的左上方的点的和图2-7 通过四点计算D处的值如图2-7所示,在矩形D中的像素和可以通过四点计算得到。在点1的积分图像的和可以通过矩形A内的点的和得到。在点2的值就是A+B,在点3的值就是A+C,在点4的值就是A+B+C+D。在D内的点的和可如下计算得到:4+1-(2+3)。如果使用以下函数: (2-4)(2-5)其中是每列的和,积分图像可
27、以在对原图的一次遍历后计算得到。 如图2-8所示,如果使用积分图像,那么任何矩形中的象素和都能通过四个顶点的值计算出来。显然,双矩形特征的值可以通过八个顶点计算得到。然而,双矩形特征包括了两个相邻的矩形和,因此它们可以用六个顶点的值计算得到。如果是三矩形就是八个点,四矩形就是九个点。图2-8 四种不同矩形特征计算示所需要的顶点的值那么四个特征点的值分别为:(1).特征A的值为:(6-5-3+2)-(5-2-4+1);(2).特征B的值为:(4-3-2+1)-(6-4-5+3);(3).特征C的值为:(7-6-3+2)-(6-5-2+1)-(8-7-4+3);(4).特征D的值为:(6-5-3+
28、2)+(8-7-5+4)-(5-4-2+1)-(9-8-6+5)2.4级联分类器人脸检测是典型的稀有事件检测的例子。通常,一张被检测图像中的人脸数远小于100个,二检测窗口总数则在百万数量级上。若能快速排除大部分非人脸窗口,则检测器的速度将会非常快。实际上,确定窗口为非人脸窗口有难易之分,因此本文对窗口判别使用了分层排除(非人脸)的方法。先用最简单的分类器,排除部分容易排除的非人脸窗口,剩下的窗口到下一层分类器再排除一部分,最终通过所有层未被排除的窗口被判定为人脸窗口。我们把能进行分层排除的分类器成为“级联分类器 14,级联分类器由若干个“层分类器”组成。级联分类器与层分类器的关系不同于强分类
29、器与弱分类器的关系。强分类器的分类结果是由弱分类器投票决定的,根据票数的多少确定窗口是否为正例;而级联分类器只有在所有的层分类器全票通过时,才将窗口判别为正例,任意一个层分类器投反对票,则级联分类器就将窗口判别为负例。令每个层分类器的误警率为f(即每层排除的非人脸窗口比例为1-f),检测率为h,则一个N层的级联分类器的误警率15,检测率如有一个20层的级联分类器,它的所有层分类器的检测率都为0.998、误警率都为0.5,计算一下它的检测率约为0.96,误警率约为。因此当级联的分类器层数越多时,分类器的检测率越高,趋向于无穷大时,检测成功率为100%。2.5AdaBoost算法描述 AdaBoo
30、st 训练强分类器6的算法描述如下:(1).给定一系列训练样本其中表示其为负样本(非人脸),表示为正样本(人脸)。 为一共的训练样本数量。 本(非人脸) ,(2).初始化权重;(3).对a. 归一化权重: (2-6)b. 对每个特征 f,训练一个弱分类器计算对应所有特征的弱分类器的加权错误率: (2-7)c.选取最佳的弱分类器拥有最小错误率:(2-8)(2-9)d.按照这个最佳弱分类器,调整权重:(2-10)其中表示被正确的分类,表示被错误的分类;(2-11) (4)最后的强分类器为:(2-12)其中第3章AdaBoost算法训练过程第3章 AdaBoost算法训练过程3.1AdaBoost算
31、法训练过程Paul Viola和Michael Jones7于2001年将AdaBoost算法应用于人脸检测中,其基本思想是针对不同的训练集训练同一个分类器(弱分类器),然后把这些不同训练集上的得到的分类器联合起来,构成一个最终的强分类器。AdaBoost 算法中不同的训练集是通过调整每个样本对应的权重来实现的。开始时,每个样本对应的权重是相同的,对于h1分类错误的样本,加大其对应的权重; 而对于分类正确的样本,降低其权重,这样分错的样本就被突出出来,从而得到一个新的样本分布U2。在新的样本分布下,再次对弱分类器进行训练,得到弱分类器h2。依次类推,经过T次循环,得到T个弱分类器,把这T个弱分
32、类器按一定的权重叠加(boost)起来,得到最终想要的强分类。训练系统总体框架,由“ 训练部分”和 “补充部分”构成。依据系统框架,本文的训练系统可分为以下几个模块: (1)以样本集为输入,在给定的矩形特征原型下,计算并获得矩形特征集; (2)以特征集8为输入,根据给定的弱学习算法,确定闽值,将特征与弱分类器一一对应,获得弱分类器集; (3)以弱分类器集为输入,在训练检出率和误判率限制下,使用AdaBoost算法挑选最优的弱分类器构成强分类器; (4)以强分类器集为输入,将其组合为级联分类器; (5)以非人脸图片集为输入,组合强分类器为临时的级联分类器,筛选并补充非人脸样本。图3-1训练系统框
33、架训练样本的选择: 训练样本要求是面部特写图像,图3-3是一簇训练样本,大小被归一化为2020像素,其中正训练样本要求是面部特写图像,但是人脸形态千差万别,所以训练样本选取过程中要考虑到样本的多样性。负训练样本,大小被归一化为2020像素,其中各样本不完全相同,分别具有一定的代表性。图3-2 部分训练正样本集和训练负样本集训练过程分为3个步骤:首先需要提取Haar特征;然后将Haar特征转化成对应的弱分类器;最后从大量的弱分类器中迭代选择出最优弱分类器。 (1)提取Haar特征9 图3-3常用的四种Haar特征常用的Haar特征有4种,如图3-4所示。当然也可以在这4种特征的基础上设计出更多、
34、更复杂的特征。以大小为20x20像素的训练样本为例,上述4种特征的总个数超过了160000个。这样庞大的数字给后续的迭代训练工作带来了庞大的计算量,直接导致AdaBoost算法训练过程极为费时,这恰恰是算法需要改进的关键问题之一。(2)生成弱分类器 每一个Haar特征都对应着一个弱分类器,每一个弱分类器都是根据它所对应的Haar特征的参数来定义的。利用上述Haar特征的位置信息,对训练样本进行统计就可以得到对应的特征参数。AdaBoost算法中所训练的弱分类器是任何分类器,包括决策树,神经网络,隐马尔科夫模型10,如果弱分类器是线性神经网络,那么AdaBoost算法每次将构造多层感知器的一个节
35、点。(3)采用AdaBoost算法选取优化的弱分类器 AdaBoost算法训练过程就是挑选最优弱分类器,并赋予权重过程,图3-5是AdaBoost算法训练示意图。图3-4 AdaBoost算法示意图3.2弱分类器训练一个弱分类器(特征)就是在当前权重分布的情况下,确定 的最优阈值,使得这个弱分类器(特征)对所有训练样本的分类误差最低。 选取一个最佳弱分类器就是选择那个对所有训练样本的分类误差在所有弱分类器中最低的那个弱分类器(特征)。 对于每个特征11,计算所有训练样本的特征值,并将其排序。通过扫描一遍排好序的特征值,可以为这个特征确定一个最优的阈值,从而训练成一个弱分类器(参考图3-1) 。
36、具体来说,对排好序的表中的每个元素9,计算下面四个值: (1) 全部人脸样本的权重的和 ; (2) 全部非人脸样本的权重的和 ; (3) 在此元素之前的人脸样本的权重的和; (4) 在此元素之前的非人脸样本的权重的和;这样,当选取当前元素的特征值 和它前面的一个特征值之间的数作为阈值时, 所得到的弱分类器就在当前元素处把样本分开也就是说这个阈值对应的弱分类器将当前元素前的所有元素分类为人脸(或非人脸) ,而把当前元素后(含)的所有元素分类为非人脸(或人脸) 。 可以认为这个阈值所带来的分类误差为(3-1)于是, 通过把这个排序的表扫描从头到尾扫描一遍就可以为弱分类器选择使分类误差最小的阈值12
37、(最优阈值),也就是选取了一个最佳弱分类器(如图3-5)。图3-5训练并选取最佳分类器算法3.3强分类器经过次迭代后,获得了个最佳弱分类器,可以按照下面的方式组合成一个强分类器: (3-2)其中: (3-3)那么,这个强分类器对待一幅待检测图像时,相当于让所有弱分类器投票,再对投票结果按照弱分类器的错误率12加权求和, 将投票加权求和的结果与平均投票结果比较得出最终的结果。 平均投票结果,即假设所有的弱分类器投“赞同”票和“反对”票的概率都相同下,求出的概率平均: (3-4)实验结果表明,当 T=200 时,构成的强分类器可以获得很好的检测效果。当T趋近于无穷大时,检测的正确率趋近于100%。
38、3.4分类器训练分类器的训练流程:1、正样本的创建2、负样本的创建3、训练分类器。训练样本采用MIT人脸库,人脸均为剪裁人脸不需进一步处理,共有人脸样本(正样本)3756个、非人脸样本(负样本)8023个。 训练过程: (1)正样本13:典型的正样本描述文件如下: posdata/1(10).bmp 1 1 1 20 20posdata/1(11).bmp 1 1 1 20 20posdata/1(12).bmp 1 1 1 20 20 描述文件的数字分别代表:正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小 。在Dos下输入“D:ProgramFilesOp
39、enCVbincreatesamples.exe” -info “posdataposdata.dat” -vec datapos.vec -num 200 -w 20 -h 20。 运行完了会d:facedata下生成一个*.vec的文件。该文件包含正样本数目,宽高以及所有样本图像数据,结果如图3-6。图 3-6 正样本训练(2) 负样本:采用Dos命令生成负样本描述文件。 Cd到 D:facenegdata进入图片路径,再次输入dir /b negdata.dat,则会图片路径下生成一个negdata.dat文件,打开该文件将最后一行的negdata.dat删除,这样就生成了负样本描述文件
40、。 图3-7 负样本训练(3)在Dos下输入(载入负样本与正样本文件) D:Program FilesOpenCVbinhaartraining.exe -data datacascade -vec datapos.vec -bg negdatanegdata.dat -npos 200 -nneg 200 -mem 200 -mode ALL -w 20 -h 20 图3-8 分类器训练通过超过17次(本文20次)训练最后得到一个xml分类器文件。3.5人脸检测过程(1)放大检测窗口传统检测流程主要策略按比例逐层缩小待检测图像,形成“图像金字塔”;在“金字塔”中穷举待检测子窗口;把各个待检测
41、子窗口作为分类器的输入,得到检测结果。这种方法的特点是检测窗口大小固定,图像不断被缩小。缺点在于如果待检测图像较大,缩小图像的变换需要占用大量时间,减慢检测速度。在这里采用的方法是:待检测图像大小不变,逐层等比放大检测窗口,再用各层窗口遍历整张待检测图像。这样就能提高检测速度。同训练过程一样,使用分级分类器对输入图像进行人脸检测时,首先要对图像进行辅助图像的计算,这样,就可以利用这些辅助图像的特性,对各个窗口进行快速的特征值计算。然后利用分级分类器对输入图像进行多种规模的、各个位置的窗口进行检测。为了检测不同大小的人脸,选择待检测图像大小不变,逐层等比放大检测窗口,再用各层窗口遍历待检测图像。
42、所谓放大检测窗口只是修改检测窗口的长和宽的值(初始值 20x20,放大时都乘以等比系数),以检测不同大小的子图像。放大检测窗口时要考虑到两方面的因素:既不能是相邻大小的窗口放大的倍数过大,因为这样会漏检两个窗口中间大小的人脸;同时又要考虑到,如果相邻窗口的大小相隔太小,检测过程会有很多多余的计算,检测速度会减慢。这一做法的依据是放大检测窗口,原分级分类器可以继续使用,分类器的阈值不受影响。采用放大检测窗口的策略提高了检测速度,当图像较大时,这一优点将更为突出。(2)区域合并14采用了逐层等比放大检测窗口后,通常同一人脸会在不同的尺度和邻近的位置上被检测到很多次,所以最后还需要一个合并过程将所检
43、测出来的矩形合并以得到唯一的人脸图像位置和人脸图像尺度。合并相当于是对原始检测框的一个平均,可以消除噪声使得检测结果更加精确;合并还有消除误检的作用,比如根据我们的经验如果检测到孤框,这个框是人脸的可能性非常小,可以被删除掉。区域合并共分两步:某一尺度下检测到的人脸图像区域的合并和不同尺度下检测到的人脸图像区域的合并。这两个步骤的区域合并方法都采用求平均的方法,即将所有检测到的人脸图像区域的坐标位置的平均值作为最后合并得到的人脸图像的坐标位置,所有检测到的人脸图像区域的尺度的平均值作为最后合并得到的人脸图像的尺度。某一尺度下检测到的人脸图像区域的合并是指,当在某一尺度下进行人脸图像扫描检测时,
44、在某一位置附近可能会检测到多个人脸图像,因此,就必须将这些人脸图像进行合并。因为同一尺度下的检测结果对应的窗口大小相同,只需要进行位置的合并。定义邻域半径 R 和阈值 T。若对于某个窗口中心位置在其半径为 R 的邻域内人脸窗口中心的个数为 M,当时,认为该窗口对应的是错检的人脸;否则,若则认为在的R 邻域中检测到了一个人脸,对该位置的所有人脸用求平均的方法进行合并得到一个人脸。不同尺度下检测到的人脸图像区域的合并是指,将各个尺度下人脸的大小和位置恢复到原始尺度的图像,若两个人脸的重叠面积大于某一设定的阈值,则认为这两个人脸代表同一人脸,对它们进行合并,并将它们位置和大小的平均值作为合并后得到的
45、人脸位置和大小;如果两个人脸的重叠面积小于某一设定的阈值,就认为它们代表了两个不同的人脸区域。人脸检测程序主要完成4部分功能如图3-7,即加载分类器、分类排错、合并收敛以及确定人脸区域。本程序使用OpenCV中提供“haarcascade_Frontalface_alt.xml”文件存储的目标检测分类,用cvLoad函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的圆形区域,并将这些区域作为一序列的圆形框返回。分类器在使用后需要被显式释放,所用的函数为
46、cvReleaseHaarClassifierCascade。图3-7 人脸检测流程图主要程序如图3-8:图3-8 部分人脸检测程序经多次调试程序运行无误,如图3-9:图3-93.6实验结果分析检测结果如下:图3-10 实验结果一图3-10 实验结果二图3-10 实验结果三通过实验可以看出用 AdaBoost 的检测方法检测比较准确,具有多尺度分析能力,可以检测到一幅图像中不同大小的多个人脸。对于一幅 308*410 大小的图像,检测时间大约为 110ms 左右,显示出该方法有较高的检测速度。但 AdaBoost 的检测方法是基于人脸特征的,目前仅局限于正面人脸检测。另外也存在误检的情况,误检主要是指背景中类似人脸特征的物体,被误认做人脸,可以采用肤色验证的方法加以消除。第4章 图像预处理第4章 图像预处理预处理(前处理)是人脸识别过程中的一个重要环节。那么什么是预处理呢?让我们来认识一下:预处理就是在图像分析中,对输入图像进行特征抽取、分割和匹配前所进行的处理。输入图像由于图像采集环境的不同,如光照明暗程度以及设备性能的优劣等,往往存在有噪声,对比度不够等缺点。另外,距离远近,焦距大小等又使得人脸在整幅图像中间的大小和位置不确定。为了保证人脸图像中人脸