搜索详情-毕业论文网

注册

  • 获取手机验证码 60
  • 注册

找回密码

  • 获取手机验证码60
  • 找回

人脸识别系统的设计与实现毕业论文

 2020-04-15 21:03:01  

摘 要

随着信息科学的飞速发展,人脸识别技术因其具有非接触性、非强制性和简便性等优点,已经成为计算机视觉技术的热点。

本文分析了人脸识别系统的需求,重点研究了Haar特征检测算法和PCA算法,基于OpenCV开源视觉库,以Visual Studio 2017和MFC为软件框架设计了人脸识别系统。

本课题实现的人脸识别系统主要六个模块:人脸采集模块,通过摄像头读入图像并显示在界面中;图像预处理模块,实现图像灰度化、对比度增强等功能;人脸检测模块,基于Haar特征检测出图像中人脸的位置与大小;人脸识别模块,基于PCA算法将检测出的人脸与训练好的模型进行对比并确认人脸信息;报警模块,当识别错误时,给出报警信息;数据库模块,记录人脸信息。经过各模块及ORL人脸库的测试,实现了较为完整的人脸识别功能。

关键词:OpenCV Visual Studio 人脸识别 PCA

Design and Implementation of Face Recognition System

Abstract

With the rapid development of information science, face recognition technology has become a hotspot of computer vision technology because of its non-contact, non-mandatory and simplicity.

This paper analyzes the requirements of face recognition system, discuused on Haar feature detection algorithm and PCA theory, based on OpenCV, and uses Visual Studio 2017 and MFC as software framework to design face recognition system.

The face recognition system realized by this subject mainly has six modules: the face acquisition module, which reads the image through the camera and displays it in the interface; the image preprocessing module realizes the function of image graying and contrast enhancement; the face detection module, which detect the position and size of the face in the image based on the Haar feature; the face recognition module compares the detected face with the trained model based on the PCA algorithm and confirms the face information; the alarm module, when identifying the error, gives Alarm information; database module, record face information. Through the testing of each module and the ORL face database, a relatively complete face recognition function is realized.

Key Words:OpenCV;Visual Studio;Face recognition;PCA

目 录

摘要 I

Abstract II

第一章 绪论 1

1.1 课题背景和研究意义 1

1.2 国内外发展现状 2

1.3 本文研究内容及结构 3

第二章 系统相关软件介绍 5

2.1 Visual Studio简介 5

2.2 OpenCV简介 5

2.2.1 CMake编译OpenCV扩展库 5

2.2.2 VS中配置OpenCV 6

2.3 MFC简介 7

2.4 Mysql数据库简介 8

第三章 人脸识别系统的总体设计 10

3.1 系统需求分析 10

3.1.1 背景分析 10

3.1.2 设计目标 10

3.2 系统整体框架 11

3.3 小结 11

第四章 人脸检测与识别 13

4.1 人脸检测模块 13

4.1.1 人脸检测 13

4.1.2 Haar特征的定义及算法实现 13

4.1.3 基于Haar特征的人脸检测功能的实现 15

4.2 人脸识别模块 18

4.2.1 人脸识别 18

4.2.2 PCA算法的定义及算法实现 18

4.2.3 基于PCA的人脸识别功能的实现 20

4.3 小结 25

第五章 系统整体实现 27

5.1 其他模块设计 27

5.1.1 人脸采集模块 27

5.1.2 图像预处理模块 29

5.1.3 报警模块 31

5.1.4 数据库模块 31

5.2 界面实现 34

5.2.1 MFC类库介绍 34

5.2.2 系统的图形界面 36

5.3 小结 37

第六章 总结与展望 38

6.1 研究工作总结 38

6.2 展望 38

参考文献 40

致谢 42

第一章 绪论

1.1 课题背景和研究意义

在当下社会形势下,信息技术已经融入生活中的方方面面,例如网上购物、扫码支付、社交网络、网银等。这些技术给予了人们便利的同时,泄露个人隐私和财产安全等问题也引起了人们的注意。传统的辨识人们身份的方法,例如身份证件、自设的密码等,容易遗失或者被盗窃,这已经降低了人们对这些技术的信任,例如当你的身份证和银行卡被人盗走,他可以很容易的窃取你的钱财。所以,人们将注意点逐渐转移到寻找更保险、安全的身份辨识技术,即生物特征识别技术。

生物特征识别技术主要是通过机器视觉、神经网络等技术来提取和描述人类的生理特征,从而确认某个人的身份。每一个人都有其独有的生理特征,这其中有部分特征是便于测量并可以通过一些技术来自动辨识的,例如:指纹、虹膜、掌纹、人脸特征等。对于人类的生理特征,目前人脸识别技术、指纹识别技术、声音识别技术已经趋于成熟[1]。一般来说,这些人类生理特征技术具有安全性和便利性,它不需要人们将身份证件随身携带,也不需要人们记住冗长的密码,只要辨识个人本身生理特征即可。人脸识别相对于虹膜识别、指纹识别等技术来说,虽然其识别准确率较低,但它具有识别方式直观、识别速度快等特点。因此,人脸识别成为了目前研究的热点课题之一[2]

所谓人脸识别,是指对于一个图像或者一段视频,利用保存有人脸特征值的数据库来确认其身份。根据目前人脸识别技术的研究情况来看,人脸识别有以下优势[1]

(1)非接触性:在采集人脸图像的过程中,采集图像的设备不用接触到用户,这更容易被用户接受[1]

(2)隐蔽性:采集人脸图像可以在用户不知情的情况下进行,这样可以在安全问题和罪犯辨识上起到特殊的作用[1]

(3)便利性:人脸识别对机器的要求不高,一般的摄像头都可以满足要求。

人脸识别主要运用于以下方面:

  1. 档案管理系统:随着网络技术的发展和普及,老一代的纸质档案早已无法适应当下的爆炸数据。人脸识别技术可以搭配互联网,完成人类身份的快速辨识,及人类信息的快速修改,这是一种更快捷可靠的方式。
  2. 公安系统的罪犯身份识别:在地铁站、机场、演唱会等人流量巨大的公共场所,通过摄像头进行拍摄可以很容易的采集到人脸图像,再进一步识别其身份,找出可疑人物,追踪罪犯,更好的维护广大人民群众的公共安全。
  3. 安全验证系统:例如火车站检票时,需要验证身份证信息和车票信息,人眼无法快速的辨别身份,但人脸识别技术则可以准确快速的与证件进行核验,这大大减少了人力物力的花费。
  4. 人机交互:将人脸识别技术运用到机器人或者游戏设备中,可以带给人们不一样的体验,增强人们使用这些电子产品的真实感。
  5. 公司考勤:大多数单位都需要员工打卡考勤,运用人脸识别技术可以有效的杜绝员工打卡时的造假现象。

因此,研究人脸识别技术在信息安全、推动社会进步、解放人力方面有着重要意义。

1.2 国内外发展现状

人们很早前就对人脸识别的技术开始了研究。早在60年代末期,人脸识别相关的描述已经出现在文献[3]中,此时,Blesdsoe也搭建了最早的半自动人脸识别系统,此后,在各国研究者的共同奋斗下,人脸识别的技术得到了优化和改进,越来越趋于成熟,从而在人们的日常生活中得到了广泛应用。

虽然人脸识别的概念很早就被提出,但利用计算机来实现的自动人脸识别技术是在九十年代的末期才慢慢发展起来的。根据人脸识别技术的发展,大致可以分为三个阶段:

第一阶段:从1964年到1990年,研究者的重点是基于人脸几何特征的人脸识别算法[4]。每个人脸(例如眼睛之间的距离,眼睛的角度,嘴巴、鼻子的形状等)都有一定特点[5],所以最初的研究都着重于五官的形状,但这种算法要求有清晰高质量的图像。因为人脸几何特征获取的特征点比较少,如果有两个五官距离相似的人脸,检测就会出现错误。虽然这种算法检测速度很快,但其识别率太低。

第二阶段:1991年到1999年,这段时间人们开始将人脸识别的研究融入了统计理论[1]。例如EigenFace[6](特征脸算法)-由Pentland在1991年提出,为之后的人脸识别算法奠定了基础。又如Fisherface[7]-由Kriegman在1997年提出,这解决了特征点提取的问题,一定程度上提高了人脸识别的准确率,但仍然后受光照、姿态、表情、图像噪声影响比较大,有一定的局限性。

第三阶段:21世纪以来是人脸识别发展的黄金时期,各种各样的人脸识别方法层出不穷。2017年,宋彦提出了基于CNN的全变量建模人脸特征表达学习方法[8],该方法能够有效的保留人脸特征的同时降低人脸表达的位数,从而大大减少了人脸识别的计算量,并用实验证明了其较好的人脸识别性能。2018年,Yunyun W提出了用基于部分样本和特征知识的迁移学习算法来实现人脸识别[9],该方法通过对样本和特征进行共同聚类[10]来发现部分“样本-特征”结构,然后考虑相关的目标域样本来重构源样本,这样可以大大提高传输性能,并有效提高人脸识别的准确性。

与此同时,一些研究者另辟蹊径,他们从研究人脸识别的算法转向研究提高人脸识别精度的方法。他们着重消除光照、姿态、表情、图片噪声等对识别结果产生的影响。例如,在2009年,琚生根等人提出了基于统计特征融合的人脸识别方法[11],因为PAC分析的主元特征向量仅表示图像的整体信息,而非零最小特征向量只反应图像的微小变化,所以将两者结合到一起并用于人脸识别,可以一定程度上减少姿态表情对人脸识别的影响,在2015年,宁尚军等人提出了加入LBP算子的方法[12],由于LBP双子对单调的灰度变化敏感性较低,因此可以减少光照对识别的影响。在2017年,吴定熊等人提出了基于拉普拉斯金字塔的Gabor特征人脸识别算法[13],该方法同时获取人脸的整体特征信息和局部特征信息,能够在复杂背景环境下进行人脸识别,并且降低了姿态、表情及光照强度对人脸识别带来的影响。

1.3 本文研究内容及结构

本课题拟在Windows系统下,基于Visual Studio 2017的跨平台编辑器,使用OpenCV图像处理进行对人脸图像识别的处理,实现PCA人脸识别方法,使用ORL标准人脸数据库进行训练,并用MFC搭建系统界面,最终实现一套完整的人脸识别系统。

本文内容安排如下:

第一章为绪论,主要介绍了本文的研究背景和意义,并分析了国内外发展状况。

第二章为系统相关软件的介绍,主要介绍了Visual Studio、OpenCV、MFC及Mysql的功能及其配置的方法。

第三章为人脸识别系统的总体设计,分析了人脸识别所具备的功能,介绍了系统的软件框架的组成。

第四章为人脸检测与识别,重点研究了Haar特征与PCA的定义及算法实现[14],并进行了仿真实验。

第五章为系统整体实现,主要介绍了剩余模块的实现方案,并给出了系统的最终实现。

第六章为总结与展望,主要对本课题完成情况和不足做总结,畅想人脸识别技术未来发展前景。

第二章 系统相关软件介绍

2.1 Visual Studio简介

Microsoft Visual Studio是美国微软公司的开发工具包系列产品,VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone[15]

2.2 OpenCV简介

2.2.1 CMake编译OpenCV扩展库

OpenCV作为一款开源的计算机视觉开发工具包,它在提供源码的同时,给出了非常完整的OpenCV函数手册及其示例手册。OpenCV是开源的计算机视觉和机器学习库,提供了C 、C、Python、java接口,并支持Windows、Linux、Android、Mac OS平台[16]。OpenCV自1999年问世以来,就已经成为计算机视觉领域学者和开发人员的首选工具。

然而从OpenCV3之后的版本,官网提供的库只包括其核心模块,并不包含其扩展模块。因为本次人脸识别系统中需要调用其扩展库,所以需要先用CMake编译完整的OpenCV库。CMake是一个跨平台的安装(编译)工具,它可以编译生成源代码及程序库。

编译时需将和勾选,编译结果如图2-1所示。

图2-1 CMake编译结果

2.2.2 VS中配置OpenCV

本文所用的是64位Windows 10操作系统。首先得配置系统环境变量,将动态链接库的路径即E:\opencv bulid\install\x64\vc15\bin添加到Path系统变量中,如图2-2所示。接着在VS的工程项目下将静态链接库路径即E:\opencv bulid\install\x64\vc15\lib和头文件路径即E:\opencv bulid\install\include\opencv2添加进去,并为链接器添加附加依赖项opencv_img_hash341.lib,opencv_world341.lib,如图2-3所示。

图2-2 配置环境变量

图2-3 在VS中配置OpenCV

2.3 MFC简介

微软基础类库(Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C 类的形式封装了Windows API,并且包含一个应用程序框架,这减少了开发者大量的时间,其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类[17],供我们直接调用编程。

2.4 Mysql数据库简介

数据库是1960年后发展起来的一种管理数据的技术,通过数据库,可以使用户便捷明了地获取自己需要的信息。

SQL(Structured Query Languate,即结构化查询语言)是一种特殊的编程语言,用于数据库查询和程序设计,也可用于存取数据及更新和管理关系数据库系统[18]

在VS中配置Mysql:将Mysql的include文件添加进包含目录中,将libmysql.lib添加进链接器输入的附加依赖项中,如下图所示。

图2-4 配置Mysql目录

图2-5 配置Mysql链接器

第三章 人脸识别系统的总体设计

3.1 系统需求分析

3.1.1 背景分析

当下的人脸识别系统大多是基于计算机网络结构,以摄像头为图像采集设备,通过TCP/IP网络实现数据传输,后台以服务器为平台,构成一个有机的整体,如图3-1所示。

图3-1 人脸识别系统结构

人脸识别主要运用于国家安全、证件核实、人事考勤等领域。在设计人脸识别系统时,我们需要遵循以下原则[19]

(1)从整体到局部的设计原则。在设计系统时,应当首先完成系统的软硬件部分的整体框图,再将整体细分为一个个模块,使每个模块功能简单且易于实现。

(2)经济型原则。在满足需求的前提下,尽量采用廉价且可靠的软硬件设备。

(3)可靠性原则。设计的系统必须具有完整的功能,并具备长期运行的条件。

(4)操作与维护的原则。设计的系统应便于操作,界面应该简洁直观。

3.1.2 设计目标

人脸不仅可以代表一个人的身份信息,而且人脸识别具有效果好、非强制性等特点。本章针对人脸识别系统的需求,给出了以下分析。

人脸识别系统是为了辨识出人脸。所以该系统以电脑摄像头为图像采集端,将采集到的人脸图片传入系统,接着对采集的图像进行一系列预处理 ,最后定位人脸并确认人脸信息。

3.2 系统整体框架

本文搭建的系统框架如下图3-2所示。

图3-2 系统框架

该系统包含6个模块,每个模块能独立的完成其对应的功能。

人脸采集模块负责人脸图像的采集及传输。本文中借助本地摄像头获取图像,并实时将画面传输入系统,进行实时分析。

图像预处理模块主要负责将图像灰度化、二值化及中值滤波等,便于之后的检测与识别。

人脸检测模块负责将人脸图片的中的人脸进行定位,便于特征的提取。

人脸识别模块负责将人脸特征值与训练好的模型比对,以此确认人脸信息。

报警模块负责当识别错误时,给予报警提示框。

人脸数据库模块负责存储人脸数据及人脸对应的标签,便于之后人脸信息的修改、更新。

3.3 小结

本章介绍了当前人脸识别系统的一般架构及系统的设计原则。在此基础上,分析了人脸识别系统所需要求,给出了系统整体框架设计,并分析了每个模块需要完成什么样的功能,为下文中功能的实现着铺垫。

第四章 人脸检测与识别

4.1 人脸检测模块

4.1.1 人脸检测

人脸检测指对于摄像头读取的人脸图像,通过一些算法将其中的人脸框出,并返回人脸的位置和大小。本文中的人脸检测是基于Haar特征实现的,该方法在一般光照强度变化下,可以较好的框出人脸。

4.1.2 Haar特征的定义及算法实现

Haar-like特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征,它被广泛用于人脸检测中[20]。Jone和Viola以此为基础,提出了三种基本种类的Haar特征:边缘特征、线性特征、对角线特征。此后,Lienhart等人丰富了Haar特征,他们将基本模型旋转45度,得到了第四种Haar特征[21]。OpenCV中共使用了14中Haar特征,包括基础类型5种,核心类型3种,all型6种。

图4-1 Haar特征

由图4-1可知Harr特征是有黑色白色矩形组成,其中,正值的权值由黑色方块表示,负值的权值由白色方块表示,且矩形区域的面积越大,权值越小;面积越小,权值越大。这样可以抵消两种颜色的面积不相等造成的影响,这使得Harr特征值在灰度分布均匀的区域特征值约等于0。Harr特征值就是用白色区域像素值减去黑色区域像素值,该特征可以对人脸的一些特征进行简单刻画,如图4-2所示。

图4-2 Haar刻画人脸

Haar-like特征有很多种类,矩形可以缩放扩大,矩形的位置也可以移动。这导致很小的检测窗口中可能存在数量巨大的矩形特征,因此需要使用积分图来快速计算特征值,积分图能够只遍历一次图像就可以求出所有区域的像素和,这大大提高了Haar特征值的计算效率[22]

积分图的主要是思想是将图上一点周边矩形区域内的所有像素值和保存下来,下次计算时直接调用,这大大提高了检测效率[23]。(i,j)为图上任意一点的坐标,构造方式是位处的值是原图像左上角方向所有像素的和[24],即

(4-1)

用表示行方向的累加和,初始化,用表示一个积分图像,初始化,按每一行扫描图像,递归计算每个像素行方向的累加和和积分图的值[24],即

(4-2)

(4-3)

这样扫描一遍图像,但到达图像最右下的像素时,积分图就构建好了[24]

图4-3 Haar举例

该矩形特征值为

式(4-4)

也就是矩形A与矩形B大的像素和之差[25]

4.1.3 基于Haar特征的人脸检测功能的实现

本文调用的是OpenCV中的一种叫做Haar cascade的人脸检测器,他利用保存在XML文件中的数据来确定每一个局部搜索图像的位置[26]。本文中使用了haarcascade_frontalface_alt2( )来实现Haar cascade分类器,这个分类器是Haar特征里检测正脸效果比较好的一个,但仍然存在一些漏检,例如戴眼镜、逆光、脸部倾斜等都无法检测。测试如下:

图4-4 戴眼镜及脸部倾斜测试图

图4-5 逆光测试图

图4-4中两张戴眼镜的人脸仅检测出一张,两张倾斜的人脸都没检测出;图4-5中逆光的人脸没有检测出。由此可知,Haar_alt2人脸检测器在检测带眼镜人脸时,有一定漏检率,在检测倾斜和逆光人脸时,检测率极低。

为了提高检测率,本文又调用了多尺度检测函数( )。其原理是在检测的时候,将在进行检测的时候,将一个固定大小的检测窗口放在图像的某个区域检测,如果与人脸特征值匹配就记录这个矩形区域的位置,然后滑动检测窗口,检测另一个区域,以此逐步缩小图像,使特征最大化。detectMultiScale主要参数如下:

void detectMultiScale(

const Matamp; image, //待检测图片

CV_OUT vectorlt;Rectgt;amp; objects,//定义矩形框

,//矩形窗口以10%递增变大

, //一般默认为3

int flags = 0, //默认值

Size minSize = Size(), //得到目标区域的最小范围

Si’iize maxSize = Size() //得到目标区域的最大范围

);

只使用Harr alt2和加上detectMultiScale效果对比如下图:

图4-6 Haar特征人脸检测

图4-7 加入detectMultiScale的效果

图4-6中,4张人脸中检测到了4张,误检了1张,重复检测了1张;29张人脸中仅检测出13张人脸。图4-7中,4张人脸全部检测到;29张人脸中检测出28张,仅漏检了一张。因此,在Haar特征中引入detectMultiScale函数可以大大增加人脸检测的成功率。

4.2 人脸识别模块

4.2.1 人脸识别

所谓人脸识别,是指给定一个场景的静态图像或动态视频,利用存储有若干已经身份的人脸图像的数据库验证和鉴别场景中单个或者多个人的身份[27]。人脸识别按照人脸信息的来源可以分为两类:基于静态人脸图像的识别和基于包含人脸的动态视频信息的识别[28]

4.2.2 PCA算法的定义及算法实现

Eigenface特征脸就是人脸的一组特征向量,他早在1991年就被Pentand等人用于人脸分类。特征脸是最早的能够将人脸进行分类并识别的方法。图像本质上是一个高维空间,二维的m×n的灰度图像就是一个m×n维的向量空间,其中并不是所有的维度都对人脸识别有利,所以我们需要找出主要的维度来刻画人脸的整体信息。于是,有学者提出了主成分分析(Principle Component Analysis,PCA),旨在将一个高位的数据集经过一些变换保留下一些低维的能反映绝大部分信息的数据集。在介绍PCA算法前需要先介绍K-L变换, K-L变换是PCA的基础,PCA是K-L变换矩阵为协方差矩阵时候的变换。

K-L变换是基于统计理论上的变换[29]。将人脸图像看作高维空间,经过离散K-L变换,得到人脸数据库的协方差矩阵,再求出其特征向量,这些特征向量共同表示同一个人脸。以本文中用到的ORL人脸库为例。ORL人脸库中包括40张人脸,同一张人脸有10张照片,每个图像大小为92*112。因此,ORL人脸库可以表示为一个40×(92×112)的矩阵X,第i个人脸则为

(4-5)

接着,计算平均脸,即

(4-6)

那么,样本人脸与其平均量的距离为:

(4-7)

设矩阵,经过离散K-L变换后得到

(4-8)

计算的特征值和特征向量,设为和()。将特征值从大到小排列,取前n个特征值[30],使其满足:

(4-9)

设定,计算(),则一个特征脸可以表示为。此时,将投影至这个特征脸上,即可得到第i个人脸的特征向量为

(4-10)

由多个特征脸组合起来就成了特征脸人脸训练数据库。

当对人脸进行识别时,需要用到欧氏距离分类。选取距离阈值为

(4-11)

其中PjPk为第j个和第k个人脸的特征向量。

将识别到的人脸投影到特征脸上得:。P与每个人脸间的距离为。

任意取k值,当,该人脸无法识别,当,该人脸与库中第K个人脸匹配。

其流程图如图4-8所示。

图4-8 PCA流程图清晰化

4.2.3 基于PCA的人脸识别功能的实现

该功能实现的基本思想是将检测到的人脸与训练好的人脸模型进行比较,所以一个训练好的自己的人脸模型是至关重要的。本文中使用的是ORL人脸数据库,为了方便之后训练时图片的遍历,我自己写了一个程序可以将ORL人脸数据生成一个带标签的CSV文件,并将自己的人脸添加进去作为第41张人脸,如图4-9所示。

图4-9 生成CSV文件

其中第一列为存放图片的路径,第二列为人脸所代表的标签。

然后,使用了OpenCV中的Facerecognizer类,其中自带了Eigenface的算法,使用以下语句进行训练:

Ptrlt;BasicFaceRecognizergt; model = EigenFaceRecognizer::create();

model-gt;train(images, labels);

model-gt;save("MyFacePCAModel.xml")

训练过程删除每个人人脸图像的最后一张,这张照片用来做测试,剩下的图像进行样本训练。

这样在项目目录下就会生成自己训练好的PCA人脸数据模型- MyFacePCAModel.xml。具体流程如图4-10所示。

图4-10 人脸模型训练的过程

生成的MyFacePCAModel.xml如下图所示。

图4-11 MyFacePCAModel.xml

当需要识别人脸时,使用modelPCA-gt;read("MyFacePCAModel.xml")加载训练的人脸模型,即可进行后续的人脸预测和识别。本文中用自己的脸作为待辨识的人脸来测试识别效果,识别界面如图4-12所示:

if (predict == 35)

{

string name = "tyoung";

putText(frame, name, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));

}

当采集的人脸与人脸库中标签为35的人脸匹配时,就在人脸上显示“tyoung”。

图4-12 人脸识别结果

识别过程发现,识别结果一直跳变,该方法不能得到良好的人脸识别效果,于是用ORL人脸库进行测试。测试中,以ORL中的第一张人脸为例,将其特征脸及其用训练图片反向投影后重构的人脸保存在当地文件中,当特征值数目为10时,可以重构出20张人脸,效果如下。

图4-13 重构效果

其中,前10张图片为特征脸,后20张灰色图为重构脸(将训练人脸图像反向投影到特征脸时得到的图像),最后一张图片为训练图像的均值向量。当将特征值数目为改为50时,可以重勾出26张人脸,重构效果如下。

图4-14 50个特征向量时的重构效果

重构人脸对比如下图所示。

图4-15 重构人脸对比

从左到右依次为原图、特征值为10个时的重构图、特征值为50个时的重构图。由此可知,特征值越多重构的人脸越清晰。

图4-16 训练样本

图4-17 测试样本

对于训练好的模型,我们做以下测试 。ORL库中400张人脸图加上自己10张人脸图共410张人脸图片,将其分为两组,每个人分别5张图片用来训练,5张图片用来测试识别效果。训练样本如图4-16所示,测试样本如图4-17所示。结果如下:

图4-18 人脸识别率测试

ORL人脸库主要是展现人脸表情、姿态、配饰及微弱的光照强度变化,经过测试,PCA算法在ORL库中的识别成功率达到92.68%。因此,在光照强度不发生剧烈变化时,PCA算法针对人脸表情、姿态及配饰变化时具有较好的识别效果。将PCA算法用于视频人脸识别测试时,效果如下

图4-18 光线较暗时识别结果

图4-19 光线充足时识别结果

两图比较可得,PCA算法是建立在光照占据图像中绝大多数能量的基础上的,当光线较暗时,PCA算法将不能取到很好的效果。

4.3 小结

本章介绍了目前运用广泛的Haar特征、K-L变换和PCA算法。详细介绍了K-L变换的基本思想及算法推导实现过程。

Haar特征是目前检测速度较快、检查准确率较高的人脸检测算法。

K-L主要有以下优点,它可以完全除去原特征中的相关性,同时,K-L变换被称为均方误差意义下的最佳变换,因为在它进行降维时,可以使均方误差达到最小,该误差为所有舍去特征值的和,这最大程度上保留了原图像的整体特征。

PCA有些不适用的情况,例如当高维向量为不满足线性结构时,PCA测试结果较差;当PCA的原始特征不满足高斯分布时,PCA也不能得到理想结果。而K-L变换则对于连续或者离散的随机过程都适用,都可以使结果拥有最小均方差,PCA则是只针对离散情况的算法。在现实中,PCA比K-L更实用。

第五章 系统整体实现

本课题拟在Windows系统下,基于Visual Studio 2017的跨平台编辑器,使用OpenCV图像处理进行对人脸图像识别的处理。思路大致如下:

图5-1 人脸识别流程图

5.1 其他模块设计

本文中主要运用了OpenCV的4个模块,分别为模块、模块、模块、模块。模块是图像处理结构的基础;highgui模块提供了采集图像、显示、存储等UI接口;模块实现了图像处理的基础方法,包括图像的几何变换、平滑、阈值分割、形态学处理、边缘检测、频率域处理等;objdetect模块实现了一些目标检测的功能,如经典的基于Haar、LBP特征的人脸检测。

5.1.1 人脸采集模块

该模块通过电脑自带的摄像头设备来采集图像。调用了中的,括号内的0表示打开本地摄像头。若读取本地视频则用VideoCapture cap(“1.avi”)就可以实现;若读取摄像头采集的视频,需要设计一个循环来循环显示每一帧使其组成视频,程序如下:

while(1) 

Mat frame; //定义Mat变量,用来存储每一帧

capgt;gt;frame; //读取当前帧

imshow(“调用摄像头”, frame); //显示一帧画面

waitKey(30); //延时30ms 

}

效果如图5-2所示。

图5-2 人脸采集模块

MFC中的摄像头采集图片与VS不太相同,其需要在项目中手动添加Cvvimage的头文件,接着可以打开摄像头,将人脸图像采集到picture控件中。大致按以下步骤:

(1)获取pic控件的句柄,将IplImage画到pic控件的DC中;

(2)设置定时器ontimer来实现持续读取每帧画面,ontimer是图像采集的关键,它通过Windows API函数SetTimer实现,需要在工程的类视图中添加VM_TIMER消息的处理函数才能实现功能。本文中调用了多个定时器,则需要将定时器的ID作为选择对象来判断并实现不同的定时功能;

(3)利用CRECT类将每帧画面画到控件上,以便看起来是流畅的视频;

(4)设置killTimer和release.cap来释放摄像头和关闭定时器

然后,在界面上只需上点击“打开摄像头”按钮即可进行采集图像,效果如下图所示。

图5-3 打开摄像头效果

5.1.2 图像预处理模块

图像预处理模块是该系统中的一个关键步骤,由于各种环境的影响和摄影装置的质量差距,通常情况下图像可能存在噪声、对比度不够强等问题[31]。该模块实现图像光线补偿、灰度化、滤波、图像增强等功能,为后续人脸比对奠定基础。

本文中图像预处理模块采用了以下算法:

(1)灰度化:因为摄像头采集的图像为RGB颜色模式,处理的时候需要对RGB三种分量进行处理,而每个分量有255种值可取,这样一个像素点就有1600多万种颜色的变化范围,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些,灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征[32]。调用 类,程序如下:

cvtColor(srcImage, grayImage, CV_BGR2GRAY) //将图像转化为灰度图

效果如图5-4所示。

图5-4 灰度化结果

(2)灰度图二值化:图像的二值化是将图像上的像素点的灰度值0或者255,增强图片的对比度[33],使其呈现明显的黑白区别,进一步凸显人脸的轮廓。OpenCV中提供了函数threshold()。程序如下:

threshold(grayImage, result, 100, 255, CV_THRESH_BINARY);

其中grayImage为8位的灰度图片,result为是输出的图像,100为设定的阈值,255为输出图像中的最大值,CV_THRESH_BINARY为设定的阈值类型。

效果如图5-5所示。

图5-5 二值化结果

(3)中值滤波:中值滤波,类似于卷积,是一种领域运算,但计算的不是加权求和,而是对邻域中的像素点按灰度值进行排序,然后选择该组的中值作为输出的灰度值[34]

中值滤波最重要的能力是去除椒盐噪声。椒盐噪声是指在图像传输系统中由于解码误差等原因,导致图像中出现孤立的白点或者黑点。OpenCV中提供了medianblur函数可以实现中值滤波,程序如下:

medianBlur(src,result,3)

效果如图5-6所示。

图5-6 中值滤波结果

5.1.3 报警模块

当人脸识别错误时,将弹出窗口警告“识别错误!”,该功能用MFC中的AfxMessageBox函数实现。效果如图5-7所示。

AfxMessageBox(_T("识别错误"), MB_OKCANCEL | MB_ICONQUESTION)

图5-7 报警模块

5.1.4 数据库模块

本文所采用的人脸数据库为ATamp;T Face database,即ORL人脸数据库。该数据库由40个人组成,每个人有10张照片,对应了不同姿态、不同表情下的人脸[35],每张照片表现了不一样的人脸面部特征,但是这些图像均为灰度图像,且均为正面的人脸照片。

本文中采用的是mysql数据库,在本地建了一个名为mysql的数据库,并将其接入VS中,测试连接是否成功,以便之后传入人脸数据。连接测试如图所示,程序如下:

MYSQL m_sqlCon;

mysql_init(amp;m_sqlCon);

if (!mysql_real_connect(amp;m_sqlCon, "localhost", "root", "123456", "mysql", 3306, NULL, 0))

{

AfxMessageBox(_T("访问数据库成功!"));

图5-8 数据库连接成功

本文利用Mysql server 8.0作为服务端,构建了账户名为root,密码为123456的数据库,主要包括“time”、“image”、“lable”三个字段,“time”为导入数据库的时间,“image”为人脸图像所在路径,“lable”为人脸所对应的标签,用来确认人脸对应身份。

本文借助Navicat可以直观明了的获取需要的信息。

Navicat 是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设,它的设计符合数据库管理员、开发人员及中小企业的需要,Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息[36]

本系统中的人脸数据库结构如图5-9所示。

图5-9 数据库结构

通过MFC中的CFile类实现在界面中打开并显示当地文件夹中的图片。效果如下:

图5-10 打开本地人脸库

图5-11 在界面中显示打开的图片

通过“生成CSV”的按钮,可以遍历本地ORL人脸库,生成以逗号隔开的含有照片路径和人脸标签的txt文本,用load data local infile "CSV.txt" into table salary fields terminated by ','语句将txt文档导入Mysql数据库中命为csv的表里。通过Navicat在csv表中建好与之对应的三个字段“time”、“image”、“lable”,按下“数据库”按钮后将txt文本中的数据导入到表中。效果如下:

图5-12 Navicat可视化表

运用上述方法,可以实现人脸拍摄保存到本地,并编译为CSV,通过sql语句导入Mysql数据库,并通过Navicat生成表直观地查看人脸数据库,基本上实现了人脸数据库的人脸分类、人脸信息更新和删除等功能。

5.2 界面实现

5.2.1 MFC类库介绍

本文主要使用了模态对话框,在设计界面时主要运用了以下成员函数。

表5-1 CDialog类成员函数

构造函数

成员函数

功能描述

CDialog

构造CDialog对象

可重载函数

OnInitDialog

重载该函数以便改变对话框初始设置

OnOK

重载该函数可在对话框中进行OK按钮操作

OnCancel

重载该函数以便在对话框中进行Cancel按钮操作或按ESC键

操作函数

DoModal

调用模态对话框,完毕后返回

MapDialogRect

将对话框的矩形单位转换为屏幕单位

NextDlgCtrl

在对话框中将焦点移到下一个对话框控件上

EndDialog

关闭模态对话框(隐藏而不销毁)

控件是基于对话框的,本文通过各种控件实现全部功能。本文中主要用到的控件如下表所示。

表5-2 控件类型

控件类型

控件ID

图片控件

IDC_STATIC

按钮控件

IDC_BUTTON

静态文本

IDC_STATIC1

编辑控件

IDC_EDIT

其中,按钮控件为使用最多次的控件。按钮控件是一个小的矩形子窗口,用户通常通过单击它与应用进行交互。CButton类实现了对标准按钮控件的封装,通过该类及其基类的相关成员函数可以完成对按钮的各种操作。它的成员函数及简要的功能描述如表5-3所示。

表5-3 CButton类成员函数及其功能

构造函数

CButton

构造一个CButton对象

Create

创建Windows按钮控件并在CButton对象上应用

操作函数

GetCheck

检索按钮控件的选中状态

SetCheck

设置按钮控件的选中状态

GetIcon

检索此前调用SetIcon设置的图标句柄

SetIcon

指定一个在按钮上显示的图标

GetBitmap

检索此前调用SetBitmap设置的位图的句柄

SetBitmap

设置在按钮上显示的位图

GetCursor

检索此前调用SetCursor设置的光标图像的句柄

SetCursor

设置在按钮上显示的光标图像

GetState

检索按钮控件的选中状态、加亮状态和获得焦点状态

SetButtonStyle

设置按钮控件的风格

GetButtonStyle

检索按钮控件的风格

可重载函数

DrawItem

可以重载它来绘制制定的CButton对象

表5-3 CButton类成员函数及其功能(续)

5.2.2 系统的图形界面

整体的人脸识别界面如下图所示。

图5-13 人脸识别界面

首先,在Visual Studio中创建基于对话框的MFC应用程序,注意:取消“使用Unicode库”,否则在使用AfxMessageBOX时会报错。然后,打开资源视图,在项目资源下添加Bitmap位图,Bitmap使用bit位来存储图像。最后在CDialog::OnPaint()中,调用添加的位图,完成带背景的对话框设计,并使用SetWindowText函数添加界面标题。

同时,用以下代码实现系统时间的显示。

GetLocalTime(amp;st); //获取系统时间到st

strDate.Format(_T("M----"), st.wYear, st.wMonth, st.wDay); //设置strDate变量的格式为年-月-日

strTime.Format(_T("-:-:-"), st.wHour, st.wMinute, st.wSecond); //设置strTime变量的格式为时:分:秒

人脸识别界面测试如下:

图5-14 识别演示

5.3 小结

本章主要设计了人脸识别的交互界面,实现了界面按钮指示的各种功能,展示了一部分功能实现的代码及功能实现的效果图。基本实现了各模块功能,通过MFC编写C 程序搭建了人脸识别界面。本文中的人脸识别是基于xml人脸分类器文件,具有较快的识别速度。经过测试,本界面可以实现对应按钮的功能,并且按钮功能互不冲突。

第六章 总结与展望

6.1 研究工作总结

本文总结了人脸识别的课题背景和研究意义,重点研究了Haar特征检测算法和PCA算法,在windows 10系统下,基于Visual Studio 2017平台编辑器,使用OpenCV图像处理库及MFC基础类库,设计了人脸识别界面,并编写及测试了其功能,实现了较为完整的人脸识别系统。本文具体完成了以下工作:

1.具体介绍了OpenCV的功能及其配置、编译方法;大致介绍了Visual Studio、MFC及Mysql的基本功能及用法。

2.详细介绍了Haar特征及PCA人脸算法的理论基础、算法推演及、在程序中如何具体实施及其实施效果。

3.运用OpenCV图像处理库实现了Haar特征人脸检测及PCA人脸识别两种算法,使用ORL人脸数据库作为人脸模型训练的数据库,并在库中加入本人照片,测试其识别性能。

4.设计算法大致实现了人脸识别系统的六个模块:人脸采集模块、图像预处理模块、人脸检测模块、人脸识别模块、报警模块、人脸数据库模块。

5.用MFC设计了人脸识别的交互界面,较为完整的实现四个功能:人脸图像采集功能、人脸模型训练功能、人脸识别功能、人脸数据库功能。

6.运行测试了人脸识别系统,确保按钮与按钮之前功能完整且互不冲突,并且利用了本人人脸进行识别,识别速度较快,识别结果良好。

6.2 展望

人脸识别技术已经发展了许多年,慢慢地趋于成熟,本文中也研究并设计了人脸识别系统,但是该系统仍需要在以下几个方面改进:

1.光照强度的变化对人脸识别的准确度造成了较大的影响,应该设计光照补偿模型,消除光照强度对识别的不利影响。

2.当下的人脸识别不具备反欺骗能力,人脸识别死无法确定对象是真人还是照片,应该设计交互行为,比如眨眨眼,张张嘴等来确定识别对象是真人。

3.算法的识别速度与识别率还不是很高,应研究新的算法或结合多种旧的算法以达到人脸识别最优的情况。

4.随着人脸识别技术的发展,人脸识别的计算将会大大减少,人脸识别的硬件的运行速度也会大大加快,所以希望完善系统功能,以便于多硬件平台使用。

参考文献

[1]卜秋月. 基于OpenCV的人脸识别系统的设计与实现[D]. 吉林大学, 2015.

[2]孙冬梅, 裘正定. 生物特征识别技术综述[J]. 电子学报, 2009(z1): 1744-1748.

[3]Bledsoe W W. Man-machine facial recognition[J]. Rep.PRi, 1966, 22.

[4]买买提江玉山. 基于C 的人脸识别系统的设计与实现[D]. 西安电子科技大

学,2011.

[5]张成元. 基于子空间分析的人脸识别算法研究[D]. 北京交通大学, 2009.

[6]M.Turk, A. Pentland.Eigen-faces for recognition[J]. Jounal of eognitive neurosciencem, 3(1), 1991: 71-86.

[7]Bellhumer P.N., Hespanha J., Kriegman D.. Eigenfaces vs.fisherfaces:Recognition using class specific linear projection[J]. IEEE Transactions on Patten Analysis and Machine Intelligence,Sspecial Issue on FaceRecognition, 1997, 17(7): 711-720.

[8]洪新海, 宋彦. 结合CNN不同层信息的全变量建模人脸特征表达学习方法[J]. 信号处理, 2017, 33(8): 1073-1081.

[9]Yunyun W, Jie Z, Yun L, Kejia C, Hui X. Transfer learning with partial related “instance-feature” knowledge[J]. Neurocomputing, 2018, 310: 115-124.

[10]I.S. Dhillon. Co-clustering documents and words using bipartite spectral graph partitioning, in: Proceedings of the Seventh ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, San Francisco, CA, USA, 2001, pp. 269–274.

[11]琚生根, 周激流, 王朝斌, 和坤. 基于统计特征融合的人脸识别[J]. 四川大学学报, 2009, 46(3): 618-622.

[12]盖健, 刘小华, 李锐杰, 宁尚军. 基于LBP的图像集人脸识别算法[J]. 东北师大学 报, 2015, 47(4): 84-87.

[13]吴定雄, 景小平, 张力戈, 王文彬. 基于拉普拉斯金字塔的Gabor特征人脸识别算法[J]. 计算机应用, 2017, 37(S2): 163-166.

[14]苗志程. 移动终端中主动预警系统的设计与实现[D]. 江苏科技大学, 2017.

[15]高乐乐. 民族文化遗产保护Web展示系统建设[D]. 北方民族大学, 2013.

[16]麦敬椿. 复杂背景下基于神经网络的人脸识别方法研究与实现[D]. 华南理工大学, 2014.

[17]巫建华. 基于混合编程ANN信息处理软件的研究与实现[D]. 江西师范大学, 2011.

[18]时继虎. 基于GIS的矿井水灾害地球物理信息管理系统研究[D]. 山东科技大学, 2011.

[19]雷玉堂. 安防视频监控实用技术[M],北京: 电子工业出版社, 2012.

[20]Arya S, Pratap N, Bhatia K. Future of Face Recognition: A Review[J]. Procedia Computer Science, 2015, 58(2): 578-585.

[21]刘双成. 基于ASM的描述性人脸特征识别研究[D].桂林电子科技大学,2014.

[22]黄勇. 基于人脸图像的性别识别研究[D]. 电子科技大学, 2016.

[23]瞿恺. 多层次特征选择与特征融合在视觉跟踪中的应用[D]. 华东师范大学, 2017.

[24]张荣锋. 智能视频监控中目标的实时跟踪和视频理解的研究[D]. 华南理工大学, 2017.

[25]张尚迪. 基于Adaboost和TLD算法的人脸检测跟踪系统[D]. 哈尔滨工程大学, 2013.

[26]陶颖军. 基于OpenCV的人脸识别应用[J]. 计算机系统应用, 2012, 21(03): 220-223.

[27]李树超. 基于一种改进的卷积神经网络的非受控场景下人脸识别[D]. 北京工业大学, 2017.

[28] 李武军, 王崇骏, 张炜, 陈世福. 人脸识别研究综述[J]. 模式识别与人工智能, 2006, (01): 58-66.

[29]张俊, 何Jafri R, Arabnia H R 昕, 李介谷. 基于面部几何特征点提取的人脸识别方法[J]. 红外语机关工程, 1999, 28(4): 40-43.

[30]李文辉. 基于深度学习的SAR图像目标识别[D]. 电子科技大学, 2018.

[31]李艳. 基于小波变换和PCA类方法的人脸识别技术研究[D]. 西安电子科技大学, 2014.

[32]周宇. 基于人脸识别的驾驶员疲劳驾驶检测系统的研究与实现[D]. 东北大学, 2008.

[33]于大林. 基于ARM的菌落计数系统的研究[D]. 吉林大学, 2012.

[34]杜换军. 汽车纵梁机器视觉检测系统中的图像拼接技术研究[D]. 吉林大学, 2007.

[35]孙小琪. 人脸识别算法研究与应用[D]. 江南大学, 2013.

[36]谢辉. 基于远程教育的教学与教学管理系统研究与开发[D]. 西安石油大学, 2013.

致 谢

大学几年的生活匆匆而过,有欢笑,有哭泣,充实饱满,是人生中的一段优美记忆。记得当初刚进大学时,一切都是充满未知,而如今已经饱学群书。经过大学的洗礼,整个人变得更加成熟稳重、富有责任感,这就是大学的收获。

在此,特别感谢我的指导老师王莉副教授的敦敦教诲,把我带进了模式识别这个领域,给我提供了这个研究课题和学习目标,让我奋发图强。王老师的严谨和一丝不苟的工作作风,认真负责,刻苦钻研,具有“工匠精神”的品质,让我深深地敬佩、崇敬。也感谢南京工业大学电气工程与控制科学学院的对我进行的培养和教育,感谢其提供良好的教学氛围和优质资源、学习平台。

最后,更重要感谢我的家人背后默默地支持与关爱,没有他们的辛勤付出,我早已没有了学习的经济来源和研究动力。我的家人永远是我坚强的后盾。今后我一定要努力学习与工作,来回报为我付出汗水的家人。

以上是毕业论文大纲或资料介绍,该课题完整毕业论文、开题报告、任务书、程序设计、图纸设计等资料请添加微信获取,微信号:bysjorg。

相关图片展示:

您需要先支付 80元 才能查看全部内容!立即支付

课题毕业论文、开题报告、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。