基于Android平台的人脸识别系统设计与实现
2016-12-21刘亮
刘亮
摘 要 人脸识别是公共安全领域的研究重点。本文首先通过分析比较,采用基于Adaboost的算法检测人脸,基于LDP的特征脸算法实现特征提取和特征识别。然后选择OpenCV计算机视觉库来实现人脸检测和人脸识别。最后,通过JNI调用本地OpenCV代码实现Android平台的人脸识别系统。
【关键词】Android平台 人脸检测 人脸识别系统
1 引言
近年来,信息安全越来越受到人们关注,身份验证和识别技术成为众人瞩目的焦点,生物特征识别技术和人工智能技术不断更新发展,其中,人脸识别技术因具有并发性、非接触性、非强制性、操作简单等特点,被越来越广泛地运用到各个领域中。Android系统是目前移动设备的主流操作系统之一,在移动操作系统市场份额中占据了主导地位。随着人们在移动领域信息安全意识的提高,在移动平台上进行人脸识别具有广阔的发展前景,同时也面临诸多挑战。本文结合Android移动终端的特点,研究基于Android的人脸识别系统的实现,更好地满足移动领域信息安全方面的市场需求。
2 人脸识别原理
人脸识别技术是一种基于生理特征的识别技术,通过计算机提取人脸特征,并根据这些特征进行身份验证的一种技术。广义的人脸识别过程包括人脸图像采集及预处理、人脸检测与特征提取和人脸的对比与识别三大部分,其原理如图1所示。
人脸检测的算法有很多种,典型的有特征抽取算法、人脸小波检测、基于模板匹配、神经网络、支持向量机方法、Adaboost算法等。本文选择Adaboost算法实现人脸检测。人脸识别技术包括特征提取和特征识别,实现方法可概括为3类:基于几何特征方法(欧式距离判别法)、基于模板方法(特征脸方法、神经网络方法等)和基于模型方法(隐马尔科夫方法)。本文选择基于LDP的特征脸算法实现人脸特征提取与特征识别。
3 人脸识别算法
3.1 图像预处理
现实生活应用人脸检测与识别系统时,人脸的图像是在各种随机的场景下由摄像头或照相机拍摄的,因此受到光照变化、背景色彩、设备质量以及人脸姿态等因素的影响,需要对其进行预处理,主要包括光照补偿、滤波去噪处理和几何归一化的处理,经过这些处理,后期操作中将得到较好的识别效果。
首先定位人眼。为了提高定位效率,先确定人眼在人脸图像中的大概位置,然后基于这个大致的范围,采用灰度积分投影和灰度差分积分投影相结合的方法精确定位人眼:
M(y)=kphori(y)- Dhori(y)
其中,k为系数,K phori(y)为灰度积分投影,Dhori(y)为灰度差分积分投影。
其次是脸部图像的几何变换和剪裁,根据所检测到的人眼位置,通过图像旋转、剪裁、缩放等手段,使得脸部图像中人眼是对齐的且不包含背景、额头、耳朵和下巴,并将处理后的脸部图像缩放到70×70固定大小。
再次是分离直方图均衡,这个过程能够使得每一个脸部图像都具有相同的对比度以及亮度。
最后是图像平滑,图像平滑能够有效地减少图像的噪声。
3.2 人脸检测
自适应增强(adaptive boosting,AdaBoost)是一种需要监督的机器学习算法。特征选取和特征计算决定了AdaBoost算法的运行速度。Viola等人提出了基于Haar特征的AdaBoost人脸检测算法。本文使用Haar 特征进行特征提取。
基于特征的检测能对选定区域的状态进行编码。矩形特征是对输入图像使用矩形进行提取特征。Haar特征是一些由黑白矩形组成的特征,脸部的一些特性可以用矩形特征简单地描述,矩形特征值是两个不同的矩形区域像素和之差。如果图像特征表示眼睛的颜色比脸颊上端的颜色深。可以用特征值来编码特征,特征值定义为:
V=Sum黑-Sum白
其中,Sum黑、Sum白分别表示黑色和白色矩形覆盖区域的像素和。
使用Viola等人提出的积分图像的概念,可加快矩形特征的计算速度。进而计算出Haar特征的特征值,定义积分图中位置(x,y)处的值为待测图像位置(x,y)处的上方和左侧所有像素之和。
S(x,y)=s(x,y?1)+i(x,y)
C(x,y)=c(x?1,y)+s(x,y)
其中,c(x,y)为积分图在(x,y)点处的值,i(x,y)为原图像素点(x,y)处的灰度值,s(x,y)表示一行灰度值的累加和。初始时s(x,-1)=0,c(-1,y)=0。
弱分类器对正负样本分类的准确率应大于 1/2,这样训练算法最终收敛。一个弱分类器 h(x,f,p,θ):其中 1 表示人脸,0 表示非人脸。
计算在每个特征f下的所有样本特征值,并进行排序。然后扫描一遍排好序的特征值,从而确定特征f的一个最后阈值,最终训练成一个弱分类器。所有迭代得到的弱分类器,并按照—定的权值叠加起来,得到一个强分类器。将多个强分类器连接起来,得到Adaboost级联分类器。如图2所示。
3.3 人脸特征的提取
局部二值模式LBP(Local Binary Patterns)是一种从局部纹理定义中衍生出来的算法,所谓的纹理是图像分析中常用的鉴别特征,它所含有的信息能够表征物体表面的变化。由于其优秀的分类特性和计算的简便性,使得其广泛的运用于图像检索、人脸分析和工业检测等领域。
Ojala等人提出的LBP算子的模板大小被定义为3x3,以此模板依次扫描图像中的像素点,将该模板的中心点位置的灰度值与周围位置的8个灰度值相比较,若邻域位置的灰度值大于中心位置的灰度值则该邻域位置标记为l,相反标记为0;将这中心像素点周围的8个像素点顺时针依次连接组成8位二进制数;将该二进制数转换为十进制数,替代中心像素点位置的像素值。
gc代表中心像素位置的灰度值大小,P为该中心位置周围邻域像素点的个数,gi(i=O,l,...,P-1)是周围第i个像素位置的灰度值。则以(xc,yc)为中心位置的一个局部邻域的纹理特征可以表示为:
LDP算法结合了LBP的优点,在其基础上考虑到特征的方向性,能更有效和更为鲁棒的描述人脸。与LBP码相类似,我们需要对得到的卷积结果进行二值化处理,需要选定一个阈值。这里我们对返回的卷积结果的绝对值b0,b1,b2,b3,b4,b5,b6,b7从大到小进行排序,取其中第K个大小的值为阈值,大于该阈值的赋值为1,相反为0。
LDP算子对于存在噪声和非均匀的光照变化的图像具有更好的鲁棒性。
4 Android平台人脸识别系统设计
4.1 Android JNI技术
本文所研究的人脸识别算法是由C语言实现,并且调用了Opencv库,这样相对于使用Java语言实现有较高的执行效率。Android系统应用层采用的Java语言,但Android系统中也提供了JNI接口使得在Android程序中能方便的调用C语言或其他语言。JNI位于本地库与Java框架层之间,其结构如图3所示。
4.2 系统功能模块
Android平台上的人脸检测与识别系统主要由图像采集模块、人脸图像预处理模块、人脸检测模块、人脸注册模块和人脸识别模块等共五个模块组成。
图像采集模块:利用Android平台摄像头进行图像采集,调用Opencv库,实现调用摄像头、对拍摄的物体进行自动对焦、连续拍照等功能,快速获取图像帧的信息。
人脸图像预处理模块:对采集到的图像帧进行光照补偿、滤波去噪处理和几何归一化的处理等处理。
人脸检测模块:经预处理的图像采用Adaboost人脸检测方法获取人脸,并对裁剪出的人脸图像进行标记。
人脸注册模块:经过训练后可以输入姓名,然后可连续录制十张照片,并按照人脸检测中的步骤提取出10张人脸照片保存到SD卡中,将人脸姓名和编号按顺序写入faceN.txt文件中。
人脸识别模块:根据测试者人脸图像计算人脸LDP特征,得到识别结果。如果测试者的人脸特征在我们设置的阈值的内则,输出识别人脸的姓名,否则提示人脸库中无此人,请摆正人脸配合识别。
本文设计并实现了基于Android的人脸识别系统。针对Android平台的硬件能力有限的特点,开发了一种适用于Android平台的系统资源消耗较少的人脸识别系统。系统开发过程中主要使用了Adaboost人脸检测算法和基于LDP特征脸的人脸识别算法,采用OpenCV视觉开源库在Android平台上加以实现,目前该入脸识别系统已经达到较高的识别水平,具有很好的实用性和应用前景。
参考文献
[1]陈会安,李强.Java和Android开发实战详解[M].北京:人民邮电出版社,2014.
[2]HUGHES A.Android mobile security:a comprehensive evaluationof its feats and flaws[D].UTICA COI.I.EGE,2015.
[3]赵丽红,刘纪红.人脸检测方法综述[J].计算机应用研究,2004,21(09):l-4.
[4]张恒喜,史争军.基于SQlJte的Android数据库编程[J].电脑编程技巧与维护,2011(21):30-31.
作者单位
酒泉职业技术学院 甘肃省酒泉市 735000