随着人们安全出入控制和金融贸易安全方面的需要不断增长,生物统计识别技术有着广阔的发展和应用需求。人脸识别作为最热门研究方向之一,需要有较强的检测率和识别的准确率。
本项目的实现机制:基于OpenCV使用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法开发了一个功能相对完整的人脸识别身份认证系统。系统采用sqlite3进行序列化数据存储,能够进行人脸识别身份认证,并拥有基于PyQt5设计的GUI实现。
1、人脸识别原理
本算法通过调用摄像头采集图片同时将会调用Haar 级联分类器对摄像头获取画面进行人脸检测。利
用摄像头获取前 100 帧的人脸图像作为对比数据集,再将人脸特征信息通过 LBPH 算法保存到 数据库文件中作为人脸识别的对比的样本。再度调用本机摄像头在摄像头所获取画面中捕捉人脸信息将捕捉到的人脸信息与已保存在数据库文件中的信息进行对比,如果识别到人脸直方图特征与文件中已获取的信息一致,则成功识别。
(1)人脸图像增强
在采集图像时,光照很多情况下是不均匀的,光照环境的不同导致图像对比度低,光照不足,图像不清晰等,为人脸检测增加了难度。在实际操作摄像头进行视频采集时,经常会由于背景灯光太过明亮而造成人脸图像的逆光反应,人脸图像偏暗,导致细节不能体现。因此在视频输入后,进行图像光补偿、图像均衡化和增强对比度等图像预处理,为后续的人脸检测工作做好准备。
由于直方图均衡化方法在处理背景前景光线差异大的情况具有很好的效果,并且能够增强人脸图像细节,使人脸图像信息更丰富,因此采用直方图均衡化对图像增强。
直方图均衡化处理的核心是将原来图像的直方图信息进行调整,使其趋于平衡,从而达到提高图像灰度值的动态范围。
在具体均衡化处理实现中,通常先统计处理前图像的灰度分布,运算处理获得处理前图像直方图分布,再依据累计直方图的分布计算得到灰度区间各灰度级之间的映射关系。按照这个映射关系进行灰度转换实现直方图均衡化。经过直方图均衡化处理的图像再进行人脸检测,更有助于对人脸的细节特征进行提取,增加辨识度。
(2)人脸检测
人脸检测即发现图片中人脸位置在哪。
人脸检测采用基于 Haar 特征的 AdaBoost 算法,由于 Haar特征数量庞大,用常规方式计算其特征值的计算量大、占用资源多、耗时较长,因此,可以借助积分图的方式来计算 Haar 特征值,可以大大提高计算效率。借助积分图方式进行人脸 Haar 特征识别的总体思路是将图像中的 Haar 特征( 矩形特征) 提取出来并计算出积分图像,得到的积分图像与人脸的积分图像对比,符合人脸特征的区域则被标记起来。
Haar 特征值反应了图像的灰度变化。由于人脸的灰度特征具有一定的规律,例如人的眼睛嘴巴、鼻梁两侧灰度值比周围像素灰度值要大,人脸具有灰度中心值等。
Adaboost(Adaptive Boosting,自适应增强)算法基本思想就是被前面一个弱分类器误检的正负
样本都会得到加强,对这些误检的样本进行加权并进行下一轮训练,同时,将一个全新的弱分类器添加到所有轮次到的分类中,重复以上过程不断迭代计算,直到当结果满足指定错误率或循环次数达到指定的最大次数。
Haar 特征不仅拥有直观的表达能力而且计算处理快速快,更加适合人脸检测。本文采用 AdaBoost 分类算法对图片中 Haar 人脸特征进行计算,获得人脸特征,然后经过迭代训练生成弱分类器,最后经过级联分类把弱分类器组合强化,生成人脸强分类器,通过使用强分类器的方法实现人脸检测功能。
(3)人脸识别
人脸识别就是如何区分不同的人脸。
人脸识别是人脸识别系统中最为关键的环节之一,人脸识别包括两个核心模块:特征提取与特征匹配。人脸图像识别所受的干扰因素很多,包括:光线强弱、姿态、遮挡、成像等。
在特征提取方面采用 LBPH 特征,在匹配算法方面选用 Hamming 特征对人脸进行识别。由于检测到的人脸图像大小不统一,会对直方图信息造成影响,所以,在进行特征提取前首先进行图像大小规格化计算,然后使用 LBPH 算法提取人脸图像信息。如果是进行人脸身份信息录入,则对信息进行补充、存储,形成人脸特征信息库。若对当前人脸进行验证是否在库中,则将当前特征与人脸特
征信息库中的向量进行 Hamming 距离计算,计算结果在预设值的范围内,则验证成功,说明此人脸已录入信息;计算结果不在范围内,则说明当前人脸未录入信息,不能验证成功。
LBPH 称为局部二进制编码直方图,建立在这种直方图基础上的人脸识别算法思想是以每个像素为中心,用二进制编码表示其与周围像素灰度值大小关系,从而获得整幅图像的 LBP 编码图像。将 LBP 图像划分为多个区域,得到每个区域的 LBP 编码直方图,从而获得全幅图像的 LBP 编码直方图。通过比较不同人脸图像的 LBP 编码直方图达到人脸识别的目的,且不会受缩放、光照、平移以及旋转等因素的影响。
LBP 算法主要将 LBP 特征谱的统计直方图作为特征向量进行分类识别。在一幅图片上划分很多个子区域,提取子区域内每个像素点上的 LBP 特征,然后在每个子区域内建立LBP 特征的统计直方图 。这样一个统计直方图就可以描述不同的子区域,若干个统计直方图可以表示出整个图片,这样做的优点是在一定范围内减小图像没完全对准而产生的误差 。此外,分区的另一个意义在于可以根据不同的子区域分配不同的权重。例如:将一幅 100100 像素大小的图片划分为 100 个子区域(可以通过多种方式来划分区域),每个子区域的大小为 1010 像素,对每个子区域内的每个像素点提取其 LBP 特征,然后建立统计直方图。这样,利用这 100个统计直方图就可以描述这幅图片,然后可以使用各种相似性度量函数来判断两幅图像之间的相似性。
当录入人脸的图像之后,人脸识别过程需要设置置信度,计算检测到的人脸特征和信息库中的人脸特征的 Hamming 距离,计算结果在置信度阈值内则是库中人脸,否则不能验证通过。
2、人脸数据采集、存储
通过调用摄像头捕捉人脸并截取100 张图片进行标号,将图片保存在指定文件夹下,因为该文件
涉及较多人员信息且涉及个人隐私,所以在实现过程中将其进行加密处理。在采集过程中为了排除
其他干扰,选择颜色单一的背景、灯光较强的场地进行人脸采集。在采集人脸时,为提高人脸识别准确性,首先将面部完全暴露于摄像头前,便于摄像头采集,其次保证人脸信息的完整度,进行人脸不同部位、不同面部表情的数据采集,包括人脸正面,人脸侧面、笑脸、闭眼等。
运行dataRecord.py
数据存储
3、数据库管理和人脸识别模型训练更新
我们对图像的任意一个像素使用上述方式进行处理,将一张人脸照片分为许多不同的子区域,并在子区域内根据 LBP 值统计其直方图,以直方图作为其判别特征,训练生成样本的数据库.
运行dataManage.py
4、人脸识别
打开摄像头,对获取到的照片通过 LBPH 算法将人脸信息保存在 数据库文件内并将人脸编号与人脸信息保存在一起,从而达到人脸识别的效果。
运行core.py
5、代码目录
6、安装步骤
$ cd face_recognition_py
创建Python虚拟环境
$ conda create -n opencv python=3.6
$ activate opencv
安装OpenCV
$ cd modules
$ pip install opencv_python-3.4.1+contrib-cp36-cp36m-win_amd64.whl
安装dlib
$ pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl
安装其它依赖包
$ cd …
$ pip install -r requirements.txt
运行核心框架
$ python core.py
运行人脸采集系统
$ python dataRecord.py
运行数据管理系统
$ python dataManage.py
7、演示视频
https://mp.csdn.net/mp_others/manage/video?spm=3001.5304
8、下载链接
9、小结
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
参考链接:https://zhuanlan.zhihu.com/p/630085436