基于OpenCV的中远距离人脸检测论文1

上传人:无*** 文档编号:66535308 上传时间:2022-03-28 格式:DOC 页数:38 大小:1.63MB
返回 下载 相关 举报
基于OpenCV的中远距离人脸检测论文1_第1页
第1页 / 共38页
基于OpenCV的中远距离人脸检测论文1_第2页
第2页 / 共38页
基于OpenCV的中远距离人脸检测论文1_第3页
第3页 / 共38页
点击查看更多>>
资源描述
杭州电子科技大学信息工程学院本科毕业设计信息工程学院本科毕业论文(2012届)题 目基于OpenCV的中远距离人脸检测系计算机专 业计算机科学与技术班 级 学 号 学生姓名 指导教师 完成日期 诚 信 承 诺我谨在此承诺:本人所写的毕业论文智能交通系统路况监控软件设计与实现均系本人独立完成,没有抄袭行为,凡涉及其他作者的观点和材料,均作了注释,若有不实,后果由本人承担。 承诺人(签名): 年 月 日摘 要人脸检测技术,是指利用计算机采用一定的算法或者策略,在动态或者复杂的场景、背景中检测出人的脸部的存在,并确定人脸的位置、大小以的技术。作为人脸识别、表情识别、人脸跟踪等技术的基础和前提技术,人脸检测技术在智能控制、模式识别等其他领域也引起了广发的重视。本论文主要介绍的是基于OpenCV的人脸检测应用程序的开发,简单介绍了国内外人脸识别技术研究及应用的发展现状及其重难点分析。在第二章重点分析了AdaBoost算法中集成机器学习的一个重要机制:多个弱分类器集成的方法,机器学习中的弱学习到强学习,集成的关键是投票,最简单的方法是“绝对多数”的方法,详细分析了AdaBoost算法检测速度快、可以检测任意尺度的图像的特点。本人开发的人脸检测和识别软件是基于OpenCV的Haar级联分类器进行人脸识别,通过对OpenCV开源代码的研究学习,掌握了OpenCV提供的重要的图像分析和处理函数以及基础的数据类型、帮助的数据类型,并Visual C+集成开发环境做平台下搭建了基于OpenCV的人脸检测系统。通过对实例空间内大量图像内对目标区域即人脸的识别,证明了利用Harr级联分类器来进行人脸检测和识别的方法是一种速度快、精度高的方法。关键字:人脸检测;AdaBoost;分类器;OpenCVABSTRACTHuman face detection means that for a given image or video,to determine whether it contains face regions,if so,determines the number, the exact location and the size of all the facesHuman face detection is not only a necessary precondition of face recognition,expression recognition technology, face tracking,but also,it plays ail important role in applications like in the intelligent human-computer interaction,video conferencing,intelligent surveillance,video retrieval and so onTherefore,face detection technology attracted widespread attention in pattern recognition,computer vision,human-computer interaction and other fieldsThis paper mainly introduces the number of face detection application program which is based on the OpenCV. This paper describes the national and international recognition technology applications research and development and analysis the difficult situation. In chapter 2 on the analysis of the AdaBoost algorithms integration of machinery to study of an important mechanism : more integrated approach in the classification of the study of study at the learning and integration is the key to the vote, the simplest method is the absolute majority . Also, detailed analysis AdaBoost algorithm test speed, you can detect any scale the image quality.I developed the application program by using the Haar cascade classifier of the OpenCV for face recognition. The so-called Haar cascade classifier is a greater level of classifier which is associated with several simple boost classifiers, the detected targets pass through each classifier, the one who passed through all he classifiers can be judged as the face region. By the experiment of sample photos recognition, it proved that the Harr cascade classifier face-detection method is a kind of high speed and precision method.This papers research is based on the OpenCV source code,in which some basic data type and helping data type were created,and because of the opermess of the code,we build a human face detection system in the Visual C+ environment.Key words: face detection ; AdaBoost ; classifier ; OpenCV目 录1. 概述11.1 引言11.2概念介绍21.3 研究现状31.4 应用领域41.4 评价标准52. Adaboost人脸检测算法62.1 概述62.1.1 Adaboost算法简介62.1.2 Adaboost人脸检测算法62.2弱学习与强学习72.3 PAC基本模型82.3.1 概述82.3.2 基本概念82.3.3 PAC模型的不足92.4 Boosting算法92.5 Adaboost算法性能分析103. OpenCV训练分类器113.1 OpenCV平台概述113.1.1 OpenCV简介113.1.2 OpenCV函数113.1.3 OpenCV特征123.2 目标检测法123.3 样本的创建133.3.1创建负样本(反例样本)143.3.2创建正样本(正例样本)143.4训练分类器163.5 检测目标193.6创建Haar特征并载入样本193.6.1 载入正样本193.6.2 载入负样本203.6.3 计算Haar特征值并生成XML文件214. 核心实验设计234.1程序流程图234.2关键代码234.3为何增加检测视频记录254.3各个分类器处理结果对比255. 结 论28致谢29参考文献30附录:人脸检测源程序31321. 概述1.1 引言人脸检测(Face Detection)最初来源于人脸识别(Face Recognition)。我们想要在进行人类识别之前,必须要对人脸的位置和大小进行精确的定位,即人脸检测。因此一个实时有效的人脸检测系统在人脸识别中有着重要而不可代替的作用。由于人类基因组合的多样性造成了人类脸部相似的概率大大减小,因此人脸检测与识别更具有直接方面而且友好的优势,也更容易被用户所接受。与此同时,通过对人脸表情的分析,还能够获得其他识别系统不可能获得的资料,因此人脸识别也逐渐称为身份验证的最有力的手段之一。在早期的人脸识别技术中,主要针对一些约束性条件较强的图像进行识别,而忽略了人脸检测技术的研究。近年来,随着信号处理理论和计算机的出现及其发展,人们开始用摄像机获取环境图像并将其转换成数字信号,用计算机实现对视觉信息的处理,这就形成了计算机视觉。计算机视觉是当前计算机科学中的一个非常活跃的领域,其基本假设是:可以用计算的方式来模拟人类的视觉机制。人脸的自动识别是一种重要的生物特征识别技术,与其它身份识别方法相比,人脸识别具有直接、方便、友好等特点,因而人脸自动识别问题的研究不仅具有重要的应用价值,而且具有重要的理论意义。人脸识别通过计算机提取人脸的特征,并根据这些特征从而进行身份验证。人脸与指纹等其他生物特征一样是不可改变的,因此人脸所具有的唯一性、不容易被复制的特性,在进行身份验证时起到了决定性的作用。同时,人脸识别技术具有操作简单方便、结果一目了然、方法隐蔽等优点。人脸识别一般包括三个步骤:人脸检测、人脸特征提取和人脸的识别与验证。其处理流程如图1.1所示。图1.1人脸识别的一般步骤1.2概念介绍所谓人脸检测(Face Detection),是指对于给定的一幅图像,利用计算机并采用一定的算法和策略,在图像中进行搜索,并确定其中是否含有人脸、人脸位置、人脸大小及人脸姿态的技术。因此,人脸检测技术是人脸自动识别系统中的一个重要的关键环节。1.3 研究现状人脸检测是一个复杂的极具挑战性的模式检测,其主要的难点有两方面: 一方面,是由于人脸内在的变化所引起:(1)人脸的自身因素。人脸是一个包含五官、毛发等极不规则的复杂待测目标,不同的人脸在形状、大小、颜色、质地等方面都有很大的变化性,某些局部特征具有随机性(如,眼睛等),而且还存在着不同表情的人脸,以及时间间隔产生人脸的变化等,这些都给人脸检测带来难度。(2)人脸的不同视角。人脸可能以不同视角出现在图像中,造成某些用于检测而需提取的人脸的特征不可见,为了实现检测方法的鲁棒性,还需考虑人脸在各种复杂的背景中、不同方向、角度、尺度等情况下所展现出来的不同表象。(3)物体的遮挡。图像中其他物体对人脸的遮挡,如眼镜、头发和头部饰物以及其他外部物体等,对中远距离的人脸检测造成一定影响。另一方面,是由于外在条件变化所引起:(1)成像角度的影响。成像角度的不同能够造成人脸的多姿态,如平面内旋转、深度旋转以及上下旋转,其中深度旋转影响较大。(2)光照的影响。在中远距离条件下的图像场景会比较模糊,由于光照不均匀,图像中的亮度、对比度的发生变化和阴影,摄像头距离观测人群较远等原因,人脸检测定位比较困难。(3)图像的成像条件。如摄像设备的焦距、成像距离,图像获得的途径等等。(4)图像中存在着噪声。检测对象大多是由图像捕捉设备所采集的数字图像或视频中的数字图像序列,所以采集条件特别是关照条件包括光源的方向、明暗、色彩等都会对图像的效果产生很大的影响,进而影响对人脸的检测。正因为在人脸识别的过程中存在上述的各种各样的问题,因此在实际的检测和识别过程中,当这些因素叠加到一起的时候,情况就变得更加复杂。这些困难都为解决人脸问题造成了难度。如果能找到一些相关的算法并使其能在应用过程中达到实时,将为成功构造出具有实际应用价值的人脸检测系统提供保证。目前,国外从事人脸检测的研究机构和院校比较多,取得明显成就的有麻省理工大学和卡内基梅隆大学;而国内从事人脸检测的院校研究生也很多,诸如清华大学、中国技术科学院的自动化所等等。随着人脸检测研究的深入,国际上发表的有关论文数量也在大幅度增长,如IEEE的FG、ICIPCVPR等重要国际会议上每年都有大量关于人脸检测的论文,占有关人脸研究论文的1/3之多。由此可见世界范围的学者对人脸检测技术的重视。总的来说,人脸识别技术就是确定一种人脸的描述方式进行人脸检测与识别。但是无论是先前的几何描述方式还是目前常用的代数描述方式,都存在各自的缺陷。在以后的研究中,我们应逐渐去完善人脸的描述方式,使之更加有效,更加准确。1.4 应用领域近年来,视频人脸检测及其合成技术受到越来越多研究者的关注,这主要由于两方面原因:一方面,计算机计算和存储成本的大幅度下跌使得以视频速率或近似视频速率采集存储图像序列成为可能;另一方面,视频跟踪识别技术的极为广阔的市场应用前景也是推动此研究的主要动力。主要应用在一下五个领域:(1)身份认证与安全防护领域最通俗的例子就是门禁控制。所谓门禁控制,是指为了有效的进行安全管理,对人员进出情况实现权限控制并详细记录的管理手段。随着人脸技术的不断发展,目前基于人脸识别的新型门禁控制系统,将具有访问权限的人员的人脸资料和信息存放到数据库中,通过摄像头拍摄进出画面后,利用人脸检测和识别技术对人脸信息进行检索,当该人员的人脸信息与数据库中信息有相匹配的,则可以进入,否则拒绝进入,并对强行进入者发出报警。(2)媒体与娱乐领域随着网络化时代的到来,人们利用脸部表情的变化和对人脸的抽象,可以进行娱乐。在如今的手机、电脑、相机等电子产品中,基于人脸变化的娱乐手段越来越多。而家庭娱乐指的是能够识别家庭主人身份的智能机器人,而这些媒体与娱乐的电子产品,关键技术之一就是人脸的识别与检测。(3)图像搜索领域目前,Google的图像搜索其实还是文字搜索。基于人脸图像识别技术的搜索引擎将会具有广泛的应用前景。(4)公安侦查领域同前文所述的身份认证一样,当银行发生抢劫案件、小区发生盗窃案件时,可利用摄像头拍摄的图像,进行人脸检测和识别,提取犯罪嫌疑人的人脸资料,帮助公安机关破案。(5)信息安全领域信息安全是指计算机和网络的登录、文件的加密和解密。在信息安全中,人脸的识别也是其中的一个关键技术。1.4 评价标准人脸检测与识别系统性能主要评价标准有:识别率,误检率,检测速度以及鲁棒性。(1识别率:正确检测和识别的人脸数量与图像内真实的人脸数目的比值叫做识别率。识别率越高,说明人脸检测与识别系统的性能越好。(2)误检率:不是人脸而被误检测为人脸的窗口与图像内检测出来的所有的人脸窗口数目的比值叫做误检率。比如图像内被检测为人脸窗口的总数为A,被误检为人脸的非人脸子窗口数为B,则误检率为BA。识别率无法反映人脸检测与识别系统对非人脸的排除能力。因此引入误检率来衡量人脸检测与识别系统对非人脸的排除能力。误检率越低,说明人脸检测与识别检测系统的性能越好。(3)检测时间:由于人脸检测与识别系统最终实现到实际的应用中去,因此检测时间是人脸检测与识别系统中的一个重要的指标。它包括两个阶段:一个是人脸检测与识别的训练时间,一个是识别时间。在识别率率和误检率达到要求的前提下,检测时间越小越好。(4)鲁棒性:即在各种复杂背景的条件下,人脸检测与识别系统的适应能力。2. Adaboost人脸检测算法2.1 概述2.1.1 Adaboost算法简介Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)4。Adaboost算法是基于改变数据分布的一种算法,它根据训练集合中样本分类和总体分类的的正确率,确定每个训练样本的权值,并将新的训练权值的数据集合发送至下层分类器展开训练,然后再将下层分类器的训练结果融合到一起,进行最后的决策。使用Adaboost分类器可以排除一些不必要的训练数据特徵,并将关键放在关键的训练数据上面。Adaboost 算法是于1995 年提出的一种快速人脸检测算法,是人脸检测领域里程碑式的进步,这种算法根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高。Adaboost算法是目前在众多的人脸检测算法中是一种检测速度快、效果好的一种检测方法。通过不断的修正弱分类器的权值,并将这些权值结果融合到一起进行决策形成强分类器。与其他人脸检测算法相比,Adaboost算法中,对每个弱分类器的权值分配完全是自动的,因此其具有方便和易用性。而且大量的实践证明了Adaboost算法的有效性、迅速性和简易性。Adaboost算法进行人脸检测训练的路程图如图2.1所示。图2.1 Adaboost算法训练过程2.1.2 Adaboost人脸检测算法人体检测属于模式识别范畴。模式识别方法是多种多样的,模式识别系统的最终目标,是要在表示空间和解释空间之间找到一种映射关系。这种映射可以是一个分类,也可以是回归,抑或是一种描述方案。在这里,我们用分类来进行叙述。分类方法总得来说可以分为两种:监督学习方法和非监督学习方法。此后,又在前两者的基础上发展出了半监督学习方法,这种方法的本质仍属于监督学习。统计分类是模式识别发展过程中建立起来的比较经典的方法,其表达方式有着坚实的理论基础。它主要基于用概率统计模型得到各类别的特征向量分布,以取得分类的功能。特征向量的取得是基于一个类别已知的训练样本集合。因此,这是一种监督学习的模式识别方法。因此,由概念驱动的分类器,是用已知的类别标签的样本训练分类器来确定分类。而对新的样本进行分类时,分类方法取决于其分布类型。Adaboost算法是统计分类方法中一个经典算法,它由Boosting算法发展而来,是由Freund和Schapire在1995年提出的,该算法解决了以前Boosting算法在实践中存在的各种问题。实验表明,Adaboost算法能够显著提高学习精度。利用Adaboost算法与Haar特征相结合的方法进行人脸检测。Haar特征是一种基于积分图像的特征,主要在灰度图像中使用,该特征计算简单,提取速度较快。Adaboost算法首先提取图像中的Haar特征,再将训练得到的Haar特征转换成弱分类器,最后将得到的弱分类器进行优化组合用于人脸检测。Viola提出的基于AdaBoost算法的快速人脸检测和识别方法,实现了实时的正面人脸检测系统,并提出了积分图像的图像表示法、高效分类器、级联分类器等核心思想。由于该方法能够达到较高的检测率并且具有目前最好的实时性,因此激发了更多研究人员在基于类Haar特征和Boost学习算法的实时人脸检测算法方面的研究。 2.2弱学习与强学习当我们随机猜测一个对或错的问题,会有50%的正确率。如果能够提供一个假设后,稍微有效的提高猜测正确的概率,那么这个假设的算法就是弱学习算法,与其对应的过程称为弱学习;如果一个假设能够显著地提高猜测正确的概率,那么这个假设的算法称作强学习算法,与之对应的过程为强学习。弱学习算法与强学习算法之间并不是鼓励存在的,如基于弱学习算法来进行粗略简单的分类的分类器称为弱分类器,其得到的准确度要求只要达到50%以上即可。单个弱分类器的分类效果虽然很差,但是如果将一系列的弱分类器,按照一定的规则组合起来,就可以形成一个高度准确的强分类器,这也就是级联分类器。实际上每一个Haar特征都可以对应一个弱分类器,每一个弱分类器都是根据它所对应的Haar特征的参数来定义的。如果将所有的Haar特征都用来对应一个弱分类器,那么其总个数将超过数十万个。要想从这样庞大数目的弱分类器中训练出最优弱分类器将是一个非常巨大的工程,其训练时间也将达到数天之长。因此,这是该进Adaboost性能的一个关键点所在。Kearns和Valiant研究证明:弱学习算法和强学习算法之间是存在等价关系的,也是会所弱学习算法能够转化为强学习算法,前提是要有足够的数据和证明条件。2.3 PAC基本模型2.3.1 概述PAC(Probably Approximately Correct)模型是计算学习理论中常用的模型,是由Valiant于1984年首先提出来的,由统计模式识别、决策理沦提出了一些简单的概念并结合了计算复杂理论的方法而提出的学习模型。它是研究学习及泛化问题的一个概率框架,不仅可用于神经网络分类问题,而且可广泛用于人工智能中的学习问题。2.3.2 基本概念本文首先介绍一些基本概念:1、实例空间。实例空间指的是学习器中能见到的所有实例的集合。一般用表示大小为n的的实例集,每个为一个实例,其中X表示实例空间。2、概念空间。指目标慨念可以从中选取的所有概念的集合,学习器的目标就是要产生目标概念的一个假设,使其能准确地分类每个实例,对每个n1,定义每个为上的一系列概念,为X上的概念空间,也称为概念类。3、假设空间。假设空间至的是算法所能输出的听有假设的集合,用表示。对每个目标概念和实例,为实例上的分类值,即当且仅当的任一似设h指的是规则,即对给出的,算法在多项式时间内为输出一预测值。4、样本复杂度(sample complexity)指学习器收敛到成功假设时至少所需的训练样本数。计算复杂度(computational complexity)指学习器收敛到成功假设时所需的计算量。出错界限指在成功收敛到一个假设前,学习器对训练样本的错误分类的次数。在某一特定的假设空间中,对于给定的样本,若能找到一似设h,使得对该概念类的任何概念都一致,且该算法的样本复杂度仍为多项式,则该算法为一致算法。实例空间为,概念空间和假设空间均为的子集,对任意给定的准确度及任意给定的置信度,实例空间上的所有分布及目标空间中的所有目标函数,若学习器只需多项式个样本及在多项式时间内,最终将以至少的概率输出一假设,使得随机样本被错分类的概率,则称学习器L足PAC学习的。它是考虑样本复杂度及计算复杂度的一个基本框架,成功的学习被定义为形式化的概率理沦,其模型如图2.2所示。图2.2 设定项目的类型、名称、存储路径由图2.2我们可以看出, PAC模型与分布基本是无关的。因为对学习器来说,实例集合中的分布是未知的。定义中并没有要求学习器一定要输出的错误率为零,仅仅是要求错误率被限定在某个常数范围内即可,而且也没有要求学习器对每个随机样例序列都成立,仅仅要求不成功的概率在一定范围内即可。这样将学习到一个可能近似正确的假设。2.3.3 PAC模型的不足在实际的机器学习中,PAC模型的不足主要有以下几个方面:首先PAC模型中,它是用最坏的情况模型来测量算法中每个目标概念以及样例空间的分布,也是用最坏情况下,随机样例序列作为样本复杂度的定义。也就是会所,PAC模型往往用最不理想的样例空间来计算和定义目标概念,这导致PAC模型在实际中的应用可能性大大降低,因为他在实际中是不可能实现的。即使存在一个很简单的一致算法,由于采用最不理想条件而计算出来的样本复杂度,PAC模型仍会过高的估计假设的出错率,而使得PAC模型无法预测学习曲线(1earning curve)。2.4 Boosting算法针对Kearns和Valiant提出弱学习算法与强学习算法之间能不能互相转化的问题, SchaPire在1990年首次给出了肯定回答。他认为一个弱学习算法可以通过加强得到一个任意正确率的强学习算法,并通过构造的一种多项式级的算法实现了这一加强过程,这就是最初的Boosting算法。1991年Freund提出了另外一种效率更高的Boosting算法,1995年,Freund和Schapire提出的Adaboost,是对Boosting 算法的一大提高。但是这两种算法都要求事先知道弱学习算法学习正确率的前提条件,因而很难应用到实践中去。2.5 Adaboost算法性能分析强分类器H(x)对整个训练样本集进行检测时,判断错误的概率称为训练误判率,记为,则有:上式中Freund和Schapire推出关于Adaboost算法的训练误判率重要理论。定理:假设运行Adaboost算法经过T轮训练后生成的弱分类器分别 ,其对样本集误判率分别,则训练误判率有上界:8。在定理中,如果每个,令,则最终强分类器H(x)的训练误判率上界可改写为:由此可见,Adaboost算法的训练误判率随训练轮数T的增大呈指数级的减小。因此,基于Adaboost算法时随着弱分类器数量增多和弱分类器误判率的降低,强分类器的误判率也会迅速下降。当弱分类器足够多时,基于Adaboost算法就可以使强分类器达到任意低的误判率。3. OpenCV训练分类器3.1 OpenCV平台概述3.1.1 OpenCV简介 OpenCV(全称为Open Source Computer Vision Library)是Intel公司支持的开源计算机视觉库。它具有轻量级而且高效的特点由一系列 C函数和少量 C+ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。1999年在俄罗斯设立的软件开发中心“Software Development Center”开发OpenCV计算机视觉库。OpenCV采用C/C+语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV采用优化的C代码编写实现的,因此充分利用了多核处理器的优势,在实时的应用当中往往执行速度快。另外,对于采用基于OpenCV的消费者来说,还可以通过购买Intel的多媒体函数库IPP(Integrated Performance Primitives)来在Intel平台上得到更快的系统处理速度。由于IPP函数库中包含了许多用C语言代码编写的底层的优化的函数,并且几乎覆盖到所有的应用领域,因此它能够大大提高系统的处理速度。由于一般都含有底层驱动,若系统中已经安装IPP函数库,OpenCV在运行的时候会自动调用相应的IPP库。作为一个用户终端系统,OpenCV在开发的过程中更加强调了交互性,简单、友好及易操作的界面和框架,帮助开发人员更加方面的设计和开发相关的应用程序。OpenCV中包含有500多个封装函数,覆盖了计算机视觉技术中的大部分领域,如医学成像、信息安全、立体视觉、产品检测以及机器人等。正因为计算机视觉与机器学习的密切相关性,OpenCV还提供了机器学习库MLL(Machine Learning Library),MLL采用基于统计方面的聚类和模式识别学习,不仅可以方便的用于计算机视觉技术相关的任务中,还可以应用与其他机器学习场景。3.1.2 OpenCV函数OpenCV由于广泛应用于计算机视觉而适应于机器学习。其主要包含的机器学习库有Boosting、K-最近邻算法、决策树、朴素贝叶斯分类器、期望最大化算法、人工神经网络、支持向量机、随即森林等。此外,OpenCV还封装了大量的基础类型的数据,并自定义了一些专门用于计算机视觉技术的帮助数据类型。具体列举如下:基础数据类型主要包括:1、 类IpIImage 用于表示图像2、 类CvMat 用于表示矩阵3、 类CvSeq、CvSet、CvGraph为可变集合类4、 混合类CvHistogram 用于表示多维柱状图帮助数据类型主要包括:1、 类CvPoint 用于表示二维点坐标2、 类CvSize 用于表示图像宽和高3、 类CvMoments 用于表示空间力矩4、 类IpIConvKernel 用于表示图像转换内核由上述可知,OpenCV的函数命名一般都是以cv开始的,然后是该函数的行为或者作用目标。OpenCV中所有的函数都是由于其在实际应用中所实现的功能而分属不同类型,主要的函数类型有: (1)图像的一些基本操作函数,如图形处理函数、图形分析函数。这类函数主要实现图像的一些基本分析操作等。(2)图形运动分析与目标跟踪函数。这类函数主要用于运动分析与目标跟踪的函数,例如函数cvKalman 则实现图像的卡尔曼滤波。(3)图像的结构分析函数,这类函数主要用于图像的轮廓边缘处理、几何变换以及平面细分。 (4)摄像机定标和3D重建函数。这类函数主要包括用于摄像机的位置定标、姿态估计以及摄像头进行3D相似重构的函数。 (5)GUI与视频处理函数。为方面设计人员开发出界面友好的应用程序,OpenCV提供了高级图形结构函数 HighGUI来实现对图像的载入、显示、保存等基本操作,以及其他用于实现视频输入输出及处理的函数。3.1.3 OpenCV特征OpenCV凭借着其突出的优点在计算机视觉领域取得了广泛应用。OpenCV的主要特征和优点主要有以下几个方面:(1)无论在Windows、Linux、Vxworks、Mac OS等不同的系统平台上,OpenCV都可以良好的运行,良好的平台无关性,移植性能非常好; (2)由于OpenCV支持大多数C/C+编译器,因此可以轻易在不同开发环境和平台下进行移植。如在VC6.0、C+ Builder、VCNET2008、VC.NET2005等不同的开放环境下都可以利用OpenCV进行应用程序开发;(3)OpenCV中无论是提供的封装函数,还是MLL机器学习库都是完全开发的,源代码在官方网站中都可以下载,良好的开源性是其广泛应用的原因之一。 (4)由于OpenCV采用C语言代码编写,包括300多个C/C+函数,代码效率非常高,同时支持中、高层的API函数;OpenCV可以与外部函数库联立使用,也可以独立使用;提供了方便灵活的接口。 (5)OpenCV具备强大的图像处理和矩阵运算能力,有助于减少开发者的工作量,有效提高应用程序开发效率和应用程序运行的可靠性; (6)突出多核处理器处理速度快的优势,针对Intel的处理器进行了优化。3.2 目标检测法目标检测方法最初由Paul Viola提出,并由Rainer Lien hart对这一方法进行了改善。OpenCV中提供了已经训练良好的Haar级联分类器,使得人脸检测和识别过程可以很轻松方便的实现。OpenCV中的Haar级联分类器是基于boost分类器实现的,也是说Haar级联分类器的级联表中包含的是boost分类器。那么我们可以得知:Haar级联分类器则是由若干个简单boost弱分类器级联成的一个大的强分类器,被检测的目标依次通过每一个boost分类器,能够通过所有boost分类器的图形区域就可判定为人脸区域。OpenCV中的Haar级联分类器实现人脸识别的过程具体可分为:首先,利用样本空间集中的图像, Haar级联分类器进行分类器训练,得到一个级联的boost分类器。所谓级联分类器,指的是最终的Haar分类器是由几个简单的强分类器级联组成。在图像检测识别时,被检窗口必须通过每一级强分类器, 全部通过每一级强分类器检测的图形区域即为目标区域。其次,分类器训练完以后,就可以对输入图像中的与训练样本中相似的区域进行检测,相似区域包括相同尺寸、分辨率等。检测到图像区域中有目标区域,即人脸区域是,级联分类器输出为1,反之则输出为0。为了提高检测的准确率,可以在图像中移动搜索窗口来检测整副图像,通过检测整幅图像中的每一个位置来确定可能的目标。当整幅图像中有不同大小的人脸是,即哟偶不同大小的目标区域,OpenCV中的Haar级联分类器可进行检测窗口尺寸大小的改变。与改变待检图像的尺寸大小相比,这种方式更为有效。总的来说,为了检测整幅图像中未知大小的目标区域人脸区域,OpenCV中的Haar级联分类器的扫描程序通常需要用不同比例大小的搜索窗口对图片进行搜索式扫描。目前已经成熟的基于boosting技术的分类器有Discrete Adaboost,Real Adaboost, Gentle Adaboost和Logitboost。根据上面的分析,目标区域检测分为以下三个步骤,如图3.1所示:(1)样本的创建;(2)训练分类器;(3)利用训练好的分类器进行目标检测。图3.1 界面整体在界面的中间则是显示视频的地方。该软件提供同时打开是个视频文件,分别由四个打开按钮来控制,并且还提供了单个视频的放大和缩小功能,由上图可以看出。接下来对界面的三个部分进行进一步的说明。3.3 样本的创建3.3.1创建负样本(反例样本)负样本,又称为反例样本,可以来自于任意的图片,但这些图片不能包含目标特征即人脸区域。一般来说,负样本由文本文件背景描述文件来描述,背景描述文件中的每一行包含了一个基于描述文件的相对路径的负样本图片的文件名,必须手动才能创建负样本文件。如下是负样本描述文件的一个例子: 若设定目录结构如下: /img img a.jpg img b.jpg bbs.txt 则背景描述文件bbs.txt的内容为: img/img a.jpg img/img b.jpg3.3.2创建正样本(正例样本)与负样本相反,正样本则是包含目标特征的任意图片,它也是文本文件,但是由程序中的createsample程序自动创建的,无须人工手动创建。程序createsample的源代码可在OpenCV中查阅,一般以可执行程序形式保存在bin目录下。无论是单个的目标图片还是许多的事先标记好的目标图形,都可以用来创建正样本。正样本也可以从一个预先标记好的图像集合中获取。这个集合由一个文本文件来描述,类似于背景描述文件。每一个文本行对应一个图片。每行的第一个元素是图片文件名,第二个元素是图片中待检测目标实体的个数。后面紧跟着的是与之匹配的矩形框(x,y,宽度,高度)。以下给出一个人脸的检测的例自,使用预先标记好的图像集合创建正样本矢量:有5个正样本图片文件:imgA.bmp,imgB.bmp,imgC.bmp,imgD.bmp,imgE.bmp;有2个背景图片文件:bgA.bmp,bgB.bmp;文件目录结构如下:positive imgA.bmpimgB.bmpimgC.bmpimgDbmpimgE.bmpnegative bgA.bmpbgB.bmpinfo.dat bg.txt 正样本描述文件info.dat的内容如下: positive/imagA.bmp 1 0 0 24 28 positive/imagB.bmp 1 0 0 24 28positive/imagC.bmp 1 0 0 24 28positive/imagD.bmp 1 0 0 24 28positive/imagE.bmp 1 0 0 24 28 图片img1.bmp包含了单个目标对象实体,矩形为(0,0,24,28)。此外,若是从图片集中创建正样本,则要用info参数而非img参数。info 标记为正例样本的图片集合的描述文件。背景(负样本)描述文件的内容如下:nagative/bgA.bmp nagative/bgB.bmp 我们用一个批处理文件run.bat来进行正样本的创建,该文件的内容如下: cd e:facebin createsamples -vec e:facea.vec -info e:faceinfo.dat -bg e:facebg.txt -num 5 -show -w 24 -h 28 其中e:facebin目录包含了createsamples可执行程序,生成的正样本文件a.vec在e:face目录下。-h和-w选项的值与正例样本图片的真实大小一定要保持严格的一致。可以从图3.1中明显的看到,界面上分布着很多的按键,不同的排布具有不同的功能,第二章已经说明了添加命令按钮的方法,其实除了简单的添加之外软件Visual C+ 2010还为用户提供了更多的如外观、尺寸等其他的设置,为用户能够设计出更多个性化的界面而提供帮助。本文所涉及的界面按键是以矩形的样式来设计的(该样式也是软件默认的样式),其中可以看到较小的按键12个和一个较大的按键一个。为了让整体界面更充实饱满,首先在界面中心画出一个框来区分视频显示区域和其他区域,然后在其他区域分别用各种按键来填充,使得界面的整体没有太多留空白的地方也能够让那么多的按键紧凑而又不拥挤的在其他区域进行排布。从小按键可以看到其中有两排按键是两两对应的,并且它们的尺寸也一样,这样做是为了让使用者很明了的看到打开和处理每个视频是必须对应的,同样是能方便用户的使用。3.4训练分类器正负样本创建之后,需要要训练分类器,这个过程是由haartraining程序来实现的。该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下,如3.2图所示。图3.2 HaarTaining训练流程下面进行训练级联分类器,分类器训练的过程是用一个批处理文件run2.bat来完成:cd e:facebin haartraining -data e:facedata -vec e:facea.vec -bg e:facebg.txt -npos 5-nneg 2 -w 24 -h 28 训练结束后,在目录data下会生成子目录,即为训练好的分类器。-h和-w选项的值与背景描述文件中所描述的反例样本图片的真实大小一定要保持严格的一致,否则在haartraining.exe程序的运行过程中会掷出“Invalid background description file.”的错误并中止程序的继续运行!注:OpenCV的一些高级版本可以将目录中的分类器直接转换成xml配置文件。所谓的xml配置文件是指用将目录中的分类器用一个XML配置文件形式保存,通过对xml文件的访问,来实现不同内容的读取,但是读取算法和流程却不用因为不同的内容而改变的方法。在实际的训练应用中,haartraining程序却没有生成xml文件,后来在OpenCV的yahoo论坛上找到一个haarconv的程序,才将分类器转换为xml文件,其中的原因尚待研究。3.5 检测目标OpenCV的cvHaarDetectObjects()函数(在haarFaceDetect演示程序中示例)被用来做侦测。3.6创建Haar特征并载入样本函数icvCreateIntHaarFeatures(winsize, mode, symmetric)负责创建所有可能的Haar特征。 Mode决定使用基本的5种特征还是所有upright特征抑或所有特征。 当Symmetric为1时,表示只创建Haar特征的中心在左半部分的所有特征;当Symmetric为0时,表示创建所有特征。当训练人脸图像时,由于人脸的左右对称性可以设置Symmetric为1,以加速训练。在创建特征时,OpenCV将对每种特征进行了文字描述,具体如图3.3所示。图3.3 Haar分类器特征3.6.1 载入正样本函数icvGetHaarTrainingDataFromVec( )负责从正样本集*.vec 文件中载入数目为count个的正样本。在训练第一个分类器时,即程序第一次运行到此时,只要正样本集中有数目为count个样本,则一定能取出count个正样本。以后运行到此时,有可能取不到数目为count个样本,因为若目标区域没有通过前面的级联强分类器,则就不会被取出来,作为后面的级联强分类器中的训练样本。本文给出icvGetHaarTrainingData函数的表达式如下所示。int icvGetHaarTrainingDataFromVec( CvHaarTrainingData* data, int first, int count, CvIntHaarClassifier* cascade, const char* filename, int* consumed )传递返回值的Consumed参数表示为取count个正样本,查询过的正样本总数。此外,函数内还通过调用icvGetAuxImages函数计算积分图像。在此需要特别说明的是旋转Haar特征所用积分图像RSAT的计算方法,OpenCV代码中的方法与其文章中的方法有些差异,实际效率比文章中方法更高。在计算 RSAT 时,代码采用的是如下公式:RSAT ( x, y ) = RSAT ( x-1, y-1 ) + I ( x, y ) + buf x + buf x+1 其中buf x是对角线像素灰度值之和,如图3.4所示:图3.4 积分图像 RSAT 计算方法示意图此外,计算归一化因子时需要注意,OpenCV 没有用样本所有像素去计算标准差,而是去除了边界一圈像素 (normrect = cvRect(1, 1, img-cols - 2, img-rows - 2 ),并且归一化因子是标准差和归一化区域面积的乘积 (*normfactor) =sqrt( valsqsum / area - ( valsum / are )2 ) * area),这样就去除了在检测时目标与样本大小不同的影响。3.6.2 载入负样本函数 icvGetHaarTrainingDataFromBG( )负责从负样本集中载入数目为count个的负样本。同载入正样本一样,在训练第一个分类器是,系统的程序第一次运行该函数,通过该函数能够正确的从负样本集中选取数目为count个的负样本;但是在后面的级联器运行是,系统也会运行该函数,但是则有可能取不到数目为count个的负样本。原因同正样本一样,只有通过了前面级联器检测的负样本才回作为后面训练器的样本集合,也才有可能被后面的训练器检测识别为负样本。本文给出函数icvGetHaarTrainingDataFromBG的表达式如下: int icvGetHaarTrainingDataFromBG( CvHaarTrainingData* data, int first,int count, CvIntHaarClassifier* cascade, double* acceptance_ratio )传递返回值的 acceptance_ratio 参数记录的是实际取出的负样本数与查询过的负样本数之比(acceptance_ratio = (double) count) / consumed_count),也就是虚警率,用于判断已训练的级联分类器是否达到指标,若达到指标,则停止训练过程。此外,函数内还通过调用 icvGetAuxImages 计算积分图像。注意函数 icvGetHaarTrainingDataFromBG 中一个主要的 For 循环:for( i = first; i first + count; i+ ) /共读取 count 个负样本对上面代码中的注释有必要进一步说明一下:只有当之前的强分类器对负样本集内的样本全部分类正确时才会出现死循环。因为只要有一个样本会被错分为正样本,那么通过count次扫描整个负样本集就能得到count个负样本,当然这count个负样本实际上就是一个负样本的count个拷贝。为避免这些情况的发生,负样本集中的样本数需要足够多。在负样本图像大小与正样本大小完全一致时,假设最终的分类器虚警率要求是 falsealarm,参加训练的负样本要求是count个,则需要的负样本总数可计算如下: TotalCount = count / falsealarm 以 Rainer Lienhart 的文章中的一些参数为例,falsealarm=0.520=9.6e-07, count=3000,则TotalCount=3000/(0.520)= 3,145,728,000=31亿。当正负样本顺利载入,屏幕上会出现如下图3.5所示的输出界面:图3.5 正负样本载入后输出界面图3.5的含义:POS(正样本):取出的正样本数目; 查询过的正样本数目;两者之比;NEG(负样本):取出的负样本数目;查询过的负样本数目;两者之比。上面的输出由下面两行代码得到: printf( POS: %d %d %fn, poscount, consumed, (double) poscount)/consumed ); printf( NEG: %d %gn, negcount, false_alarm ); / false_alarm = (double) negcount) / consumed_negcount; 3.6.3 计算Haar特征值并生成XML文件void icvPrecalculate( CvHaarTrainingData* data, CvIntHaarFeatures* haarFeatures, int numprecalculated )函数icvPrecalculate( )负责计算所有取出的正负样本的前Numprecalculated个Haar 特征值(由icvGetTrainingDataCallback函数实现),并且对每种特征,将所有样本标号按其特征值升序排序(由cvGetSortedIndices函数实现,每种特征分别进行排序)。Numprecalculated的计算公式如下:numprecalculated = (int) ( (size_t) mem) * (size_t) 1048576) / ( (size_t) (npos + nneg) * (sizeof( float ) + sizeof( short ) ) );其中mem是内存大小,以M为单位,1048576=1024*1024,表示1M字节。sizeof( float )是保存一个特征值需占用的字节数,sizeof( short )表示对特征值排序后保存一个排序序号需占用的字节数。 新训练得到的强分类器信息由系统提供的函数icvSaveStageHaarClassifier负责,保存到临时文件AdaBoostCARTHaarClassifier.txt中。icvSaveStageHaarClassifier函数的工作流程
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!