人脸识别毕业设计

上传人:痛*** 文档编号:60794507 上传时间:2022-03-09 格式:DOC 页数:50 大小:3.41MB
收藏 版权申诉 举报 下载
人脸识别毕业设计_第1页
第1页 / 共50页
人脸识别毕业设计_第2页
第2页 / 共50页
人脸识别毕业设计_第3页
第3页 / 共50页
资源描述:

《人脸识别毕业设计》由会员分享,可在线阅读,更多相关《人脸识别毕业设计(50页珍藏版)》请在装配图网上搜索。

1、信息科学与技术学院毕业论文课题名称: 基于特征识别的人脸检测系统学 院:信息科学与技术学院完成日期:二一七年五月十九日摘要摘 要我的毕业设计题目是基于特征的人脸检测系统,这个系统不仅仅能够检测人脸,还具有识别人脸的功能。检测人脸检测部分的算法采用的是于仕祺老师的LBP特征加Gentle AdaBoost分类器相结合的算法,提取识别特征部分的算法采用的是Google在2015年提出的基于深度学习策略的一种人工神经网络FaceNet,较为新颖,其准确率高,在光照不足,姿态和表情变化剧烈时仍能保持稳定,具有很强的鲁棒性。该系统的界面使用MFC编写,在具体实现中了应用了多线程编程技术实现了一个简单的生

2、产者消费者模型,从而提高了系统的识别效率,另外,对人脸的识别模块还使用了Python,C+混合编程技术引入了Google的开源深度学习框架Tensorflow作为对FaceNet的具体实现,数据库使用的是SQL Server2012,连接数据库使用的是微软公司的ADO 组件。该系统主要有信息采集模块和实时监控模块两个部分,前者完成对任务样本的信息采集工作,后者完成在实时监控的情况下对出现在画面中的人脸进行检测和识别,检测部分的速度可以达到4060的FPS,识别部分由于计算量较大,只能达到25的FPS。该系统经过简单的硬件支持和部署之后,基本可以完成在实际场景中的简单应用,具有一定的学术研究和实

3、际应用价值。关 键 词:人脸检测;人脸识别;机器学习;Tensorflow;实时监控7ABSTRACTABSTRACTThe topic of this graduation project is Face Detection System based on characteristics which achieves the face detection and face recognition two functions. The algorithm of face detection part uses a kind of enhanced algorithm based on LBP

4、feature and Gentle AdaBoost classifier proposed by ShiQi Yu,the algorithm of extracting face feature used in recognition part uses a kind of manual neural network FaceNet based on deep learning strategy proposed by Google in 2015.FaceNet has reached high arruracy and it is robustness to the change o

5、f illumination,posture and expression.The interface of this system if written in MFC,and in real implementation,the application of multi-threaded programming technology realizes a simple producer and consumer model which accelerate the whole recognition efficiency of the system,in addition,the recog

6、nition part also uses the Python,C+ mixed programming technology which introduces Googles open-source deep learning framework Tensorflow as a concrete implementation of FaceNet,the database is using SQL Server 2012,the link of database uses Microsofts ADO components.The system consists of two parts:

7、 the information collection module and the real-time monitoring module,the former completes the information collection of human samples,and the latter completes the detection and recognition of the faces that appear in the picture in the case of real-time monitoring.The speed of detection part can r

8、eaches to 4060 FPS,the recognition part can only reach to 25 FPS, for the large calculation cost.After some simple hardware support and deployment,the system can be used in actual scene for simple application which has certain research and practical application value.KEY WORDS: Face detection; Face

9、recognition; Machine learning; Tensorflow; Real-time monitoring 石河子大学信息科学与技术学院毕业论文目 录1 绪论31.1课题31.2课题背景31.3课题研究目的及意义31.3.1研究目的31.3.2研究意义41.4国内外研究现状51.4.1国外51.4.2国内61.5设计时间71.6内容及分工71.6.1内容71.6.2成果72 理论和技术82.1理论82.1.1检测部分的LBP特征+Gentle AdaBoost分类器82.1.2识别部分的Google FaceNet112.2技术152.2.1 MFC简介152.2.2 Te

10、nsorflow简介172.2.3 ADO组件简介183 需求分析及概要设计193.1 需求分析193.2 概要设计194 实 现204.1核心理论的实现204.1.1检测部分的实现204.1.2提取识别特征部分的实现214.2类244.2.2 TensorflowInference类264.2.1 ADOConn类284.3主界面294.3.1 流程294.3.2 实现304.4信息采集324.4.1流程324.4.2实现324.5实时监控344.5.1流程354.5.2实现364.6数据库385 测试405.1 主界面测试405.2信息采集测试415.3实时监控测试416 结论437 致

11、谢448 参考文献451 绪论1.1课题基于特征的人脸检测系统1.2课题背景自从计算机被发明的那一天起,人们就试图使用计算机来代替人力从事各种各样的劳动,经过数十载的发展和进步,以及对各种理论的深入研究,现在的计算机技术已经达到可以实现人脸识别的要求。人脸识别的一个重要应用就是身份鉴别,在许多重要的场合,传统的身份鉴别方法缓慢且低效,于是人们试图寻找更加高效方便的身份鉴别方案,人脸识别就是其中的一种考虑,与其他类型的生物识别比较,人脸识别具有非强制性、非接触性、隐蔽性、并发性的优点,而且人的面部表情还会反映出人的心理状态和情绪,这也可以为我们提供必要的辅助信息。人脸识别的研究如今已经成为许多从

12、事模式识别研究或者人工智能研究的科研机构的重要课题。虽然科学家们从很早的时候就试图让计算机能够识别人脸,但是因为人脸的信息容易受到各种环境因素的干扰和人物本身姿态和表情的影响,使得人脸检测和识别仍有很大的研究空间,并且目前商用的人脸识别应用并未普及,存在着非常庞大的商业空间,如今新生的人脸识别算法公司,如云从科技,Emotient,Affectiva中学术界大佬云集,动辄融资数千万,也从侧面说明了人脸识别与分析市场潜力巨大,具有很高的应用与学术价值。1.3课题研究目的及意义1.3.1研究目的狭义上来讲,人脸检测与识别的基本目的是从一幅静态图片或者是从视频流中的一系列图片中检测图像是否包含人脸,

13、如果有人脸,则能够准确给出人脸的各种信息,包括位置信息,大小信息,还要能够将人脸单独从原始的捕捉画面中剪裁出来,通过一定的算法提取出足够区分不同的人和同一个人的人脸特征,再将提取到的特征与事先存放在数据库中的人脸的特征进行比对,从而实现对图片中出现的人物进行身份鉴别,这在许多安检和考勤系统上得到了应用,目前稍微高档一点的手机都有人脸解锁功能。更进一步讲,人脸检测和识别还有许多其他的应用,例如当下流行的一些P图软件通过对人脸的分析和处理,可以开发出很多基于摄像头的应用比如美图秀秀和魔漫相机等,深受广大爱自拍的妹子们的喜爱,有的游戏公司则在游戏中加入了对玩家脸部表情的捕捉,并将其融入到游戏中,具有

14、巨大的市场价值,此外,获取的人脸中还含有更多有意思的信息,比如图片中人物的表情,神态,衰老程度,是否打扮等,从这些信息中可以进一步分析得出人物的情绪和心理活动甚至性格特征,表层体现的信息一旦被深度挖掘,其价值将无可估量,一些新生的人脸识别算法公司已经将这些信息用在许多场合,比如在销售业中分析顾客的实时感受,进而指导销售策略,这些信息在未来人工智能的拟人类产品中的对图像理解和机器人的人机交互中也具有重大意义。因此,从一般应用的角度来讲,研究人脸识别的目的是让计算机能够识别人脸,区分不同的人脸,自动对人进行身份鉴别,或者是对人脸加以适当的处理应用于娱乐休闲;而从人工智能的角度来讲,是为了让计算机能

15、够“理解”人脸,模仿人脸,让计算机更加地像人。1.3.2研究意义研究人脸检测与识别具有实际应用和理论研究两个方面的意义,体现在前者上的意义在于人脸检测和识别可以被广泛的应用在各种场合,举几个简单的例子,可以将人脸检测与识别技术应用在安检或监控领域,在一些对安全性要求很高的场合部署人脸检测与识别系统能够有效检查出异常人员的出现,为安保人员提供相应的预警信息,使其能够及时采取一定的措施避免安全事件的发生;还可以将系统部署到一般的街道上,类似天眼系统,全天识别路上的每一个人,这样可以让一些不法分子无处可藏,增加社会的安定性;在考勤系统上的应用可以是工作人员不用采取任何多余的动作即可完成打卡,只需要从

16、门口走过,人脸检测和识别系统就可以在神不知鬼不觉的情况下完成对考勤信息的记录,在这些方面的应用将创造巨大的社会价值。在理论研究方面的意义只要是体现在人工智能领域,科学家们梦想实现的终极强人工智能不可能一蹴而就,其基础的发展阶段就是对人类的各种模仿,研究人脸识别的相关理论可以为探索赋予计算机视觉理解提供一定的指导,而且由其与别的一些学科有所交叉,比如生理学,数字图像处理,生物神经学,心理学等,对人脸检测与识别的理论研究能够在一定程度上推动这些领域的发展,这些领域的发展反过来也是人脸检测和识别理论进步的重要推动力。在安检系统中,人脸检测与识别的本质就是从区分人脸,人脸检测是把人脸从背景中区分出来,

17、人脸识别是区分不同的人脸,对计算机而言,人脸只是一堆随机矩阵,和一个可乐罐子并没有什么太大的区别;而对于人工智能领域来说,人脸识别不再单单是区分人脸,而要求计算机能够以更加类似人的方式去理解人脸,得出人的更多信息,人身上没有那个部位能比脸更能反映这个人的信息了,包括年龄,心情,甚至性格特征,利用这些信息对人工智能产品的行为做出指导将产生更加友好的人机交互体验和更加个性化的服务,利用信息的前提是获取这些信息。1.4国内外研究现状1.4.1国外近十年以来,人脸识别已经发展成为热门的生物特征识别技术,国外几乎所有著名的从事与人工智能领域相关研究的研究机构和高校都有对人脸检测和识别技术及理论的研究。包

18、括像FaceBook,Google,Microsoft这样的互联网巨头公司也对人脸检测和识别的研究投入了大量的精力,并将可以实际使用的人脸检测和识别系统部署到它们的产品中去,用以开发新的应用或者提升用户体验。理论上的产生了基于几何特征的人脸识别、基于子空间的人脸识别、基于弹性图匹配的人脸识别、Geroghiades等人提出的基于光照锥模型的多姿态、多光照条件人脸识别方法,应用于以支持向量机为代表的统计学习理论。另外,有AdaBoost衍生出了许多变种和增强型人脸识别算法、基于彩色信息的方法、构建神经网络、基于形状分析的方法以及多模态信息融合方法也有大量研究与实验。目前,很多国家展开了有关人脸识

19、别的研究,美国的代表机构是卡耐基梅隆大学(CMU)机器人研究所、麻省理工学院(MIT)媒体实验室和人工智能实验室,欧洲的代表机构是英国的Surey大学视觉语音和信号处理研究中心、法国的INRIA研究所、芬兰的赫尔辛基大学CIS研究所、瑞士IDIAP研究所、日本的代表机构是ART研究所等。人脸检测和识别系统已经被法国人安装在ATM机上,通过对脸部的识别确定人物身份。美国更是将人脸检测和识别技术应在诸如军事,安防,教育,医疗,娱乐等各个方面,极大的方便了人们的生活,增加了生产效率,也多样化了人们的娱乐方式。国外的一些著名研究机构还专门话费大量的人力和物力来建立和维护许多人脸数据库,这些数据库被广泛

20、用来研究人脸检测和识别,尤其是对于最近几年超速发展的人工神经网络策略,训练一个完善的人工神经网络需要大量的训练样本(百万级别),这些数据库极大的方便了研究人员的样本获取过程,部分数据库被专门用来作为检测和识别算法的Benchmark,用以比较和评估算法的性能,也有专门用来进行竞赛的数据库,各种state-of-art算法在这些数据库上一较高下,极大的促进了人脸检测和识别的研究。理论的发展极大的促进了工业界的进步,众多新兴的人脸识别算法进而产品公司纷纷成立,他们将理论应用于实践的同时也组建自己的科研团队不断对理论研究做出贡献,目前比较著名的国外人脸算法和产品公司有Emotient,Affecti

21、va,Linkface等,Emotient致力于打造一套“无所不在”的人类情感分析系统,并且已经将表情识别服务部署到零售行业,它还提供API接口,能够将其技术轻松的任何硬件或者软件进行整合(本课题将尝试使用这些API);Affective主打面部识别解析服务,已经推出其SDK包,希望在市场营销以外的领域如游戏、教学等发挥作用,其已经获得共计2020万美元的投资;Linkface提供全球领先的人脸检测、识别技术服务,LFW人脸识别准确率已经高达99.5%以上。1.4.2国内国内的人脸检测和识别研究和其他的一些领域的研究一样,起步晚但在国家日益和国际接轨的情况下发展很快,国内的著名高校像北京大学,

22、清华大学,上海交通大学等,以及科研机构如中科院都对人脸检测和识别进行了研究,不但产出了许多能够实际应用的产品,也研发出了许多媲美国际水平的优秀检测和识别的核心算法。可供实际应用的产品的优秀代表有清华大学的科研人员开发出的THfaceID人脸识别系统,中科大的研究小组开发的KD-Face系列的人脸考勤机等。人脸检测与识别技术也被应用于国内安防,销售等领域,在08年奥运会中人脸检测和识别系统被实际部署并投入使用。在理论研究方面,国内的科学家也在奋力追赶state-of-art的算法,深圳大学的于仕祺老师的LBP特征+Gentle AdaBoost算法达到了当时世界人脸检测算法的顶尖水平,在检测的B

23、enchmark数据库上的竞赛保持第一名的位置一段时间。香港中文大学的科研团队研发的基于深度学习的DEEPID人工神经网络模型在当时也是达到了state-of-art的水平。国内目前比较有名的人脸识别公司有云从科技和Face+等,云从科技成员大多来自全球顶尖学府及研究机构,其研发了首个刷脸支付原型系统,首个商用人脸识别远程开户系统,它是唯一一家参与人脸识别国标、部标、行标制定的研发企业;Face+在金融、安防、零售领域分别开始了商业化的探索,成功发育出Face+Financial,Face+Security,Face+BI等垂直人脸验证解决方案产品。1.5设计时间 10周1.6内容及分工1.6

24、.1内容基于特征的人脸检测系统,主要实现以下功能:1) 对人物信息的采集,包括人物的姓名,人物肖像的采集,人物肖像的特征向量的计算;2) 实时监控,对出现在摄像头画面中的人物进行身份鉴别及记录。1.6.2成果1) 系统可执行程序一套;2) 毕业设计论文一份;3) 系统用户手册一份。石河子大学信息科学与技术学院毕业论文2 理论和技术2.1理论2.1.1检测部分的LBP特征+Gentle AdaBoost分类器此处描述的算法是该理论的一般性算法,并不和本课题程序中实际使用的算法完全相同,课题中检测部分使用的检测器是于仕祺老师公布的人脸检测库,只提供了函数接口和对应的DLL库,并未公开内部具体的实现

25、细节,只公开了特征使用的是LBP特征,分类器是Gentle AdaBoost Classifier,训练的正样本大约是150,000张图片,故此处只做一般性的算法介绍。1)LBP特征LBP全称Local Binary Pattern(局部二值特征),它的处理对象是灰度图片,作用是提取图片的纹理特征,它原理并不复杂,计算也比较简单迅速,对旋转和光照不具有一定的鲁棒性,因此其在纹理分析和人脸检测与识别的等应用中取得了非常好的效果。在本课题中,人脸检测部分提取的特征就是滑动子窗口的LBP特征,提取到的特征将作为分类器的输入,最原始的LBP定义是在某个像素的8领域内,将位于中心像素周围的像素的灰度值与

26、中心点像素的灰度值做比较,若大于中心像素的灰度值,则记为1,小于则记为0,然后将得到的八个01值依次排列看成是一个二进制数,再转换为十进制表示就得到了该中心点的LBP值,其计算过程如图2-1所示:图2-1用公式来表示的话: (2-1)其中()表示3X3领域的中心像素点,它的像素值为,领域的其他像素值为,s(x)为符号函数: (2-2)原始的LBP算子存在一定的缺陷,它只覆盖了一定范围的小区域,区域内的像素数量固定不变(如图2-1中的9个像素点),无法适应不同尺度的纹理需要,正对这个缺陷,一些科学家提出了一些改进的LBP算子,Ojala等人将3X3领域扩展到任意领域,然后使用圆形的包围区域,改进

27、后的LBP算子可以包含任意多个像素点,满足了对不同尺度的纹理分析需求,一种改进的LBP算子如图2-2所示,其定义了5X5的领域,在圆形包围线上取8个采样点:图2-2采样点的坐标需要经过一定的计算,采用取整或双线性插值的方法来求得采样点的整数值坐标,再利用基本LBP算子中求解中心点LBP特征值的方法(公式(2-1)求解LBP值,在人脸检测中,LBP算子的范围包围区域经常是椭圆形的,人脸,眼睛,嘴巴都是椭圆形的结构,用椭圆的包围区域可以获得更强的表达力,在此不再赘述。2)Gentle AdaBoost分类器Gentle AdaBoost全称Gentle Adaptive Boost Classif

28、ier(温和自适应强化分类器),它是基于Boost Classifier的一种改进版本,Boost Classifier简单说来就是指将许多的弱分类器级联起来组成一个增强型的强分类器,许多弱分类器通过类似“投票”的方式决定最终的分类结果。一种弱分类器的训练算法如图2-3所示图2-3一种Gentle AdaBoost分类器的训练算法如图2-4所示:图2-4其中,Gentle是指此分类器相对于传统的Adaptive Boost Classifier在训练时错误分类的样本的权值增加策略上更加平稳(图2-4中的3.b),以便获得更好的泛化能力;Adaptive是指相对于传统的Boost Classif

29、ier,Adaptive Boost Classifier能动态调节各个样本在训练时所占的权重,就是增加错误分类样本的权值,降低正确分类样本的权值。2.1.2识别部分的Google FaceNet无论是人脸检测还是人脸识别,都面临着来自光照,姿态,表情变化带来的巨大挑战,人工神经网络模型以其强大的非线性拟合能力和极强的鲁棒性能够在很大程度上面对以上挑战,而且深度学习是近几年才兴起的新理论,本课题勇于追赶研究前沿,在识别部分使用了David Sandberg根据Google在2015发表的一篇文章FaceNet: A Unified Embedding for Face Recognition

30、and Clustering使用Tensoflow实现的一个人工神经网络,并已经使用大量训练样本(百万级)预先训练完毕,在使用时只需要加载这个固化的网络模型至内存中,输入经过预处理的人脸图片,再执行一次前向计算,即可得到用于识别人脸的特征。FaceNet在LFW(Labeled Faces in the Wild)数据库上的准确率达到了99.63%,刷新了当时的记录。FaceNet使用深度卷积神经网络直接学习人脸在高维欧式空间的映射,映射得到的坐标点的欧式距离即代表了样本的相似性,距离越大表示相似性越低,反之越高。FaceNet的大体架构如图2-5所示:图2-5其中Deep Architect

31、ure就是一般的卷积神经网络去掉softmax后的结构,经过L2的归一化后得到人脸图片再高维欧式空间的的特征表示,在训练时以最小化后面的三联子损失函数为目标不断调整网络中各个节点的权值。目标函数:三联子损失函数,其学习过程如图2-6所示图2-6三联子表示在训练样本中抽取的三个人脸样本(抽取方法不做深入讨论),其中Anchor和Positive是来自同一个人的两张脸部图片,Anchor和Negative是来自不同人的两张脸部图片,学习的过程就是要使经过网络映射的Anchor和Positive的欧式距离尽可能小而Anchor和Negative的欧式距离尽可能的大,依此来获得对人脸特征的描述。用公式

32、描述: (2-3)其中表示映射过程,分别代表锚点,正样本,负样本,表示正负样本之间的距离,表示所有可能的三联子集合。两个样本之间的相似性就使用公式 来计算的。将(2-3)做一下转换便可以得到目标函数: (2-4)训练的过程就是最小化,训练方法使用一般的卷积神经网络的训练方法即可,其具体内容不做讨论,实现上各种深度学习框架已经集成了各种最为先进的优化算法,只需要调用相应地接口便可以完成对神经网络的训练过程。关于Deep Architecture,论文中给出了几种可选的网络结构,其中一种是Zeiler&Fergus结构,如图2-7所示:图2-7另外一种是基于Google Inception的结构,

33、如图2-8所示:图2-8其中一种Inception的结构如图2-9所示:图2-9课题中使用的网络结构目前还不知道其具体形式,Tensorflow提供了可视化固化网络模型的工具,但在实际使用时出了一些问题,因此很遗憾的没有看到实际使用的网络结构。2.2技术2.2.1 MFC简介MFC全称Microsoft Foundation Classes(微软基础类库),这是Microsoft推出的一套C+类,把大部分常用的Windows API函数封装在其中。MFC中的类和函数接口成千上万,对如此庞大的类库进行介绍和对其内部的复杂机制进行讨论已经超出本文的范围,因此在接下来的论述中,文章仅介绍本课题中显式

34、使用的一些内容,本课题使用的集成开发工具是Visual Studio 2013 Premium,在其中新建一个MFC项目的同时,VS会自动生成项目的主框架,我们要做的就是往这个主框架中添加内容和修改一些相应地修改,必要时重写某些函数。1) UI:本课题是基于对话框结构的项目,因此涉及到的UI知识仅有对话框中的内容,MFC封装了窗体和控件的底层绘制操作,用户可以在资源文件添加对话框类型的资源文件,然后用vs提供的可视化编辑工具编辑自己的对话框,而不用考虑其底层的绘制细节,各种控件的添加可以通过拖拽放置到对话框中。用可视化工具编辑完界面后,vs会自动为这个对话框生成一个相应的类CXXXDlg Ca

35、lss,这个类就封装了对话框中的所有内容,与控件关联的变量全部作为类的成员变量来实现,各种消息相应函数也是做为这个类的成员函数来实现的。本课题使用的默认MFC样式如图2-10所示:图2-102) 数据类型:MFC中定义了许多常用的数据类型,本课题使用最多是CString类型,窗体控件中显示的字符串的类型全部都是CString类型,写入数据库和从数据库中取出来的数据类型也都是CString类型,因此关于CString和其他数据类型的转换是本课题实现部分的一个重点。MFC中提供了许多类型转换函数和类型转换宏如宏CT2A( )可以将CString类型转换为string类型,CString类型的本身也

36、提供了一个强大的转换函数Format( ),它可以方便地实现许多基本的类型转换,但是一些更为复杂的类型转换还需要自己写函数去实现。3) 消息机制:在Windows中,消息和线程一一对应,当系统检测到某个消息时,会将相应的消息发送给与该消息对应的线程。按照类型,Windows将消息按照类型分为如图2-11所示的几类:图2-11Windows将整个消息系统分为3个层级:Windows内核的系统消息队列App的UI线程消息队列处理消息的窗体对象Windows内核会维护一个全局的系统消息队列,按照线程的不同,系统消息队列中的消息会被发送到应用程序的UI线程的消息队列中,应用程序的每一个UI线程都有自己

37、的消息循环,会不停的从自己的消息队列中取出消息,并发送给Windows窗体对象,每一个窗体对象都使用窗体过程函数WindowProc()来处理接受的各种消息。本课题中相应地消息一般都是第三层级的消息。MFC框架封装了对消息处理的大部分操作,我们可以在生成的窗体类中添加消息的响应函数,当系统检测到用户或者系统的行为产生了已经被定义的消息,会自动调用我们编写的消息相应函数,执行对消息的响应操作,在本课题实现中具体相应的消息有窗口绘制消息ON_WM_PAINT,系统时间消息ON_WM_TIMER,按键消息ON_BN_CLICKED等。4) 多线程:MFC中的线程主要有两类,一类是用户界面线程,另一类

38、是工作者线程,二者的重要区别在于前者有自己的消息队列和消息循环,而后者没有,用户界面线程的工作一般是处理界面绘制,响应用户操作和系统产生的事件及消息等,vs自动生成的窗口类中的成员函数大多都是作为用户界面线程执行的,一种不恰当的设计方式是将所有代码都放在用户界面线程中,这样做确实简单方便,但是它会带来一些严重的效率问题,比如一些占用大量内存和耗时较长的计算若放在用户界面线程中会导致界面长时间处于无响应状态,因此应该将计算量较大的处理另开工作者线程单独执行,用消息传递或者共享内存的方式与用户界面线程同步。MFC中多线程编程常用的函数如下几个:启动一个工作者线程:CWinThread * AfxB

39、eginThread(AFX_THREADPROC pfnThreadProc , LPVOID pParam , nPriority=THREAD_PRIORITY_NORMAL , UINT nStackSize=0 , LPSECRITY_ATTRIBUTES lpSecurityAttrs=NULL);在某个信号量上阻塞线程:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillisecondes);临界区的访问:进入临界区的使用CCriticalSection对象的Lock()函数,离开使用Unlock()函数.2.2.2 Tens

40、orflow简介TensorFlow是一个开源的使用数据流图的数值计算框架,被广泛的用于实现各种神经网络,数据流图中的节点代表数学运算,而图中的线条代表数据数组(又称为张量)。TensorFlow最初由Google大脑小组的研究员和工程师门开发,用于机器学习和深度神经网络方面的研究,但是因为这个框架具有通用性,也可以被用于其他的计算领域。它灵活的架构可以让你将节点部署在一个或者多个CPU或者GPU上进行并行计算。关于数据流图:数据流图是一种以数据流动为驱动力的计算模型,用nodes和edges的有向图来描述数学计算,Nodes一般用来表示对数据施加的数学操作,但也可以表示数据的输入的起点或者是

41、数据输出的终点。本课题尝试直接编译Tensorflow源码,以使用其C+接口,但官方给出的编译方式是使用Google内部使用的编译工具Bazel,这个工具在Windows平台很不稳定,目前只有测试版,在使用的过程中出现了各种问题,其中的一些无法解决致使编译失败。官方推荐的方式是使用Python接口,而且教程大多数也是基于Python接口的,于是本课题使用C+,Python混编技术将Python的接口封装成C语言的形式,如此就可以在程序中间接使用Tensorflow了。课题中使用的FaceNet模型是预先训练完成的,其数据流图的结构被固化存储在.meta的文件中,图中的权值被固化存储在.ckpt

42、的文件中。本课题使用的Python接口主要有如下几个:导入数据流图即网络结构至默认的图(tensorflow会在Python环境的上下文中提供)中使用函数 tensorflow.train.import_meta_graph(meta_file_path)加载权值至数据流图中saver.restore(sess,ckpt_file_path)根据Tensor的名字获得输入输出graph.get_tensor_by_name(tensor_name)执行前向计算sess.run(embedding,feed_dict=feed_dict)2.2.3 ADO组件简介ADO全称ActiveX Dat

43、a Objects是一个用于存取数据源的组件,它提供了编程和统一数据访问方式OLE DB的一个中间层,允许开发人员编写访问数据的代码为不用关心数据库是如何实现的,而只关心数据库的链接。本课题将对数据库的操作封装在一个类ADOConn中,封装后的类提供用于初始化连接数据库,直接执行SQL语句,获得查询语句的结果集指针和断开连接等数据库操作的接口。3 需求分析及概要设计3.1 需求分析本课题主要目的是设计一个用于实时监控的人脸识别系统,将摄像头部署在需要进行监控的场合,系统初始化完毕后便自动检测和识别出现在画面中的人脸,能记录已经识别人物的身份信息和出现在画面的时间并予以记录,将不能识别的人物标记

44、为Unknown并记录时间戳。系统只能识别预先经过信息采集的人物,在信息采集阶段,要求记录人物的姓名和头像。3.2 概要设计整个系统分为两个功能模块,一个是信息采集模块,另一个是实时监控模块,如图3-1所示:图3-14 实 现4.1核心理论的实现4.1.1检测部分的实现检测部分使用的是于仕祺老师公开的人脸检测库,配置好dll库后将相应地头文件导入到项目文件中即可使用这个库的接口,这个库针对不同的应用场合提供了四个不同的接口,本课题中使用的是检测效果最好但最耗时的一个接口int * facedetect_multiview_reinforce(parameter list.)函数形参列表包括了指

45、向存放检测结果区域的指针,指向存放输入图片数据区域的指针,输入图片的长宽和一些其他的参数,函数返回一个指向存放检测结果区域的指针,关键就是要提取这个指针所指向的数据,假设返回的指针是pResult,则pResult指向的第一个整型数据就表示在输入图片中检测到的人脸数量,在下来连续的内存区域中存放了每一个人的人脸信息,每个人占142个整型数据,前四个数表示了人脸包围盒的左上角和右下角的左边,第五个数据表示了名为neighbor的信息(其具体含义目前还未知),第六个数据表示了人脸的转角,范围是060度,之后每两个数据组成一个坐标点,标记了人脸的68个特征点,这些特征点标记了人脸的轮廓,眼睛,眉毛,

46、鼻子,嘴巴的位置和轮廓,共占用136个数据,如图4-1所示:图4-1检测的结果如图4-2所示:图4-2基于监控的检测只需要隔一定的时间间隔从摄像头中取出画面,将画面送入检测函数后把检测结构绘制在画面上在输出到用户界面上即可。4.1.2提取识别特征部分的实现提取识别特征部分采用基于Tensorflow实现的一个FaceNet神经网络模型,前文提到过未能成功使用Tensorflow的C+ API,因此使用其Python API,用Python编写好直接使用Tensorflow的函数,通过Cython将用Python定义的函数转换为C形式定义函数,Cython会自动生成对应函数的头文件和源文件,将生

47、成的文件导入项目中即可使用C形式定义的函数。所有关于Tensorflow的使用都被封装在一个叫TensorflowInference的类中,这个类封装了包括session对象的获取和维护操作、Python环境的初始化、网络模型的加载、计算映射特征以及所有的C+和Python数据交互工作,对类外的使用者完全隐藏了所有涉及Python的内容,具体见4.2.3节。在这其中有两点需要注意:1) Session对象:值得注意的是,Tensorflow中计算都是通过session对象来完成的,session对象中保存了数据流图的结构信息和权值信息,课题中使用的网络模型非常庞大(141MB),如果每次计算都

48、重新将模型从磁盘调入内存,会严重增加程序的耗时(每次加载模型大约耗时两分钟),因此合理的设计应该是在整个系统初始化时就将模型载入内存,并获取其session对象使其常驻内存,每次计算时调用session对象的成员方法即可完成一次计算(每次计算大约耗时0.30.4秒)。在Python脚本中,session对象的获取是通过Tensorflow提供的接口tf.Session()获取的,不过在获取session对象之前,需要将数据流图的结构信息载入默认的graph中,再将图中的权值恢复到session对象中,这样之后的session对象才能正确执行FaceNet的前向计算。获得的session对象会在

49、C+中以PyObject的类型出现。2) C+和Python的数据交互:本课题的一个难点就是C+和Python的数据交互问题,数据交互的形式是通过函数的形参和返回值进行的,主要包括两个方向,一是从C+部分的数据流入Python,二是Python部分执行计算的结果返回C+,按照Python官方给出的做法是将所有C+类型的数据转换成PyObject对象进行交互,但是由于Python所有的对象在C+中全部都是继承自PyObject类型,如此灵活的数据类型带来一定的复杂度,而且本课题中使用了图片类型数据,在Python中是numpy.ndarray类型,numpy官方给出了对C+版本的ndarray支

50、持,但是在实际使用中显示使用的函数接口已经过时。好在Cython允许在Python脚本中使用C类型的数据结构,使得从C+到Python的数据转换方便了不少。具体的数据流向和转换过程如图4-3所示:图4-34.2类4.2.1 People类People类是本课题设计的一个最为重要的类,它的抽象层级最高,是抽象的“人”,有姓名,映射向量,存储其头像图片的路径等属性,封装了计算人脸的映射特征,根据设定的阈值判断两个人是否是同一个人,以及所有的数据操作,其UML如图4-4所示:图4-4下面给出各成员变量的含义:1) Name:这个变量用于标记人物身份信息,在信息采集时作为必要信息录入数据库,在监控时作

51、为对人物身份的记录,并可以通过它找到存储在数据库中人物的更多信息。2) Embedding:这个变量是一个double型的指针,指向了一小块用于记录人物的识别特征的数据区域,他是根据另一个成员变量PortraitInput计算得出的,相当于2.2.1节中的f()的结果。3) PortraitShowPath:记录了用于展示人物肖像图片的存储路径。4) PortraitShow:保存用于展示人物肖像的图片,其规格为400X400。5) PortraitInput:作为FaceNet Model的输入数据,用于计算人脸识别特征,必须经过重新剪裁和缩放,其规格160X160。下面给出部分成员函数描述

52、:1) 函数SetPortraitInput:其功能是根据从摄像头获取的帧画面和检测部分给出的人脸包围盒矩形坐标剪裁图片,然后将其缩放至统一规格160X160,这样会得到一张160X160的规范化的人脸,图片需要剪裁是因为在检测部分给出的人脸包围盒太过紧致,丢失了诸如头发,额头上半部的信息,因此需要增大包围盒恢复这些信息;需要缩放是因为FaceNet要求的输入图片就是160X160的规格。void People:SetPortraitInput(Mat RawImage, cv:Rect vRectangle)计算剪裁矩形:左上角(X1,Y1),右下角(X2,Y2);检查剪裁矩形是否越界:X1

53、=X10 ? X1:0;Y1=Y10 ? Y1:0;剪裁原图片:temp=RawImage(X1,Y1,X2,Y2);放缩剪裁图片:cv:resize(temp,160,160);PortraitInput=temp;2) 函数GetDistance2:功能是根据两个人的映射特征Embedding计算两人的相似性。inline double People:GetDistance2(People vPeople)double Distance2 = 0;for i in 128/Embedding为128个元素的一维数组Distance2+=(People.Embeddingi-vPeople.

54、Embeddingi)2return Distance2;4.2.2 TensorflowInference类TensorflowInference类是作为对本课题使用到的几个Tensorflow Python API、所有的C+,Python数据交互操作和对人脸图片的预处理操作的封装,这个类提供了三个纯C风格的接口,维护了Session这个重要的对象,在实现中它是作为全局类CXXXApp的一个成员变量使用的,在整个项目初始化时会单独开工作者线程完成非常耗时的FaceNet Model加载工作,一旦初始化完毕,在项目的任何位置都可以通过引用全局对象theApp中的TensorflowInfer

55、ence对象来使用Tensorflow计算人脸的映射特征,其UML如图4-5所示:图4-5各成员变量的含义:1) Sess:指向Session对象的指针,Session对象保存了FaceNet Model的结构信息和权值信息。2) Result:指向用来存放从Python中取出的结果的一小片内存区域。3) data:用来存放最终输入到FaceNet Model中的经过预处理后的图片数据。各成员函数:1)函数InitTensorflowModel:加载FaceNet模型,get_embedding_session 函数实际是用Python编写的,经过Cython转换为C类型的函数以供使用。其代码

56、如下:void TensorflowInference:InitTensorflowModel()Sess = get_embedding_session();get_embedding_session()函数在Python中的定义如下:cdef public get_embedding_session():sess=tf.Session()saver=tf.train.import_meta_graph(meta_path)saver.restore(sess,ckpt_path)return sess由于得到的Session对象在使用时会作为用Python定义的函数的形参,所以C+并不需要

57、解析这个PyObject对象,只需要在内存中维护它的存在即可。3) 函数CalculateEmbedding:这是本课题最为核心的一个函数之一,功能是计算人脸的映射特征,它接受一个规格化的160X160的人脸图片,图片格式为cv:Mat型,和一个double类型的指针,计算的结果将存放在double类型的指针所指向的一小片内存区域内。描述如下:void TensorflowInference:CalculateEmbedding(cv:Mat vMat160, double *vDoubleArray)检查输入图片vMat160的规格,若不符合要求则退出;将OpenCVC默认的BGR格式图片转

58、为RGB格式;将160X160X3的图片拉伸为一维向量;PreWhiten“图片”,将PreWhiten处理后的结果存在data中;Result=get_embedding_result(Sess,data);/解析PyObject类型的返回结果for i in 128vDoubleArrayi=PyFloat_AsDouble(PyList_GetItem(Result,i);其中get_embedding_result()函数同get_session()函数一样,也是使用Python定义的,并经过Cython转换的,由于C+中对numpy.ndarray的解析函数已过时,因此需要将Mode

59、l中输出的numpy.ndarray类型的Tensor转换为C+可以成功解析的List类型。另外,根据Cython官方提供的资料,在用Cython语法编写的Python脚本中是用C的数据类型定义变量可以加快程序执行的速度,这是因为Python的底层本身就是C,因此定义中能用C定义的变量全部使用C定义。函数的原始定义如下:cdef public get_embedding_result(sess,short* data):images_placeholder=tf.get_default_graph().get_tensor_by_name(input:0)embeddings = tf.get

60、_default_graph().get_tensor_by_name(embeddings:0)phase_train_placeholder = tf.get_default_graph().get_tensor_by_name(phase_train:0)cdef int height=160cdef int width=160cdef int channels=3cdef int hindex=0cdef int windex=0cdef int cindex=0cdef int dindex=0cdef np.ndarray img_feedin=np.zeros(1,160,160

61、,3) /解析C+传入的数据,转换为numpy.ndarray类型for hindex in range(height):for windex in range(width):for cindex in range(channels):img_feedin0,hindex,windex,cindex=datadindexdindex=dindex+1feed_dict=images_placeholder:img_feedin,phase_train_placeholder:Falseresult=sess.run(embeddings,feed_dict=feed_dict)output=f

62、or i in range(128):output.append(result0,i)return output4.2.1 ADOConn类ADOConn类封装了所有对数据库的操作,比People类的抽象层级要低一级,People类通过对ADOConn类对象的引用来完成对数据库的操作,其UML如图4-6所示:图4-6这个类的抽象层次比较低,技术也比较落后,多数时候作为库来使用,而且本课题的数据库部分不是作为重点来考虑的,因此仅做简单介绍。形参为_bstr_t的函数可以直接执行在C+中编写的SQL语句,数据库返回的结果被保存在_RecordsetPtr指向的区域中,通过一定的解析就可以得到我们想要的数据,这其中涉及一些数据类型转换问题,People类中的对数据库操作的函数已经封装了这些操作,包括CString转换为double型数组,double型数组转换成CString型的字符串等,在此不做详细介绍。4.3主界面主界面的主要功能是初始化系统的Python运行环境,加载FaceNet Model,和展示信息采集模块以及实时监控模块的入口。4.3.1 流程主界面的执行流程图如图4-7所示:图4-74.3.2 实现在VS为主界面生成的类

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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