◆梁晶 史记征
基于Python库的人脸识别方法研究
◆梁晶 史记征
(重庆安全技术职业学院 重庆 404020)
人脸识别技术经过几十年的发展,已成为计算机视觉领域的一个研究热点。随着人脸识别算法的趋于成熟,人脸识别技术已经在公安、支付、身份验证、美颜相机等领域得到了非常广泛的应用。本文利用Python语言的第三方库,通过机器深度学习实现人脸识别,该方法具有编程简单、易于实现、准确率高等优势。
人脸识别;Python语言;dlib库
人脸是一个人在社会交往中最重要的特征,是确定一个人身份的最重要的方法,研究人脸识别具有重要的理论价值和应用价值。人脸识别是通过生物特征对人的身份进行辨认,是计算机视觉领域的一个研究方向。人脸识别研究起源于20世纪60年代,由Bledsoe和Chen最先提出。
通过对一个人面部的观察可以获得很多信息,比如:性别、心情、年龄、健康状况等。人脸检测是一个特别复杂的过程,根据所选检测系统的不同,使用到的检测算法、原理以及编程语言等也会相对应的不相同,但归纳起来大致都可以分为以下几个流程:
(1)人脸检测:这个流程主要完成的工作是从所给图像信息中检测出人脸,同时将关键点的位置范围进行反馈。
(2)人脸规范化:由于人脸在不同的图像像素和光照强度等问题下显像程度是不一样的,所以需要在上一步的基础上对此进行校正。
(3)人脸特征提取:完成校正后,对识别到的较清晰的人脸进行特征提取。
(4)人脸识别:这一步是人脸检测的最后一步,就是把前面提取出来的人脸特征与数据库中已有的人脸特征进行匹配,进行人脸识别。具体识别过程如图1所示。
本文所使用的Python第三方库dlib是基于深度学习进行人脸识别的。
图1 人脸识别过程
dlib库一个机器学习的开源库,解决包含机器学习算法以及开发复杂软件的现实问题,它被广泛应用在工业和学术研究领域,包括机器人、嵌入式设备、移动手机以及大规模高性能计算环境中。它的主要特点有:文档说明全、代码质量高,包含机器学习算法、科学计算算法、图模型推理算法、图像处理、网络编程、图形用户接口、数据压缩与整合算法等。
Python第三方库最常用的安装方式是通过pip命令。作为Python的内置命令,pip需要通过命令行执行。dlib库的安装命令是:pip install dlib。
本研究共涉及4种不同类型的文件:人脸关键点检测器文件1.dat,人脸识别模型文件2.dat;候选人脸文件girl1.jpg、girl2.jpg、girl3.jpg、girl4.jpg、girl5.jpg、girl6.jpg;需要识别的人脸图像文件test1.jpg、test2.jpg、test3.jpg、test4.jpg;Python脚本文件girl-face-rec.py。1.dat、2.dat可以从http://dlib.net/files/下载获得;模型数据文件是用来估计人脸上68个特征点(x, y)的坐标位置,这68个坐标点的位置如图2所示;候选人脸文件如图3所示;需要识别的人脸图像文件如图4所示。
图2 人脸特征坐标
图3 候选人脸图像
图4 待识别的人脸图像
从图4可以看出:test1.jpg、test2.jpg和候选文件中的本人看起来有很大差别,test3.jpg是候选人中的原图,test4.jpg中的女孩微微侧脸,并且左脸有明显黑色阴影。
基于以上分析和处理,人脸识别的相关数据已经准备完成,那么就可以通过编写程序完成人脸识别了。其中人脸识别的大致流程如下:
(1)在对候选人进行人脸检测、关键点提取、描述子生成后,把候选人描述子保存起来。
(2)然后对测试人脸进行人脸检测、关键点提取、描述子生成。
(3)最后求测试图像人脸描述子和候选人脸描述子之间的欧氏距离,距离最小者判定为同一个人。
#文件名: girl-face-rec py
#-*-coding:UHF-8-*-
import sys, os, dlib, glob, umpyfrom skimage
import io
if len(sys. argv)!=5:
print"请检查参数是否正确”
exit()
predictor_path=sys.argv[1]
face_rec_model_path=sys. argv[2]
faces_folder_path=sys. argv[3]
img_path=sys. argv[4]
detector= dlib.get_frontal_face detector()
sp =dlib_shape_predictor(predictor_path)
facerec=
dlib face_recognition_model_vl(face_rec_mo
del_path)
descriptors=[]
for f in
glob glob(os path. join(faces_folder_path,
“*.jpg”)):
print(“Processing file:{}”.format(f))
img=io.imread(f)
dets=detector(img,1)
print(“Number of faces detected:
{}”.format(len(dets)))
for k, d in enumerate(dets):
shape=sp(img,d)
face descriptor=
facerec.compute_face_descriptor(img, shape)
v=numpy.array(face_descriptor)
descriptors.append(v)
img=io.imread(img_path)
dets=detector(img, 1)
dist=[]for k,d in enumerate(dets):
shape=sp(img, d)
face_descriptor=
facerec.compute_face_descriptor(img, shape)
d_test=numpy.array(face_descriptor)
for i in descriptors:
dist_=numpy.linalg.norm(i-d_test)
dist.append(dist_)
candidate=
[‘Unknown1’, ‘Unknown2’, ‘Shishi’, ‘Unknown4’
‘Bingbing’, ‘Feifei’]
c_d=dict(zip(candidate,dist))
cd_sorted=sorted(c_d.iteritems(),
key=lambda d:d [1])print” The person is:
“, cd_sorted[0][0]
dlib.hit_enter_to_continue()
分别运行如下命令:
(1)python girl-face-rec.py 1.dat
2.dat./candidate-faces testl.jpg
(2)python girl-face-rec.py 1.dat
2.dat./candidate-faces test2.jpg
(3)python girl-face-rec.py 1.dat
2.dat./candidate-faces test3.jpg
(4)python girl-face-rec.py 1.dat
2.dat./candidate-faces test4.jpg
通过运行结果可知:test1.jpg、test2.jpg、test3.jpg测试结果完全正确。但是测试图片test4.jpg的输出结果显示是候选人girl4.jpg,识别存在一定的错误率。
利用Python的dlib库可以实现人脸识别功能,编程简单、准确度高。但由于每个人脸有68个特征值,假如已知人脸图片过多,特征值库将较大,欧式距离的计算将消耗较长时间,所以需要引入并行计算技术,以提高人脸识别效率。
[1]聂晶. Python在大数据挖掘和分析中的应用优势[J].广西民族大学学报, 2018, 24 (1) : 76-79.
[2]严婷,欣秀,赵嘉豪,等.基于Python 的可视化数据分析平台设计与实现[J].计算机时代, 2017,(12) : 54-56.
[3]邹国锋,傅桂霞,李海涛,高明亮,王科俊.多姿态人脸识别综述[J].模式识别与人工智能, 2015,28(07):613-625.
[4]胡敏,程天梅,王晓华.融合全局和局部特征的人脸识别[J].电子测量与仪器学报, 2013,27(09):817.
[5]Mark Summerfield著.王弘博,孙传庆译.Python3程序开发指南(第2版)[M].人民邮电出版社, 2015:427-444.
2018年重庆市高等职业教育双基地建设重庆安全技术职业学院“大数据与物联网融合实训基地”项目支持。