430681198703046732
摘要
近年来人类生物特征越来越广泛地用于身份识别,如 DNA 识别技术、指纹识别技术、虹膜识别技术、语音识别技术、人脸识别技术等。基于人类生物特征的识别技术具有安全可靠、特征唯一、不易伪造、不可窃取等优点。本文基于 OpenCV 图像处理库,利用《数字图像处理》的知识,实现简单地人脸识别技术。
关键词 人脸的检测;数据集准备;数据训练;人脸识别;
1、人脸识别系统概述
人脸识别技术现在已经愈发成熟,有 OpenCV 的 Harr 分类器、Dlib 库等等,他们可以高精度实现人脸识别。本文希望运用已经成熟的技术搭建一个人脸识别系统的应用程序,通过摄像头采集图像,实现在线识别,并可以在线添加新的使用者,可以运用在电脑开机人脸检测等场景。本系统编程语言使用 Python3.7,在 PyCharm 平台上开发,主要依赖于 OpenCV 库函数,通过对采集到图像帧进行预处理、人脸检测、裁剪、最后再进行识别;再此基础上,再添加基于 PyQt 的应用程序框架,对系统进行完善,美化。
主要实现过程:
1) 使用摄像头采集图像显示,并检测出人脸
2) 实现在线生成数据集,对模型进行训练、识别
3) 将程序封装在应用程序中
2、人脸检测技术
早期人们的主要研究对象是人脸识别,即只根据人脸来识别身份,但是随着应用环境越来越复杂,人脸识别越来越困难。往往需要先将人脸提取出来进行裁剪、旋转、对齐等,再进行人脸识别。本章主要采用 Harr 开源库、和 face_recognition 库分别进行人脸检测实验,并对比好坏。
2.1 基于 Harr 级联的人脸检测
Harr 的简单概念,当我们需要对某些东西进行分类时,很习惯的会想到观察它的细节与其他类别实物有什么不同。同理,从图像里面找出人脸也需要提取出图像的细节,这些被提取出来的细节成为特征,专业释义:从图像数据中提取特征。虽然像素是根据环境变化的,任意像素都可能影响多个特征,但是特征要比像素少的多。例如,边、顶点和细线都能生成具有判别性的特征。可以这么简单的理解,人脸上眼睛和鼻子的分布会造成图像上不同的阴影,但是大多数人的这些阴影像素分布又是相同的,Harr 就是通过提取这些特征来进行人脸检测。OpenCV 提供了 Harr 级联分类器和跟踪器,并将其保存成指定的文件格式。获取 Harr 级联数据,在 OpenCV 源代码的副本中有一个 data/harrcascades文件夹。该文件夹包含了所有 OpenCV 的人脸检测的 XML 文件,这些文件可以检测静止图像、视频和摄像头所得到的人脸图像,但是这些级联有个弊端就是必须用于正面、直立的人脸图像。本系统使用 Python 语言基于 OpenCV3.0 函数库编写,首先进行摄像头采集图像,然后对图像做灰度化等相应处理,最后调用 detectMultiScale()函数对人脸进行检测。基于 Harr 级联的人脸检测主要函数有:cv2.VideoCapture(0)是获取摄像头的函数,笔记本内置摄像头参数为 0,外置的其他摄像头也可以选择其他参数;ret, frame = camera.read()函数是捕获图像并返回两个参数,ret 表示读取是否成功,frame 表示读取回来的图像。
2.2 基于 face_recognition 开源库的人脸检测
基于 Harr 级联的人脸检测优点就是简单易理解,但是这些级联有个弊端就是必须用于正面、直立的人脸图像,当被检测人歪着头就很容易检测不到。而 face_recognition 应用了 dlib——一个现代 C++工具包,其中包含了一些机器学习算法来帮助完成复杂的基于 C++的应用,可以完成大量任务,发现图片中所有的脸,发现并处理图片中的脸部特征,识别图片中的脸,实时的人脸识别,而且对于歪着的脸也有很高的检测能力。 人脸对齐,face alignment 指在标定人脸位置后对人脸上的特征进一步定位,可以对人脸检测的侧脸进行校正,旋转,3d 变换等,也可以对特征点进行特定的表情变化。常用的有 5 点和 68 点特征。如 DCNN,TCDCN,MTCNN等方法。我们通过获取两眼的中心坐标,计算出倾斜角度,计算出仿射矩阵,再进行旋转变换即可。考虑到背景问题,旋转后空出来的背景用灰色常数值填充。
3、人脸识别技术
本章节主要分为三个部分:先采用上一章节内容采集人脸数据做成数据集,再利用数据集训练 Harr 人脸识别模型,最终在摄像头读取实时识别人脸。本章的所有程序依赖环境与上一章相同。
3.1 构造人脸数据集
人脸数据集的要求每个人脸单独一个文件夹,并将文件夹以人名命名,在总的文件夹下记录每个人名,方便人脸识别时,显示人名。人脸数据的采集是基于上一章的人脸检测内容,只是将检测到的人脸切割出来存储为 TXT文件。
3.2 模型训练
模型训练是将上一章所采集的数据作为输入,训练出关于我们自己的模型,主要包含两部分内容,图像加载和训练识别模型。
人脸库确定之后需要进行训练,即让计算机“学习”这些人脸样本。这时面临的一个问题就是如何把训练样本读进内存中。opencv 手册中明确说明LBPHFace 的训练函数的入口参数是一个图像容器,容器中包含所有训练图像。那么如何创建一个这样的 容器并把训练样本全部放进去呢?加载图像就是为了解决这个问题,为数据集添加标签等。主要包含读取样本文件,并加载到一个列表里,返回值包括 2 部分,【文件列表,对应标签】,标签用来对照姓名。最终把所有的名称写入文件保存。加载数据主要利用 numpy 库和 os 库中的函数读取数据、打开文件等具体程序见附录 train_face.py 中的 read_image(path)函数。这样处理以后就可以将返回值直接输入训练模型。
3.3 实时人脸识别
有了前面的基础,实时人脸识别也就简单了,首先我们对摄像头捕获帧进行基本处理,灰度化、人脸检测、人脸对齐等,然后加载人脸识别模型,加载训练好的参数,最后将处理后的图像输入到训练好的模型中,利用人脸预测函数 params = recognizer.predict(roi_gray),返回参数有两个,params[0]表示识别后的标签, params[1]表示置信度评分。对图像或视频中检测到的人脸进行分析,并从两方面来确定:是否识别到目标;目标真正被识别到的置信度的衡量,这也称为置信度评分,在实际应用中可以通过设置阈值来进行筛选,置信度高于该阈值的人脸将会被丢弃。通常 params[1] 低于 50 以下是好的识别参考值,高于 80 的参考值都会认为是低的置信度评分。我们可以设当置信评分低于 70 时,在图像上输出检测人名。
参考文献
[1] 于清澄. 基于K-L变换的人脸识别算法研究[D]. 沈阳工业大学,2007.
[2] 张文范. 基于版本控制的动态需求跟踪模型[D]. 湖南大学硕,2016.
[3] 张莹. 基于二维主成分分析的人脸识别算法的研究[D]. 重庆大学,2009.
1