张绿云 韦肖雨 李琳
摘要:该文中的人脸识别系统是利用Python语言编程以及使用OpenCV库调取摄像头完成人脸图像的采集与识别。利用OpenCV库基于局部特征的人脸算法、Haar-like特征以及人脸检测器模型级联分类器对给定的人脸图像进行检测训练分析,从而获取匹配度最高的脸部特征数据信息,进而实现人脸识别。
关键词:Python;OpenCV;人脸检测;人脸识别
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)10-0087-02
随着信息化时代快速发展,人们的个人信息安全面临威胁,人们急需寻找有效的身份验证途径,过去通过使用证件验证身份信息已不适用于现在高科技快速发展的时代。通过专家的不断研究,作为全新的身份识别技术出现的生物识别慢慢成为信息化时代身份识别最主要的技术。生物识别技术主要是通过一些生物特征去实现的识别技术,例如:人脸、指纹等,这样的特征不容易被伪造。人脸识别是生物识别技术的一种,占有极为重要的地位,应用领域广泛。
1 人脸识别系统实现原理
(1) 加载目标检测模块CascadeClassifier。CascadeClassifier是OpenCV下objdect模块中用来做目标检测的级联分类器的一个类,支持Haar-like特征的目标检测器。
face =cv2.CascadeClassifier('./face/face_xml/haarcascade_ frontalface_default.xml');
(2) 调用摄像头,转换灰度图片。通过调用VideoCapture函数调用电脑的摄像头cap=cv2.VideoCapture(0,cv2.CAP_DSHOW),把攝像头拍到的人像通过read()函数赋给img。在已知img后通过cvtColor()函数将图片转换为灰度。gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY),因为特征提取针对灰度图像,所以需要进行转换。彩色图像分为R、G、B三个分量表达三个基色,每一个分量有256个灰度级。通过VideoCapture函数得到照片,获取RGB分量值,再通过cvtColor函数计算像素灰度值,最后得到灰度图像。
(3) 训练器的使用。基于LPB创建人脸识别特征提取训练器,将训练结果的模型参数写入YML格式文件,该文件是可以直观地被电脑识别的数据序列化格式。进行识别时,训练器可直接读取文件内容。LBP是针对图像局部提取纹理特征的方法。其原理是将已知人脸图像进行预处理,记录下相对应的人脸图像的局部特征,记录每个特征之间的投影向量,写入数据库。再对未知的人脸进行预处理,使得原始人脸图像通过之前得到的投影向量向选中的人脸空间做变换,随后定义一个分类判别函数,该函数将表述为未知的人脸的图像的局部特征与之前已经记录好的人脸的数据库中相对应的局部特征之间的距离,并且以此距离为依据,计算出人脸特征最小的分类错误率,进行特征融合后根据得到的结果便可以进行有效识别[1]。
(4) PyQt5窗口控件QtWidgets图形界面的使用。在图形界面与早时候的命令行界面相比较之下,用户更喜欢视觉上的简易明了。编写该窗口作为人脸识别的载体,在该窗口点击登录就可以访问到用户在整个人脸识别系统中的所有服务,实现后续一系列的功能,图形界面承担了与用户之间的功能交互。
2 人脸识别开发工具介绍
OpenCV是一个开放源代码的计算机视觉库,应用在很多领域上并且是可以跨平台的,但它主要应用在计算机视觉方向。OpenCV包含有非常多的函数,可以高时效地实现计算机视觉绝大多数的通用算法[2],其中OpenCV 包含的图像处理函数基本上包含了图像需要处理的每个方面,例如:图像和视频的输入输出、基本的数字图像处理、基本的图像与视频显示矩、各种动态数据结构等[3] 。
OpenCV的类FaceRecognizer提供了三种实现人脸识别的方法:EigenFace(基于PCA的特征脸算法) 、FisherFace(基于LDA的Fisher脸算法) 、LBPHFace(基于局部特征的人脸识别算法) [4]。本次人脸识别的方法是用LBPHFace实现的,系统是使用Python实现,Python调用OpenCV,OpenCV调用C++接口,接口调用摄像头驱动才打开摄像头。
Numpy库是标准的数据处理分析工具,是Python实现数据排列、矢量计算以及高效率的计算分析工作的帮助工具。Numpy库的最主要作用是分析基本的数据,没有包括其他什么高级的功能。尽管如此,只要能掌握好Numpy库的理论知识和应用,也能够很好地将其分析数据的作用优势发挥到极致[5]。
3 人脸识别的实现过程
3.1 人脸识别系统的基本框架设计
人脸识别系统的框架设计模式根据人体交互的原理实现,操作简易明了,本次人脸识别通过使用OpenCV调用摄像头实现人脸识别。
(1) 登录模块:图形界面登录模块是实现人脸识别系统用户间交互的关键,登录成功进去后可以实现各功能,否则将无法实现人脸识别。
(2) 采集人脸:首先添加检测人脸的id和姓名,使输入的信息与待检测的人脸信息绑定,同时加载好haarcascade_frontalface_default.xml检测脸的模型,用于功能训练。使用OpenCV调取摄像头检测人脸需确保能检测到人脸。检测到的人脸需用矩形框框起来从而保证采集到的图像坐标大小都一样,并且需要检测多次才能确定人脸信息,同时设置好时间间隔获取每一帧图像并将图像转换成灰度图片并保存到facedata文件夹里。
(3) 训练/学习:通过使用已经加载好的人脸训练器对facedata文件夹里人脸信息进行人脸训练学习,首先对人脸特征进行提取,然后将所获取的人脸特征保存到.yml文件里,以便识别人脸时特征比对。
(4) 人脸识别:首先调用摄像头确保人脸在摄像头范围内,让摄像头能捕获到人脸,先设置好时间间隔获取每一帧图像且要同时把它转换成灰度图像。再创建一个训练器以及加载脸的加载器,本文使用 LBP局部二值直方图的算法和加载器对捕获的图片确保为人脸,若检测到的是人脸,则用与采集人脸时一样大小的矩形框框起来,方便人脸的特征进行比对。将捕获的人脸图像特征与.yml文件里保存的人脸数据特征进行遍历对比识别得到一个相似度,再根据相似度得出匹配度最高的图片的人脸数据信息,最后将匹配度最高的结果名字输出在屏幕上识别出的图像矩形框左上角,根据图像直观地知道识别输出的名字是否与匹配的图像人脸正确。
3.2 实现过程
(1) 获取人脸信息
为了提高准确度和方便后续训练,将获取到的图像转化为灰度图像。在采集人脸图像时要规定好图像的大小规格,只需要采集脸部的信息,不需要采集太多无用的元素,使用detectMultiScale函数采集人脸。
(2) 保存人脸信息
在获取图像并且规定好人脸图像的大小规格后,将截好的人脸图像保存在一个文件中。输入图像人物ID、姓名,文件夹中的图片以ID号加第N张照片数加姓名的方式保存。
cv2.imwrite("./photo/."+ str(user_id) + '.' + str(count) + '.' + str(photo_name) +'.'+"jpg",gray[y:y+h,x:x+w])
(3) 建立人脸识别模型
OpenCV库中的人脸检测器模型级联分类器,也就是所说的目标检测模块通过调用CasedeClassifier类,将已经存在的数据集合训练生成人脸识别模型,用haarcascade_frontalface_default.xml文件生成一个脸部的级联分类器,除脸部外还可以有眼睛或者微笑等不同的文件。
(4) 创建训练器
创建人脸识别特征提取训练器,将图像转化为数据。在图片训练之前对图像进行预处理,调用OpenCV中的cv2.face.LBPFaceRecognizer_Create(),将采集到的图像信息进行归一化处理,保持人脸图像的尺寸和色彩对比度的统一。
(5) 對图像进行训练
创建好训练器后,通过把之前收集并且处理的图像的路径进行拼接,通过逐张访问的方式,将id转换成数组,图像转换成格式长度为8位的数据矩阵,接着调用train()函数对数据进行训练,后再将训练数据写入可以被电脑识别的数据序列化的.yml文件。
(6) 识别图像
主要调用LBPFaceRecognizer训练器的predict()预测函数,返回标签值id和样本的相似值。若返回标签值为-1,说明测试的样本在训练集中无对应或者距离比较远。
id, con = recognier.predict(gray[y:y+h, x:x+w])
在识别界面中可以显示识别图像的id或者相似值,如果需要出现图像中的任务的姓名,则需要在预测函数中得到id后与经过分割函数把图像路径中分割出来的id进行比对,通过相等的id就可以再次使用分割函数把路径中的姓名分割出来,识别界面中显示姓名。
4 实验结果分析
本次实验通过调用摄像头获取图像,通过下载目标检测模块类,加载脸部Haar-like特征的文件信息以及创建并且使用LBPFaceRecongizer训练器,将其结合搭建一个基于OpenCV的人脸系统,进行图像采集、训练和识别测试。在实验过程中发现存在一些问题还需要进一步完善,例如采集的图像的分辨率若较低在检测和识别时仍会出现偏差,采集的照片为正脸时采集准确率较高,如果头部稍微偏移的图像准确率会变低,多人出现在镜头时识别的辨识度会飘忽不定等,如何减小以上问题对图像检测的影响将成为研究的重点。
参考文献:
[1] 龙海强.基于深度学习的人脸识别算法[D].广州:广东工业大学,2016.
[2] 魏天琪.基于Python的人脸识别技术研究[J].信息与电脑(理论版),2021,33(2):162-164.
[3] 张齐.图像处理系统的设计与实现[D].南京:南京邮电大学,2018.
[4] 卜秋月.基于OpenCV的人脸识别系统的设计与实现[D].长春:吉林大学,2015.
[5] 周竞鸿.基于Python语言的大数据分析研究[J].电子技术与软件工程,2020(13):178-179.
【通联编辑:代影】
收稿日期:2021-08-12
基金项目:2021年广西高校中青年教师科研基础能力提升项目“深度学习下的人脸识别技术研究”(项目编号:2021KY0619)
作者简介:张绿云(1987—),女,湖南祁阳人,讲师,研究生,主要从事计算机视觉、图像识别研究。