基于Python的人脸识别研究与实现

daixie 605 0

摘  要

人脸识别技术(Face Recognition Technology)是对输入的图像或者视频进行判断是否存在人脸,若存在人脸,则获取该人脸的特征数据,计算特征值,并将人脸数据与已有的人脸数据进行比较,从而得出该人脸的身份信息。人脸识别技术相对于其他生物特征识别技术而言,具有更加快捷方便的特性,用户不需要特意或者直接与设备接触,设备便可自行获取数据。但同时,人脸识别技术和其他生物识别技术相比,更容易被环境的因素干扰从而出现错误,需要人为干预以及大量的数据支撑。目前,人脸识别技术在国内外的各中环境中都被广泛使用。

关键词:人脸识别;生物特征识别技术;特征值 

Research and implementation of face recognition based on Python

Abstract

Face recognition technology is to judge whether there is a face in the input image or video. If there is a face, the feature data of the face will be obtained, the feature value will be calculated, and the face data will be compared with the existing face data to get the identity information of the face.Compared with other biometric technologies, face recognition technology is more convenient and fast. Users do not need to contact with the device intentionally or directly, and the device can obtain data by itself.But at the same time, compared with other biometric technology, face recognition technology is more vulnerable to environmental interference and errors, which requires human intervention and a large number of data support. At present, face recognition technology has been widely used in various scenes at home and abroad.

Keywords: Face recognition; biometrics; eigenvalues 

目录

1 绪论........................................................................................................................................ 1

1.1研究背景....................................................................................................................... 1

1.2研究目的及意义............................................................................................................. 1

1.3国内外的发展概况.......................................................................................................... 1

2设计原理与数据处理................................................................................................................. 2

2.1数据处理与人脸识别....................................................................................................... 3

2.1.1数据收集及训练................................................................................................... 3

2.1.2人脸识别............................................................................................................. 3

2.2设计原理及方案选择....................................................................................................... 4

2.2.1人脸识别技术...................................................................................................... 4

2.2.2本设计使用的haar分类器.................................................................................... 5

2.2.3 LBPH训练识别................................................................................................... 9

3环境搭建................................................................................................................................. 10

4 系统设计与实现...................................................................................................................... 12

4.1程序设计...................................................................................................................... 12

4.2 数据收集训练.............................................................................................................. 12

4.3人脸识别...................................................................................................................... 14

4.4 数据删除、查询........................................................................................................... 15

4.5管理员登录、登出和密码管理....................................................................................... 17

4.6主程序页面.................................................................................................................. 18

4.7程序打包...................................................................................................................... 18

4.8遇到的问题及解决........................................................................................................ 18

4.9存在问题和改进方向..................................................................................................... 19

4.9.1人脸识别的技术................................................................................................. 19

4.9.2 程序中存在的问题............................................................................................. 19

5系统测试................................................................................................................................. 20

5.1 测试环境及数据库配置................................................................................................. 20

5.1.1测试环境........................................................................................................... 20

5.1.2数据库配置........................................................................................................ 20

5.2 功能测试..................................................................................................................... 21

5.2.1 用户登陆功能测试用例.................................................................................... 21

5.2.1人脸识别测试.................................................................................................... 21

6结论....................................................................................................................................... 22

致谢.......................................................................................................................................... 24

参考文献................................................................................................................................... 25

附录.......................................................................................................................................... 26

1 绪论

1.1研究背景

人脸识别技术(Face Recognition Technology)是一种生物特征识别技术。生物识别技术是指通过计算机与光学、声学、生物传感器和生物统计学原理等高科技手段密切结合,利用人体固有的生理特性(如指纹、脸象、虹膜等)和行为特征(如笔迹、声音、步态等)来进行个人身份的鉴定,人脸识别技术即是通过获得人类面部的特征进行身份鉴定的技术。其主要功能包括人脸检测,人脸追踪以及人脸比对,即在动态场景与复杂背景中判断是否有面像存在并分离出这些面像,进行动态目标跟踪,同时在面像库中搜索人脸数据从而对检测到的人脸进行身份鉴定。目前,人脸识别技术在门禁、监控、相机等各种场景和环境下都有广泛的使用。

1.2研究目的及意义

人脸识别技术是一项现代人工智能技术中的的热门研究领域,它为人类社会发展的快速、便捷、安全等方面提供了保障。在当今社会中,从工作刷脸签到到购物刷脸支付再到公安刑侦,人脸识别技术都扮演了极其重要的角色。在这样的实际背景下,人脸识别技术的研究的重要性也就不言而喻了。在本设计中,主要实现人脸识别技术中的人脸检测追踪,人脸信息录入以及人脸身份识别等功能,最终可达到一对一实时人脸信息识别的效果,实际运用中,准确率可达75%作用。目前,人脸识别技术已经较为成熟,在国内外的各种场景中均有应用。本设计将人脸检测数据收集、人脸识别以及数据管理集成为一个系统。主要实现快速的进行人脸数据收集,实时进行一对一人脸检测,人脸数据的管理以及查询,便于管理人员对数据进行管理,同时,普通的用户可以自主进行识别的操作。

1.3国内外的发展概况

人脸识别技术是各个科技发达国家都在全力研究的技术之一。

人脸识别系统的研究大致在1960年左右开始进行。八十年代后,随着计算机科学技术和光学成像技术的进步,人脸识别技术也得到了提高。在九十年代后期,人脸识别技术进入了实际应用的初级阶段。进入二十一世纪后,人脸识别技术有了质的飞跃,如今已经在各个已经在政府、军队、银行、娱乐、电子商务、安全防务的那个领域有了较为深入的应用。

人脸识别技术是发展和使用为人类生活产生了深远的影响,它的普及对于人类提高工作效率、巩固安保措施、遏制犯罪行动等有极大的帮助。

在人脸识别技术带给人类便捷的同时,人脸识别技术也有一些弊端,首先在技术方面,人脸识别技术相对于其余的生物特征检测,更容易受到环境的影响出现误差而造成损失,一些人脸识别系统表示识别准确率高达98%以上,但是这些数据更多的是实验室数据,在实际应用中几乎难以实现,甚至一些系统出错率高达35%,如何提高准确率是人脸识别技术还需要深入解决的问题。

除了技术层面,人脸识别技术还有一个道德层面的问题存在,这源于人脸识别技术的一个优势——无接触检测。人脸识别技术是不需要人刻意去接触设备的,这也意味着可以在被检测者未知的情况是对被检测者进行人脸信息识别,如果是这种情况,那么人脸识别技术是否就是侵犯了人类的隐私权和肖像权。同时还有数据表示,人脸识别技术在实际使用中,肤色越黑,识别率越低,在黑色人种中的使用,出错率甚至达到了35%,与此同时,又是数据表明,目前的人脸识别数据库中有75%左右的数据是男性,80%以上来自于白色人种。以上的研究使得人脸识别技术的使用在道德方面是否存在种族歧视、性别歧视等问题上令人担忧。

2设计原理与数据处理

本设计是基于Python和opencv的人脸识别系统的开发,使用python+opencv调用计算机的摄像头设备获取图像,在使用opencv提供的人脸检测分类器对获得的图像中的人脸进行识别和数据获取。同时,使用Python的标准Tk GUI工具包的接口Tkinterz制作程序的用户操作界面,,最终呈现主程序界面效果如图2.1所示:


图2.1 程序主界面

2.1数据处理与人脸识别

   本次人脸识别系统的设计包括数据收集及训练功能,人脸识别功能,删除数据功能,查询数据功能,以及登录、登出管理员和更改密码功能。其中,数据收集及训练,删除数据以及查询数据需要管理员权限,而登录管理员需要密码,登录后登录管理员按钮会更换为修改密码。

2.1.1数据收集及训练

登录管理员之后可以进行数据收集和训练的操作,点击按钮之后系统会首先要求输入id,判断id有效且不重复之后可进行人脸数据收集,这里检测人脸使用的是opencv提供的分类器haarcascade_frontalface_alt2.xml进行人脸检测数据收集,其中的算法和原理在下文中介绍。为了节省空间,在数据收集完成并制作为.yml数据文件之后,会删除掉之前的图像文件。最后将存入的数据id保存到list.npy文件中,方便之后的查找删除操作。本次的人脸识别系统设计,将每一个人脸数据单独存放为一个.yml文件,比起所有数据都加入同一个数据文件中,删除和查找操作更方便和清晰。

2.1.2人脸识别

人脸识别功能是本系统中不需要管理员权限可直接运行的功能,开启功能后,程序调用计算机的摄像头,同样通过分类器haarcascade_frontalface_alt2.xml检测图像中的人脸及获取人脸数据,同时计算机读取已有的数据,将已有数据与摄像头上实时获取到的人脸数据进行对比,当对比结果判断出是已有的人脸时,在图像上显示出该人脸的信息,并显示判断正确的可能性,如图2.1.3所示:


图2.1.3 人脸识别

最后可以按esc退出人脸识别模块。

 

2.2设计原理及方案选择

2.2.1人脸识别技术

人脸识别的实质是依靠计算机图像处理技术从输入的媒体中提取人脸的特征点,再依靠生物统计学的原理进行数学模型的分析和建立,作为人脸特征模板。在检测时,使用已建立的人脸特征模板和被检测者的人脸中提取出的特征进行特征对比分析,根据分析结果得出相似度,判断是否为同一个人。

人脸识别的方法有很多种,比如:

(1)根据人脸几何特征进行识别的方法:几何特征是指人脸上的器官如眼睛,鼻子,嘴巴等之间的距离等几何关系。这种方法的识别的速度快比较快,占用内存资源较小,但是识别率比较低。

(2)基于特征脸(PCA)的人脸识别:这种方法是将人脸从三维的空间通过投影降维到二维空间,将这些投影作为用于识别的特征矢量。这种识别的方式要求相对更多的样本用于训练,这是基于图像灰度的特征统计。

(3)基于神经网络的人脸识别:神经网络的输入包含降低分辨率的人脸图像,局部的自相关函数、局部纹理的二阶矩等。同样需要大量的训练样本。

(4)弹性图匹配的人脸识别:这个方法将人脸使用属性拓扑图代替,拓扑图上的任意一点都包含特征向,用来记录周围的信息,在匹配时允许画面存在弹性,对存在表情改变的识别中有较好效果。同时这种方法对于同一人脸只需要单个样本训练即可。

(5)线段Hausdorff 距离的人脸识别:这种方法是将人脸的灰度图像划分为不同的线段集,不需要线段集之间线段的进行一一的对应,只通过两个线段集之间的距离来识别人脸。这个方法可以在不同光照和不同的状态的情况下进行较为准确的识别,但是对于存在大表情变化的识别效果不佳。

(6)支持向量机的人脸识别:这是统计模式识别领域的一个新热点,总的来说就是将一个低维的线性不可分问题转化为一个高维的线性可分问题。这种方法需要很多的的训练样本,并且支持向量机训练时间长,目前在实际使用中还不太可能。

2.2.2本设计使用的haar分类器

OpenCV提供了多个检测器,安装OpenCV后即可使用。

检测器的内容主要包括Haar-like特征、积分图方法、AdaBoost、级联。Haar分类器算法使用haar-like特征进行人脸检测,使用积分图对haar-like特征求值进行加速,使用AdaBoost算法来进行强分类器的训练,用以区分人脸和非人脸,最后使用筛选的方式将强分类器级联到一起,提高准确率。

(1)haar-like特征

Haar(哈尔)特征的特征模板由边缘特征、线性特征、中心特征和对角线特征组合而成。特征模板内由黑色和白色两种矩形组成,特征原型如图2.2.1所示:


图2.2.1 矩形模板

模板特征值等于白色矩形部分的像素和与和黑色的矩形部分的像素和的差。这些矩形特征能简单的对脸部的一些特征进行描述,比如:脸部的颜色相对于眼睛的更浅,鼻子比两边的颜色更浅等等。

对于图2.2.1上的a、b、d特征数值的计算,和对c的计算公式分别为公式2.2.1和公式2.2.2

     v=Σ白-Σ黑 (2.2.1)

v=Σ白-2*Σ黑 (2.2.2)

在c的特征计算中将黑色部分像素和乘以2,是为了让两种矩形部分中像素数目相等。我们希望计算当把矩形放到人脸区域时得到的特征值和计算放到非人脸区域得到的特征值之间的差距越大越好,这样就可以用来更加明显的分辨出是否是人脸。使用特征相较于单独使用像素点有更加优越的性能,更快的计算速度。

矩形特征值受矩形特征模板的类型、位置和大小的影响。矩形特征在图像上的位置、大小都可以改变的,这使得即使矩形的检测窗口非常小也会产生大量的矩形特征,比如在一个24*24像素大小的检测窗口中,可以得到的矩形特征数量就能高达16万个。要计算如此庞大数量的特征,就要靠haar分类器的另一个核心了。

(2)haar特征计算--积分图

积分图,顾名思义是一种使用积分的思想进行计算的方式。通过积分图,图像只需要被完整的读取一遍即可求出所有位置的像素,这种算法将计算图像特征值的效率进行了很大程度的提升。

积分图是将图像从起点开始到各个点所围成的矩形区域的像素值的和作为一个数组保存下来,当需要计算其中一个部分的像素之和时可直接在数组中搜索,不用再重新进行累加计算。积分图构建如图2.2.2所示:

 


图2.2.2 积分图示意

积分图每个点的计算方式是这个点的值ii(i,j)等于这个点左上角方向上的每一个像素的值之和,比如在2.2.2中点1的值等于A区域的像素值之和,点4的值等于区域A和区域D的像素值之和,点6的值等于区域A到F的像素值之和。每个像素区域像素值为f(i,j),则每个点的值为式2.2.3:

(2.2.3)

构建积分图时,先采用每行累加的方式进行,即式2.2.4:

s(i,j)=s(i,j-1)+f(i,j)                   (2.2.4)

在计算每个点的值,每个点的值等于当行的累计值加上上一行该列点的值,如式2.2.5所示:

ii(i,j)=s(i,j)+ii(i-1,j)                 (2.2.5)

这种计算方法,目标图像只需要遍历一遍之后便可得到每个点的值。

(3)特征值计算

通过构建积分图,接下来的特征值计算可以减少很多的工作量,从而提升效率。

构建好积分图之后,需要计算特征值的时候就不再需要去求区域像素和,直接用点进行计算即可,如图2.2.3:


图2.2.3 计算特征值

在图2.2.3中将区域E和区域F作为一个矩形,计算它的特征值时,需要用F区域像素值减去E区域像素值,若没有积分图时,需要逐个计算区域F和区域E的像素值,但是一次检测中有大量这样的特征值需要计算,每次都这样去计算的话,需要消耗大量的时间和资源,但是有积分图之后计算区域F的像素和就可以直接通过点的值去计算,如:F区域像素和,式2.2.6:
S(F)=ii(6)-ii(5)-ii(3)+ii(2)      (2.2.6)

同理,式2.2.7:

S(E)= ii(5)-ii(4)-ii(2)+ii(1)            (2.2.7)

这样计算之后EF矩形区域特征值,式2.2.8:

S(f)-S(E)= ii(6)-ii(5)-ii(3)+ii(2)-(ii(5)-ii(4)-ii(2)+ii(1))  (2.2.8)

通过积分图计算的方式每个特征区域就都可以通过很简单的计算得到,大大提升了计算特征值的效率,同时也提高了检测目标的速度。

不同的特征在同一个的样本中计算会出现不同的结果,这样的结果就可以区分出人脸是否存在,或者人脸上的眼睛鼻子嘴巴等器官的位置。不同模板计算出来的结果差异越大,效果也好。由于这样计算出来的特征值上下幅度较大不利于比较,所以检测器中还会对特征值进行归一化处理,处理后的数据再与阈值比较得出最后的结果,即人脸的存在与否。

(4)级联分类器

每一个输入的样品中都有非常多的特征值,要通过这些特征值准确的检测和识别出人脸就需要使用级联分类器了,只有通过级联分类器的每一次判断,最后才会认定为检测出人脸或者识别出人脸。级联分类模型是树状结构,如图2.2.4所示:


图2.2.4 级联分类器

每一个stage都是一个强分类器,只有目标依次通过了每一个强分类器时,才认为通过此次的检测,强分类器对于负样本的检测效率非常高,能够很大程度的检测出负样本,在任何一个分类器检测为负样本都会结束本次检测,后面的强分类器不再检测,从而提高检测效率。一个图像样本中,非目标的区域会占很大的比例,换句话说,一个图像中很多的检测区域都属于负样本,在第一个分类器时就会被否决,通过这种方式,避免了很多不必要的资源浪费。

每一个强分类器是由若干个弱分类器通过一定的策略组合在一起,一个弱分类器是一个和图2.2.4相差无几的决策树,其中,只拥有一个haar-like特征的弱分类器称为最基本的弱分类器,它的决策树只有一层,称为树桩(stump)。

另外,每个特征对于检测结果的影响是不同,所以在分类器在检测特征时会对特征进行加权运算。首先会筛选出若干个优秀的特征值,作为最优弱分类器,然后传给AdaBoost进行训练。通过训练得出特征的最优阈值,使得这个弱分类器对所有的训练样本的分类误差最低。

2.2.3 LBPH训练识别

设计中采用LBPH(Local Binary PatternsHistograms)局部二进制编码直方图进行人脸训练和识别,在使用haar分类器检测出人脸后,用局部二进制编码直方图获得该人脸的特征并进行训练,训练后可以得到图像数据和图像对应的标签。LBPH进行人脸识别的基本思想大致是将每个像素作为中心,计算该像素和其附近的像素灰度值的大小关系,再将这个关系以二进制进行编码,比该像素灰度值小的像素点编的为0,比该像素灰度值大像素点的为1,这样就可以得到对整个图像进行LBP编码的图像;接着将LBP图像划为若干个部分,分别得到每个部分的LBP编码直方图,这样就得到了整个图像的LBP编码直方图,最后经过比较不同的人脸图像的LBPH达到人脸识别的目的,原始编码示意图如2.2.5所示:


图2.2.5 原始LBP示意图

在原始LBP出现后,编码方式不断地优化改进,又有了圆形LBP,如图2.2.6:


图2.2.6 圆形LBP

圆形LBP在原始LBP的基础上将原本的3*3邻域扩大到了任意邻域,用圆形取代原有的正方形,在半径内允许有任意数量个的像素点。OpenCV正是采用的这种圆形LBP算子。

本设计就是调用了OpenCV提供的haarcascade_frontalface_alt2.xml检测器,通过摄像头收集图像样本使用局部二进制编码直方图进行对检测器检测出的人脸进行特征训练,训练完成后保存为.yml文件数据。使用时,通过实时读取摄像头的画面,检测出画面上的人脸,再用LBP算子求出该人脸的特征,最后调用predict函数,这个函数返回两个值,一是识别出的人脸的标签,二是置信度评分。算法有置信度评分阈值,置信度评分是用来表示目标与模版中的差距,当置信度的值为0时表示完美匹配,置信度的值小于50时,可以认为识别效果较好。此外Opencv还提供有其他的haar检测器,在不同的检测需求下可以调用不同的检测器。

 

3环境搭建

人脸识别系统自然需要摄像头,本设计是基于python+opencv的开发实现所以首先需要搭建python的环境。

首先安装python3.7,现在已经有了python3.8,但是在我实际的使用中,发现一些在python3.7中可以进行的操作在python3.8中无法进行。安装好python3.7后检查是否安装成功,如图3.1:


图3.1 检查python安装

接着继续安装opencv,我在搭建环境时使用的是pip安装,但是pip因为源文件在国外,所以下载速度太慢而且容易有异常,经过查阅资料我配置了清华的镜像文件,如图3.2:


图3.2 配置pip镜像文件

接着就可以快速稳定的使用pip进行下载安装了,安装opencv,如图3.3:


图3.3 安装OpenCV

同时还需要python图像处理包pillow和opencv扩展包分别如图3.4和图3.5:


图3.4 安装pillow


图3.5 安装OpenCV-contrib-python

numpy之类的python包在安装python的时候已经自动装上了,这样目前需要文件程序都已经安装好了。

 

4 系统设计与实现

4.1程序设计

人脸识别,首先需要能够检测出人脸,上文中已经较为详细的介绍了haar特征的原理,这里直接调用了haarcascade_frontalface_alt2.xml检测器。

在设计开始时,我是先开始实现各个功能,在各个功能都大致完成之后在写的主程序,再在主程序中调用各个功能。在功能和调用都没有问题之后开始制作用户操作页面,最后添加的管理员登录以及一些细小的优化

4.2 数据收集训练

首先我实现的是调用摄像头进行人脸数据的收集及训练数据功能。这个功能的实现思路是:在有管理员的条件下,首先输入需要录入者的id信息,这里要求不能与已有的id重复,也不能输入空白。在符合要求之后将输入的id存入主程序中提供的列表中,并将列表保存到本地,在之后的使用中,若未删除该id和对应的人脸数据,该id可一直存在;接着打开摄像头,使用haarcascade_frontalface_alt2.xml对人脸进行检测,检测到人脸之后会在人脸上画出方框,同时从摄像头获得的图像中按帧读取图片,并将图片转化为灰度图片,以User.id.编号.jpg的形式格式命名保存在Facedata文件夹中,方便分类器的特征值获取。为了节约时间,本设计中获取的是200个样本,要提高精确度可适当增多获取样本数量,但是会增加时间,代码如图4.1:


图4.1 数据获取

收集好需要用于训练的图片之后就可以开始训练了。首先导入收集到的图片所在的文件夹Facedata,调用haarcascade_frontalface_alt2.xml和局部二进制编码直方图进行图片中的人脸检测和特征数据的获取与训练,将训练好的数据存放在face_trainer文件夹中,这里因为没有找到合适的方式能够在后续处理.yml文件,所以我将每个人脸数据都训练为一个单独的.yml文件,这样在后续需要删除时可以直接将文件删除。考虑到每次训练都需要大量的图片,若不处理会占用大量的储存空间,所以在训练完成后会将Facedata文件夹整个删除,然后会重新新建一个Facedata文件夹供下次使用。最后将添加id后的列表列表保存到本地。代码如图4.2:


图4.2 数据训练

4.3人脸识别

在人脸识别时同样需要进行人脸检测,所以在开始运行之前需要先引入haar分类器和LBPH进行检测和特征提取。因为考虑到人脸识别的过程是需要占用内存资源的,但是如果系统中本身是没有数据的,这时候再去运行人脸识别的话就浪费了内存资源,所以在选择程序的人脸识别功能的开始,会首先判断是系统里是否已经存在了数据,如果有数据就继续接下来的程序,打开摄像头。如果没有数据的话,就会跳出‘当前无数据!’的提示,然后中断本次的所有操作,返回主程序的界面,实现代码如下图4.3:


图4.3判断是否有数据

在判断为有数据之后,会打开摄像头,导入第一个.yml文件,进行人脸检测,检测出人脸后在人脸上画框。同时,获取摄像头得到的人脸的特征,将其与第一个.yml文件中的数据对比,若没有得到结果或者得到了置信度高于50的结果,则认为该.yml文件中的数据与这个人脸的特征数据不对应,即本次的识别失败,紧接着立刻读取下一个.yml文件中的特征数据,若依然没有读取到符合要求的数据,就会循环读取face_trainer文件夹中的.yml文件,若读取到符合的.yml文件则不会继续再读取下一个.yml文件,并显示出当前人脸的数据,同时以(100-置信度)的形式表示正确可能性在摄像头窗口显示出来。当摄像头上读取到其他人不与当前的.yml文件数据相符的人脸的时候,系统会继续往后读取.yml文件,重新开始循环读取的过程。识别进行是可通过按Esc按键退出,实现代码如图4.4:


图4.4人脸识别实现

4.4 数据删除、查询

在设计的开始,我都是直接删除数据文件,没有考虑到需要在程序中删除数据,后来在程序完成之后才想到在实际运用中数据需要更新的,有新数据加入就一定需要能够删除数据,但是在查阅资料之后没有找到一种能够方便的操作.yml文件的方法。所以我改变了数据的结构,由于.yml文件中的数据操作起来不方便,所以在之前的数据收集时,我便将每个人脸数据制作为了一个单独的.yml文件,同时将数据的id在列表中的序号和其对应.yml文件的文件名相对应,这样在删除数据时,可同时将列表中的id和其对应的.yml文件一起删除,系统中就不在存在该数据了,删除数据代码实现如图4.5:


图4.5 删除数据

数据查询只需要输入需要确定是否存在的数据即可,也可以直接查询全部数据,实现如图4.6:


 

4.5管理员登录、登出和密码管理

系统中既然有数据操作,要保证数据的安全和完整就需要权限的分配,不能让无权限的人随意的对系统的数据进行添加和删除,所以引入了管理员系统,本设计中的管理员系统很简单,引入参数OK,初始为0没有管理员权限。在需要数据操作时点击管理员登录输入密码就可以获得管理员权限,将OK值变为1,管理员密码以文本形式存放在电脑中,登录时打开文本验证密码。在登录管理员后,主程序页面的管理员登录按钮随即变为修改密码按钮,这时候可以修改密码,修改后的密码存入password.txt文件。登出管理员将OK的值变为0.在需要的管理员权限的功能中都会验证OK的值。实现代码如下图4.7:


图4.7 管理员登录和删除

4.6主程序页面

主程序页面使用tkinter制作,首先是建立了上述功能中需要的列表,同时寻找根目录中是否存在已有列表,如果已有,就让新建的列表获得已有列表的值,接下来通过多个按钮调用上述的功能,实现代码如图4.8:


图4.8 主程序页面

OK和name列表作为全局参数在各个功能中调用。

4.7程序打包

作为一个系统不可能让用户每次都进入代码去运行程序,所以最后需要将程序打包为一个exe可执行文件。Python文件打包为exe可以使用pyinstaller程序,这个程序可以通过pipinstall pyinstaller安装,安装完成之后,在cmd窗口进入python代码文件所在的目录使用命令pyinstaller -F –w face.py打包即可。

 

4.8遇到的问题及解决

在设计的初期,我使用的haar分类器是haarcascade_frontalface_default.xml,这是一个轻量级的分类器,它的特征值计算程度和级联的强分类器都极其有限,所以在使用时常会出现无法检测到人脸或者检测出错的情况,经过尝试后发现分类器haarcascade_frontalface_alt2.xml在使用中展现出来的检测效果是要明显的好于haarcascade_frontalface_default.xml,所以我在设计中将后者default.xml更换为了alt2.xml。

在最后打包好程序之后,双击.exe运行程序的时候,程序会闪退,我在文件的末尾加入了input()函数,发现程序不是没有执行,而是已经执行完了,因为在主程序页面中没有点击按钮,所有没有停顿,直接运行到了结束,后来我在主程序中使用了while(1)使主程序进行循环,但是这样的结果是每次循环都会在主程序页面的按钮加倍。经过在网络上寻找解决方案,我发现了tkinter的mainloop()函数,这个函数会使我的主程序在循环中接受事件之后刷新一次,这也解决了管理员登录按钮和更改密码在同一个位置不同情况下使用的问题。

4.9存在问题和改进方向

4.9.1人脸识别的技术

在人脸识别技术上,本设计和很多人脸识别系统中都有一个共有的问题,人脸识别的效果很容易受到环境的影响,在不同环境中识别的结果可能会出现不同。想要提高人脸识别的准确率只是提高用于训练的样本数量是完全不够的,这需要改进人脸识别的算法,想办法将复杂环境对于机器获得人脸特征的影响降低,让光、表情、头发等无法完全排除掉的因素对于特征对比时产生的误差降到足够低,这是人工智能领域需要研究和该改进的一个热点。

除了环境的影响,本设计中使用的检测和识别方法是基于二维平面的检测识别,换句话说,一张平面的照片里的人脸可能也会别识别为真正的人脸,所以这存在一定的风险,在后续需要提升摄像头读取图像的方式和能力,以三维的方式去获得人脸数据和特征,这样才能有效避免使用照片进行识别的情况。

4.9.2 程序中存在的问题

设计中将特征.yml文件按照人脸制作为不同的的文件虽然在使用中方便了后续的删除等操作,但是会占用更多的内存和时间用于去读取文件,在后续的改进中,需要使用一种便于操作的文件格式来保存特征数据,或者找到操作.yml的方法,将所有的特征数据文件整合到一起,这样只需要调用一次之后就可以进行后续的所有识别。

本次程序的管理员功能制作比较简单,密码也只是以文本文件的形式保存在根目录,在实际使用的话,需要对密码进行加密处理,不能让密码以明文的方式暴露在用户面前,list.npy文件和Face_trainer文件夹也是同样,需要进行一些特殊处理,避免用户跳过程序直接对数据进行操作。

5系统测试

5.1 测试环境及数据库配置

5.1.1测试环境

Windows7及其以上版本,Linux环境为Centos7.3及以上版本,并安装相关浏览器;Web应用服务器Nginx1.6及其以上,在Nginx的安装目录下找到conf文件夹,找到nginx.conf文件,使用文本编辑器打开,root属性指在运行时要请求的urldist-bolg;属性指项目所在的路径位置;Python运行时环境Python2.7及其以上版本;数据库系统PostgreSQL9.3标准版。

5.1.2数据库配置

def __init__(self, sql):

      self.sql = sql

    def mysql_connect(self):

        import MySQLdb

        import   MySQLdb.cursors

        db = MySQLdb.connect("", "", "", "", charset='utf8', cursorclass = MySQLdb.cursors.DictCursor )

        cursor = db.cursor()

        cursor.execute(self.sql)

        data = cursor.fetchall()

        db.close()

        return data

 

5.2 功能测试

5.2.1 用户登陆功能测试用例

1、测试方案

用户登录系统时,要输入用户名和密码,且输入用户名和密码不能为空,用户名长度不能超过16个字符;所输入用户名和密码必须是被注册过的用户。

2、测试用例

 

5.1用户登录测试用例

序号

输入数据

预期结果

实际结果

结果

分析

1

账号:admin@qq.com

密码:123456

登录成功

登录成功

输入正确,登录成功

2

账号:user@qq.com

密码:123456

登录成功

登录成功

输入正确,登陆成功

3

账号:adf

密码:123456

登录失败

登陆失败

用户名不存在

4

账号:admin@qq.com

密码:111111

登录失败

登录失败

密码错误

 

5.2.1人脸识别测试

点击人脸识别按钮,出现摄像头窗口,检测到人脸并预测出结果之后在左上方显示对应的id,在右下方显示置信度,如图5.2.9:

图5.2.9 人脸识别

 

系统测试主要是判断系统是否可以正常运行,功能模块是否可以实现操作。程序代码中是否有错误出现。测试程序是开发过程中的一个主要问题。就算系统完成的再好,再进行程序测试时也会也会发现一个重来没有被发现的错误信息。

6结论

人工智能是现代科技发展的一个热点,人脸识别是人工智能领域的研究热点,它包括了统计学,生物学等多个领域的知识,在人类发展中占有极其重要的地位。

人脸识别在实际中使用的功能非常广泛,本设计只是实现了一小部分的功能。完整的人脸识别主要包括十个关键的技术: 人脸检测(Face Detection)、人脸配准(Face Alignment)、人脸属性识别(Face Attribute)、人脸提特征(Face Feature Extraction)人脸对比(Face Compare)、人脸验证(Face Verification)、人脸识别(Face Recognition)、人脸检索、人脸聚类(Face Cluster)、人脸活体(Face Liveness)。人脸检测就是指检测出图像中的人脸,可通过限制一次检测出的人脸,限制最小脸大小,限制输入图像尺寸等方式加速检测,设计中实现了此功能;人脸配准是指检测出人脸上的器官在人脸上的位置,这是基于人脸检测上的功能,在实现人脸检测的基础上要做到人脸配准较为容易,本设计主要是识别人脸,没有必要对人脸器官进行定位所以没有设计该功能;人脸属性识别是指通过人脸识别得到目标的表情,性别,年龄等属性的功能,这个功能实现起来十分复杂,每一个属性都是不同的算法,本设计中没有实现;人脸提特征即是将人脸图像转化为一连串的特征数据,每张不同的人脸的特征数据特征必然是不同的,这个技术也是本设计的核心;人脸对比是指比较两张脸之间的相似度,是通过输入两张脸的特征值,比较特征值之间的差异,设置一定的阈值,当相似度达到阈值是认为识同一张人脸,在本设计中的LPBH主要就是用来进行这一过程,后面的人脸验证、人脸识别、人脸检索、人脸聚类都是基于人脸对比的衍生;最后的人脸活体是指判断进行人脸检测识别的目标是真人还是假体(照片、视频等),人脸活体不单是算法的实现,它更着重于的是解决问题。

本设计最终通过python实现了人脸检测、数据训练、人脸识别、数据管理的功能,但是本设计在实际的使用中依然有极大的局限性,若出现较大的环境或者表情变化识别率会产生较大变化,同时在人脸活体的方面存在缺陷,无法识别出目标是否是真人。总的来说,本次的设计虽然实现了人脸识别,但依然只处于十分低级的阶段,还有很多的内容和功能需要优化和改进。

通过本次的设计,加深了我对于人脸识别技术乃至于人工智能技术的了解,同时对于人工智能在人类社会中的使用也有了更多的了解。在python编程以及python的第三方库的使用能力上也有了极大的提升。

致谢

长达数月的毕业设计在这里就要结束了,同时这也意味着我在学院为期四年的学习生活也步入了尾声,在即将离别之际,这里我要向所有给我帮助的人致以诚挚的谢意!

首先,我要感谢我的导师,同时我要感谢我在大学期间的每一位同学,每一位授课教师,尤其是我的室友。感谢每一位老师在给我们的上课期间为我们付出的一切。感谢我的同学和室友给我了很多的帮助,作为一个外省的学生,是他们让我在离家的期间并不觉得陌生和孤单!最后,我要感谢我的父母,感谢我的父母在我成长的过程中给了我无限的关爱和帮助,感谢他们总是在我的身后默默支持着我,让我有勇气去面对一切的未知和挑战,感谢他们让我学会了成长!

标签: python论文 计算机论文

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

客服微信:jie5527c点击复制并跳转微信