本论文主要阐述了基于OpenCV的人脸识别原型系统。基于生物特征识别的身份认证方法有指纹、掌纹、眼睛虹膜、人脸等,其中,由于人脸的稳定性和可见性,人脸识别的研究与应用成为热点,本文针对出租公寓安全管理需求,设计和实现了基于OpenCV的人脸识别原型系统,全文内容包括:
本系统用于出租公寓人员进出管理,自动记录人员进出的时间与照片,自动识别是否是公寓的住户。首先,系统从摄像头视频流采集住户的人脸照片,通过openCV进行人脸检测与人脸对齐,接着训练一个人工神经网络模型,进行人脸识别,系统工作时定时采集进出人员的脸部照片,输入模型进行人脸对比,如果相似度超过阀值,则判定为住户,否则是陌生人。接着把采集到的照片与时间记录下来,如果是住户保存住户姓名。系统在运行中可以动态增加新住户,删除住户数据,然后重新训练人工神经网络模型。
系统架构分为两部分,用户界面与基于openCV的人工神经网络模块,人工神经网络模块封装成类对象,由用户界面模块与人员进出日记模块调用。
从摄像头视频流抓拍照片使用openCV API完成,获取到图片后,装载openCV haarcascade分类器进行人脸检测[1],以确定图片中是否包含人脸。openCV haarcascade分类器是级联分类器,首先根据haar-like特征训练多个弱分类器 ,然后使用adaboost算法将多个弱分类器组合成一个强分类器 ,最终的分类器是由多个强分类器级联而成,见源代码中的文件get_faces.py。
经过人脸检测和人脸对齐两个步骤,获得了包含人脸的区域图像,接下来就要进行人脸识别。这一步使用深度卷积网络,将输入的人脸图像转换成一个向量的表示,这就是“人脸特征”。人脸特征经过全连接层,进入softmax输出层,softmax的每一类对应一个人。
人工神经网络是一个并行和分布式的信息处理网络结构[2],该网络结构一般由许多个神经元组成,每个神经元有一个单一的输出,它可以连接到很多其它的神经元,其输入有多个连接通路,每个连接通路对应一个连接权系数。人工神经网络是生物神经网络的一种模拟和近似。它主要从两个方面进行模拟:一种是从结构和实现机理方面进行模拟,它涉及到生物学、生理学、心理学、物理及化学等许多基础学科。由于生物神经网络的结构和机理相当复杂,现在距离完全认识它们还相差甚远:另外一种是从功能上加以模拟,即尽量使得人工神经网络具有生物神经网络的某些功能特性,如学习、识别、控制等功能。
人工神经网络模型由3层卷积池化、全连接层、输出层构成。第1层卷积池化的卷积核大小(3,3), 输入通道(3), 输出通道(32);第2层卷积池化的卷积核大小(3,3), 输入通道(32), 输出通道(64);第3层卷积池化的卷积核大小(3,3), 输入通道(64), 输出通道(64),见图3.4.1。
人工神经网络模型代码使用TensorFlow架构[3]实现,tensorflow是google 2015年推出的人工智能与深度学习模型框架,具有运算性能强,框架设计通用,支持生产环境部署,语言接口丰富,支持云端协同计算等优点,是目前机器学习和深度学习项目中最受欢迎的开源框架。
TensorFlow架构中包含CNN模型,CNN模型是一种以卷积为核心的前馈神经网洛模型。卷积是分析数学中的一种基础运算,其中对输入数据做运算时所用到的函数称为卷积核。卷积运算是指卷积核以滑动窗的形式在输人数据的各个位置上做小范围加权和的过程。以图像识别为例,卷积核在输入图像上不断滑动时,卷积核与当前滑动窗口内的输入图像像素值相乘后求和即得到输出图像的像素值。这个运算过程与图像处理算法中常用的空间滤波是类似的。因此,卷积可以被通俗地理解为一种“滤波”过程,卷积核与输入数据作用之后得到了“滤波”后的图像,从而提取出了图像的特征。卷积、池化、softmax在TensorFlow架构中都有对应的API函数,可以直接调用,非常方便。
每个住户抓取10张图片,openCV API检测人脸时给出脸部矩形坐标,按照脸部矩形坐标裁切图片,在把脸部图片缩放为128*128像素,输入CNN神经网络模型训练,得到住户人脸识别模型。见源代码中的文件cnn_model.py。
人脸图片训练集使用USER_LIST类生成,USER_LIST类调用openCV API把采集到的住户照片进行人脸图片裁切,获得训练集。接着使用CNN_MODEL类生成CNN模型,把训练集分批放到CNN模型进行训练,当准确率达到99.9%停止训练,保存训练得到的模型。因为训练需要比较长时间,训练在后台工作线程进行,THREAD_TRAIN类负责生成后台工作线程,使用TRAIN_MODEL类进行模型训练。见源代码中的文件:train_model.py。
从摄像头抓取进出人员5张带人脸的图片,openCV API检测人脸时给出脸部矩形坐标,按照脸部矩形坐标裁切图片,在把脸部图片缩放为64*64像素,输入CNN神经网络模型预测,模型将会返回住户姓名索引,通过索引查找住户姓名,如果查找失败,就是陌生人。因为人脸识别耗时多,建立后台工作线程进行人脸识别。DETECT_STREAM类负责照片采样与人脸图片裁切,使用openCV进行人脸检测,采样到的人脸图片送到工作线程类THREAD_RECOGNITION,该工作线程调用FACE_RECOGNITION类进行人脸识别。FACE_RECOGNITION类初始化时加载人工神经网络CNN模型训练生成的人脸识别模型。见源代码中的文件:faces_recognition.py。
来访记录模块负责把人脸识别的结果记录到磁盘,向UI界面提供来访记录与来访者的照片。当人脸识别模块识别出来访者后,调用RECORD_VISIT类的record()接口把来访信息记录到磁盘,RECORD_VISIT类按照“姓名/日期/图片文件”结构写入磁盘。当用户点击“来访记录”按钮时,UI界面通过RECORD_VISIT类listRecord()接口获取来访记录,RECORD_VISIT类从磁盘读取来访记录,按时间排序后返回。当用户点击“查看照片”按钮时,UI界面通过RECORD_VISIT类GetPhotos ()接口获取来访者的照片。见源代码中的文件:record_visit.py。
用户界面选用python tkinter库实现,tkinter是python标准的GUI库,建立在tk技术上。Tk最初是为tcl工具命令语言所设计的,具有可移植性和灵活性高,非常容易使用。用户界面共有6个窗口界面,主窗口、增加住户窗口、删除住户窗口、来访记录窗口、模型训练进度条窗口和查看来访者照片窗口,每个窗口封装成类对象,分别是:AppUI类、UI_ADD_USER类、UI_DEL_USER类、UI_VISIT类、UI_TRAIN类、SHOW_PHOTO类。AppUI类调用UI_ADD_USER类、UI_DEL_USER类和UI_VISIT类,打开相应的窗口;UI_ADD_USER类与UI_DEL_USER类回调用UI_TRAIN类,打开模型训练进度条;UI_VISIT类会调用SHOW_PHOTO类,显示来访者的照片。见源代码中的文件:appui.py。