曾崇林 姚富光
摘 要 当前正在开发的面部识别技术广泛用于安全、监视、一般识别、访问等领域。如在搜索和救援失散儿童和提高身份识别效率方面发挥着重要作用。本文基于树莓派的硬件基础,在Python软件环境下,选择了通过计算128D的特征值和128D向量间的欧氏距离的方法,并结合Adaboost算法、提取Haar特征的方法来提取人脸特征。开发过程中用到的OpenCV级联分类器是通过人脸检测算法进行训练的,再加以通过积分图方法来获取完整的级联分类器结构,最后,开发了一个实现人脸识别功能的智能终端。可投入小型场所例如课堂签到,考试身份验证,上班打卡,防盗锁等诸多领域。
关键词 人脸识别;OpenCV;AdaBoost;分类器;树莓派
引言
当今社会中,面部识别技术变得越来越重要,我们迫切需要更方便用户的识别,生物技术正在成为信息处理和信息产业的一个动态领域和重要的方向。受2020年年初爆发的全球性肺炎疫情,人们在公共场合需要进行身份识别和体温检测,但是人与人之间的接触又是十分危险的。如果人脸识别智能终端开发成熟能够投入到社会中,就会大大提高身份识别的效率并且可以很大程度上保障市民的生命安全。
基于这个时代大背景,设计了一个基于OpenCV的人脸识别系统。该系统能够广泛应用与各种场合下,移动方便,操作简单,使用灵活,还可以弥补传统安保行业的安全、方便等方面的缺失。该系统可保障识别数据的实时性,真正做到安全、方便和直观的人脸识别系统,从而进一步提高公司、仓库、家庭、学校等地的安保水平和管理稳定性[1]。
1系统设计
1.1 系统整体设计
该系统的整体设计是以python语言为基础开发的,运用到了如OpenCV、DLIB等开发包,以实现单个驱动样品中的面部识别,并具有更友好的UI界面和优化的识别速度。首先进行面部认知,并试验阅读面孔集的过程,检测面孔,提取面孔身份矢量,存储面孔身份矢量,标识单个测试面板和打印标识结果。标识界面初始化,加载各种参数模型,手动选择单个面部测试图表,根据人体面部检测器openCV检测人体面部,从人脸特征矢量中提取,计算十二个特征点之间的距离,检测人脸标签中最小距离的标签,以及输出面部识别结果,图1显示了该系统的组织结构。
面部检测包括检测面部特征,并在某些情况下定位眼睛、鼻子、耳朵和眉毛等面部特征,从而能够准确地定位脸部和人脸的其他部分。一般情况下,人脸检测是通过相关技术进行的,这些技术将要检测的人脸图像划分为一种人脸图像模式(“检测到的人脸组成部分”)和一种非人脸图像模式。
该人脸识别系统的设计以树莓派为基础,加以数据库、OpenCV库以及显示屏。使用本套系统之前需要通过摄像头识别人脸并将人脸样本保存到人脸库中,即数据的采集和保存。当有人的脸部出现在摄像头之下,就会自动捕捉人脸,将识别到的人脸与人脸库中的样本进行比对,如果人脸库中存在此人的人脸样本就会输出该人脸所对应的相关信息,如账号、姓名等。若无上述现象,则证明人脸库中不存在该对象[2-4]。
图1 系统设计结构图
1.2 系统硬件设计
将树莓派专用摄像头用白色排线连接到樹莓派的开发板上,再将树莓派通过USB接口和AMI转换器与显示屏连接成功,将所需的鼠标键盘通过USB线连接到树莓派上。硬件框架大概基本搭建完成,可以进行环境的配置和系统的开发了[5]。
1.3 系统软件设计
(1)系统开发所需软件环境
1)开发所需要软件资源:win32 DiskImager,SDFormatter,树莓派镜像文件,树莓派官方Linux系统,PyCharm,python 3.8。
2)开发工具选择。本次设计所用的开发工具是PyCharm 2020.1 x64,python 3.8,Pycharm 2020.1 X64 Pycharm。
(2)软件运行环境的搭建
1)烧录系统;
2)配置树莓派wifi和远程桌面;
3)安装Qt、QtCreator、图形化远程桌面、PyCharm,python 3.8;
4)安装开发所需要的库[6-8]。
2系统实现
2.1 系统核心代码
if len(self.faces) != 0
# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arr
features_cap_arr = []
for i in range(len(self.faces)):
shape = self.predictor(self.img, self.faces[i])
features_cap_arr.append(self.face_rec.compute_face_descriptor(self.img, shape))
# 遍历捕获到的图像中所有的人脸
for k in range(len(self.faces)):
# 人员信息列表
# 先默认不认识,是 unknown
name_namelist.append(“unknown”)
# 每个捕获人脸的名字坐标
the positions of faces captured
pos_namelist.append(tuple([self.faces[k].left(), int(
self.faces[k].bottom() + (self.faces[k].bottom() - self.faces[ k].top()) / 4)]))