考场人脸识别系统研究与实现

2019-09-10 07:22衡友跃
赤峰学院学报·自然科学版 2019年3期
关键词:人脸识别

衡友跃

摘要:考场传统的人工核验身份存在效率低、人为因素大等弊端,设计实现了一种考场人脸识别系统,该系统基于PCA算法,在OpenCV中实现,测试达到预期效果,为考试提供了有力支持.

关键词:人脸识别;PCA;OpenCV

中图分类号:TP391 文献标识码:A 文章编号:1673-260X(2019)03-0051-03

基于视频的考生异常行为识别的第一步识别考生身份,传统的人工核验身份证和准考证效率低,出错率高.针对当前现状,本文设计了考场人脸识别系统,为考生异常行为识别奠定基础.

1 考生脸部图像获取及处理

在考生人脸识别之前,需要先进行考生面部图像的获取.为防止学生替考,要求用二代身份证核验身份,通过拍摄二代身份证上的照片提取面部图像.拍照的角度,拍照时的光线强弱等因素都会带来干扰,对照片有影响.加上JPEG格式压缩的图像,其本身也有一定程度的失真.给人脸识别增加难度.这些因素没法改变,因此只能通过选择合适的算法,并对其进行优化,在一定程度上消除不利因素.

人脸识别算法对照片中人脸的标准化要求很高,在进行人脸识别之前,要对原始的照片进行预处理.预处理之后的照片应该大小一样,人脸的位置也应该保持一致.

预处理流程步骤:首先对照片进行旋转,旋转到两个眼睛处在同一条水平线上即可.接着对照片进行裁剪,根据人脸图像的宽度是标准照片中两个眼睛之间的距离的2倍进行裁剪,两个眼睛的位置确定下来,其他器官的位置也就跟着确定了,一张标准化的人脸图像就生成了.接着对图像进行灰度归一化处理,为了方便统一处理不同灰度值的图像,图像的灰度值和方差需要被设定到一个合理的范围之内.

2 面部特征提取

目前面部特征提取方法有:基于几何特征面部识别方法、基于BP神经网络面部识别方法、基于LBP的面部识别方法等[1].每种方法都各有适用场景及优缺点,考虑到平台的兼容性,硬件资源配置低的因素,本文采用PCA(Principal Component Analysis)算法.

PCA即主成分分析,是一种常用的数据降维方法.它可以通过线性变换将面部原始数据变换为一组各维度线性无关表示,以此来提取数据的主要特征分量.PCA算法步骤[2,3]:

(1)将面部图像采集到数据库中.这一步先进行图像预处理,然后再将数据按列组成n*n矩阵X.

(2)求特征协方差矩阵.将X的每一行进行零均值化处理,求出协方差矩阵C,进而求出协方差矩阵C的特征值及对应的特征向量.

(3)对面部特征进行降维.将面部特征向量按照对应特征值大小从上到下按行进行排列成矩阵,取前k行组成矩阵P,Y=PX即为降维到k维后的特征向量.

3 面部特征识别

识别过程分为两步,第一步训练,第二步识别.

训练步骤:

(1)准备一组面部图像.

(2)训练这些图像,生成它们的特征脸,保存N个特征值相关的特征向量,并将其定义为一个“面部空间”.

(3)将训练集合中的面部图像全部投影到“面部空间”上,计算出每一个人脸图像在该N维空间上的相关分布系数.

训练之后就可以识别了,识别步骤:

(1)将待识别的人脸图像投影到N个特征脸上,计算其权值.

(2)将得到的权值和原始的人脸集合做对比,计算图像之间的欧式距离,通过比较欧式距离和设置的阈值做比较,可以确认该人脸是否是人脸库中的人脸.

4 特征脸在OpenCV中实现

OpenCV是一个开源发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、Mac OS操作系统上.它用C++编写,但提供了大量的Python、Ruby等语言接口[4,5].

在OpenVCV2.4以后,加入了新的类FaceRecognizer.通过它可以方便快捷的进行人脸识别.首先输入人脸图像训练样本,FaceRecognizer类调用train方法对其进行训练,训练的结果通过调用save方法保存到FaceRecognizer对象中.接着进行识别工作,先通过load方法加载之前训练好的特征文件,然后FaceRecognizer调用predict方法进行人脸识别[6].整个识别过程在OpenCV中的实现过程如图1所示.

5 Android人脸识别软件设计

5.1 开发环境准备

(1)从opencv官网上下载sdk,本项目选择3.3.3版本.

(2)新建一个Android项目,导入opencvLibrary.

(3)复制sample/face-detection/src到app项目的src下.

(4)导入res文件.

(5)复制jni/detectionBasedTracker_ini.cpp和

jni/detectionBased Tracker_ini.h到cpp目录下.

(6)新建main/jniLibs/armeabi-v7a目录,复制sdk/native/libs/armeabi-v7a/libopencv_java3.so到新建目录下.

(7)复制sdk/native/jni/include/*.*

到main/jniLibs/目录下.

(8)修改CMakeList.txt文件.

(9)在build-gradle文件中加入要支持的armeabi-v7a架构.

(10)加入启动页面,运行.

5.2 人脸检测与识别

OpenCV有一个org.opencv.android.JavaCameraView自定义控件,它不停地从摄像头抓取数据,在回调方法中,我们能得到Mat数据,然后通过调用OpenCV的Native方法,检测当前是否是人脸,我们会获得一个Rect数组,里面都是人脸数据,最后将人脸画在屏幕上.

人脸识别用到了JavaCV,JavaCV是一款开源的视觉处理库,封装了OpenCV等计算机视觉编程常用接口,在Android平台上调用方便[7].

人脸检测阶段检测到人脸之后,把人脸部分截取出来,接着预处理原始数据,然后将特征值跟人脸空间特征值做比对,达到一定相似度即识别出来.

5.3 软件测试

本次App测试过程中,主要测试软件的识别率,测试组选取四位志愿者.首先训练样本,四位志愿者每人拍摄5张图片作为训练样本,如图2所示.

每位志愿者采集的面部图像的神态、表情都稍微有些变化,图中的人脸图像都是经过预处理之后的.在样本训练结束之后,进行人脸识别,识别结果如图3所示.

经过软件测试,当测试人数为4人时,软件识别率达到100%.

6 结束语

本文首先详细介绍了PCA人脸识别算法,然后配置Android开发环境,使用OpenCV开发实现了人脸识别软件,测试结果达到预期效果.

参考文献:

〔1〕江琨,郑禄,帖军.基于LBP和PCA算法的智能人脸识别[J].计算机与数字工程,2016,44(10):2048-2051+2056.

〔2〕赵鑫,汪维家,曾雅云等.改进的模块PCA人脸识别新算法[J].计算机工程与应用,2015(02):161 -164+176.

〔3〕张晓璐.基于PCA的人脸识别技术的研究[J].辽宁科技学院学报,2014(04):38-39+42.

〔4〕林启亮.基于OpenCV2.X的车牌识别系统设计与实现[D].厦门大学,2013.6-7.

〔5〕王艳红.基于OpenCV的运动目标检测与跟踪算法的研究[D].杭州电子科技大学,2014.5-6.

〔6〕劉海建.基于OpenCV的人脸辨识算法研究与实现[D].集美大学,2014.10-12.

〔7〕曾健平,邵艳洁.Android系统架构及应用程序开发研究[J].微计算机信息,2011(09):1-3.

猜你喜欢
人脸识别
人脸识别的“国标”来了
中科视拓开放商业版本人脸识别算法
荣耀畅玩7C:人脸识别
“人脸识别”人工智能测谎仪研发成功