基于Python和openCV的人脸识别研究与实现.docx

上传人:b****5 文档编号:30715211 上传时间:2023-08-19 格式:DOCX 页数:48 大小:1.69MB
下载 相关 举报
基于Python和openCV的人脸识别研究与实现.docx_第1页
第1页 / 共48页
基于Python和openCV的人脸识别研究与实现.docx_第2页
第2页 / 共48页
基于Python和openCV的人脸识别研究与实现.docx_第3页
第3页 / 共48页
基于Python和openCV的人脸识别研究与实现.docx_第4页
第4页 / 共48页
基于Python和openCV的人脸识别研究与实现.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

基于Python和openCV的人脸识别研究与实现.docx

《基于Python和openCV的人脸识别研究与实现.docx》由会员分享,可在线阅读,更多相关《基于Python和openCV的人脸识别研究与实现.docx(48页珍藏版)》请在冰豆网上搜索。

基于Python和openCV的人脸识别研究与实现.docx

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

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

摘要

人脸识别技术(FaceRecognitionTechnology)是对输入的图像或者视频进行判断是否存在人脸,若存在人脸,则获取该人脸的特征数据,计算特征值,并将人脸数据与已有的人脸数据进行比较,从而得出该人脸的身份信息。

人脸识别技术相对于其他生物特征识别技术而言,具有更加快捷方便的特性,用户不需要特意或者直接与设备接触,设备便可自行获取数据。

但同时,人脸识别技术和其他生物识别技术相比,更容易被环境的因素干扰从而出现错误,需要人为干预以及大量的数据支撑。

目前,人脸识别技术在国内外的各中环境中都被广泛使用。

关键词:

人脸识别;生物特征识别技术;特征值

ResearchandimplementationoffacerecognitionbasedonPythonandopencv

Abstract

Facerecognitiontechnologyistojudgewhetherthereisafaceintheinputimageorvideo.Ifthereisaface,thefeaturedataofthefacewillbeobtained,thefeaturevaluewillbecalculated,andthefacedatawillbecomparedwiththeexistingfacedatatogettheidentityinformationoftheface.Comparedwithotherbiometrictechnologies,facerecognitiontechnologyismoreconvenientandfast.Usersdonotneedtocontactwiththedeviceintentionallyordirectly,andthedevicecanobtaindatabyitself.Butatthesametime,comparedwithotherbiometrictechnology,facerecognitiontechnologyismorevulnerabletoenvironmentalinterferenceanderrors,whichrequireshumaninterventionandalargenumberofdatasupport.Atpresent,facerecognitiontechnologyhasbeenwidelyusedinvariousscenesathomeandabroad.

Keywords:

Facerecognition;biometrics;eigenvalues

1前言

人脸识别技术(FaceRecognitionTechnology)是一种生物特征识别技术。

生物识别技术是指通过计算机与光学、声学、生物传感器和生物统计学原理等高科技手段密切结合,利用人体固有的生理特性(如指纹、脸象、虹膜等)和行为特征(如笔迹、声音、步态等)来进行个人身份的鉴定,人脸识别技术即是通过获得人类面部的特征进行身份鉴定的技术。

其主要功能包括人脸检测,人脸追踪以及人脸比对,即在动态场景与复杂背景中判断是否有面像存在并分离出这些面像,进行动态目标跟踪,同时在面像库中搜索人脸数据从而对检测到的人脸进行身份鉴定。

目前,人脸识别技术在门禁、监控、相机等各种场景和环境下都有广泛的使用。

1.1本设计的目的、意义及应达到的技术要求

人脸识别技术是一项现代人工智能技术中的的热门研究领域,它为人类社会发展的快速、便捷、安全等方面提供了保障。

在当今社会中,从工作刷脸签到到购物刷脸支付再到公安刑侦,人脸识别技术都扮演了极其重要的角色。

在这样的实际背景下,人脸识别技术的研究的重要性也就不言而喻了。

在本设计中,主要实现人脸识别技术中的人脸检测追踪,人脸信息录入以及人脸身份识别等功能,最终可达到一对一实时人脸信息识别的效果,实际运用中,准确率可达75%作用。

1.2本设计在国内外的发展概况及存在的问题

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

人脸识别系统的研究大致在1960年左右开始进行。

八十年代后,随着计算机科学技术和光学成像技术的进步,人脸识别技术也得到了提高。

在九十年代后期,人脸识别技术进入了实际应用的初级阶段。

进入二十一世纪后,人脸识别技术有了质的飞跃,如今已经在各个已经在政府、军队、银行、娱乐、电子商务、安全防务的那个领域有了较为深入的应用。

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

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

除了技术层面,人脸识别技术还有一个道德层面的问题存在,这源于人脸识别技术的一个优势——无接触检测。

人脸识别技术是不需要人刻意去接触设备的,这也意味着可以在被检测者未知的情况是对被检测者进行人脸信息识别,如果是这种情况,那么人脸识别技术是否就是侵犯了人类的隐私权和肖像权。

同时还有数据表示,人脸识别技术在实际使用中,肤色越黑,识别率越低,在黑色人种中的使用,出错率甚至达到了35%,与此同时,又是数据表明,目前的人脸识别数据库中有75%左右的数据是男性,80%以上来自于白色人种。

以上的研究使得人脸识别技术的使用在道德方面是否存在种族歧视、性别歧视等问题上令人担忧。

1.3本设计应解决的主要问题

目前,人脸识别技术已经较为成熟,在国内外的各种场景中均有应用。

本设计将人脸检测数据收集、人脸识别以及数据管理集成为一个系统。

主要实现快速的进行人脸数据收集,实时进行一对一人脸检测,人脸数据的管理以及查询,便于管理人员对数据进行管理,同时,普通的用户可以自主进行识别的操作。

2本设计

本设计是基于Python和opencv的人脸识别系统的开发,使用python+opencv调用计算机的摄像头设备获取图像,在使用opencv提供的人脸检测分类器对获得的图像中的人脸进行识别和数据获取。

同时,使用Python的标准TkGUI工具包的接口Tkinterz制作程序的用户操作界面,,最终呈现主程序界面效果如图2.1所示:

图2.1程序主界面

2.1各功能介绍

本次人脸识别系统的设计包括数据收集及训练功能,人脸识别功能,删除数据功能,查询数据功能,以及登录、登出管理员和更改密码功能。

其中,数据收集及训练,删除数据以及查询数据需要管理员权限,而登录管理员需要密码,登录后登录管理员按钮会更换为修改密码。

2.1.1主界面

进入程序首先是主界面,并且没有管理员权限。

程序开始后会先判断是否有数据,如无数据进行部分操作时会直接提示当前无数据,如图2.1.1所示:

图2.1.1无数据

主界面设置有六个按钮,每一个按钮对应一个函数,点击按钮可调用不同功能,在无管理员权限时点击数据收集及训练、删除数据、查询数据时,会提示暂无管理员权限,如图2.1.2所示:

图2.1.2无权限

2.1.2数据收集及训练

登录管理员之后可以进行数据收集和训练的操作,点击按钮之后系统会首先要求输入id,判断id有效且不重复之后可进行人脸数据收集,这里检测人脸使用的是opencv提供的分类器haarcascade_frontalface_alt2.xml进行人脸检测数据收集,其中的算法和原理在下文中介绍。

为了节省空间,在数据收集完成并制作为.yml数据文件之后,会删除掉之前的图像文件。

最后将存入的数据id保存到list.npy文件中,方便之后的查找删除操作。

本次的人脸识别系统设计,将每一个人脸数据单独存放为一个.yml文件,比起所有数据都加入同一个数据文件中,删除和查找操作更方便和清晰。

2.1.3人脸识别

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

图2.1.3人脸识别

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

2.1.4删除数据、查询数据

这两项操作需要管理员权限。

查询数据时,可输入id,查看数据是否存在,也可直接查看所有已存在的id,在系统没有录入任何数据时,会直接提示暂无数据。

删除数据时,获得管理员权限后,可以输入需要删除的数据的id,操作之后会同时删除数据文件和列表中的id,若无该id,则直接返回无此id,如图2.1.4所示:

图2.1.4删除无效

2.1.5管理员登录登出以及修改密码

在刚刚打开程序,进入系统时是任何人都是没有获得管理员权限的,需要点击登录管理员按钮获得,点击登录管理员之后需要输入密码进行验证,如图2.1.5所示:

图2.1.5登录管理员输入密码

登录管理员后,可进行数据管理操作,同时登录管理员按钮更改为修改密码按钮如图2.1.6所示:

图2.1.6登录管理员后按钮变为修改密码

此时可以修改密码。

在管理员进行管理操作完成之后,需要点击登出管理员关闭管理员权限,修改密码按钮恢复为登录管理员按钮,同时管理操作无法再进行。

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算法来进行强分类器的训练,用以区分人脸和非人脸,最后使用筛选的方式将强分类器级联到一起,提高准确率。

2.2.2.1haar-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.2.2.2haar特征计算--积分图

积分图,顾名思义是一种使用积分的思想进行计算的方式。

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

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

积分图构建如图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)

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

2.2.2.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)

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

不同的特征在同一个的样本中计算会出现不同的结果,这样的结果就可以区分出人脸是否存在,或者人脸上的眼睛鼻子嘴巴等器官的位置。

不同模板计算出来的结果差异越大,效果也好。

由于这样计算出来的特征值上下幅度较大不利于比较,所以检测器中还会对特征值进行归一化处理,处理后的数据再与阈值比较得出最后的结果,即人脸的存在与否。

2.2.2.4级联分类器

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

级联分类模型是树状结构,如图2.2.4所示:

 

图2.2.4级联分类器

每一个stage都是一个强分类器,只有目标依次通过了每一个强分类器时,才认为通过此次的检测,强分类器对于负样本的检测效率非常高,能够很大程度的检测出负样本,在任何一个分类器检测为负样本都会结束本次检测,后面的强分类器不再检测,从而提高检测效率。

一个图像样本中,非目标的区域会占很大的比例,换句话说,一个图像中很多的检测区域都属于负样本,在第一个分类器时就会被否决,通过这种方式,避免了很多不必要的资源浪费。

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

另外,每个特征对于检测结果的影响是不同,所以在分类器在检测特征时会对特征进行加权运算。

首先会筛选出若干个优秀的特征值,作为最优弱分类器,然后传给AdaBoost进行训练。

通过训练得出特征的最优阈值,使得这个弱分类器对所有的训练样本的分类误差最低。

2.2.3LBPH训练识别

设计中采用LBPH(LocalBinaryPatternsHistograms)局部二进制编码直方图进行人脸训练和识别,在使用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进行检测和特征提取。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1