龚哲兮,施彦媛
(中国电子科技集团公司第三十研究所,四川 成都 610041)
随着人工智能和图像处理领域技术的发展,人脸识别作为生物识别技术的一种,由于具有唯一性、稳定性和不易被复制等良好的特性已经广泛运用于人机交互、金融贸易、视频监控等各个领域。同时,由于近些年计算机硬件飞速发展,嵌入式设备的处理器的运算速度和存储空间得到了提升,嵌入式设备上的人脸识别技术也愈发成熟[1]。但是,主流的国外CPU、专用芯片、操作系统等对我们来说类似黑匣子,其安全性难以保障。为摆脱对国外技术的依赖,采用瑞芯微RK3288 芯片架构、中兴CEGL linux3.10 操作系统,在国产化平台下对人脸识别系统进行研究、设计及实现。
人脸识别技术(Face Recognition Technology,FRT)通过计算机与各种传感器和生物统计学原理等高科技手段进行个人身份鉴定,其核心技术是局部特征分析和图形识别算法[2]。而在对人脸识别前需要对图像进行一系列处理,包括人脸图像采集、人脸区域检测以及图像预处理等[3]。嵌入式平台中通常在非受控的环境下进行人脸采集,为保证能够稳定地提取其特征值,一般要对采集的原始人脸图像进行灰度化、二值化、滤波等图像预处理。然后将人脸数据从原始输入空间映射到新的特征空间以提取人脸特征,最终将其结果与特征库进行比较,计算其相似度来确定其身份。为在嵌入式平台上实现人脸识别的技术,系统主要包括注册阶段和识别阶段两个阶段。整体框架设计如图1 所示。
图1 人脸识别系统总体框架
系统的主处理器单元基于瑞芯微RK3288 处理器为核心进行设计。瑞芯微RK3288 处理器是数字多媒体处理器芯片,采用四核ARM Cortex-A17 架构,最大的特点是与Cortex-A15 一样采用完全乱序执行架构,性能提升立竿见影。单核主频高达1.8 GHz,集成专用GPU 协处理器,GPU 采用Mali T76X 系列GPU。Mali T764 核心最大特点是采用第三代Midgard 架构,配置丰富的数据接口和多媒体接口。主处理器模块配置2 GB DDR3 内存、32 GB Nand Flash、10/100/1 000 Mb/s 以太网接口、MIPI液晶接口、UART 串口以及I2C 等接口。主处理器模块依据MXM 标准,尺寸为82 mm×60 mm,采用+5 V 单电源供电。系统硬件设计框图如图2 所示。
U-Boot 主要用来开发嵌入式系统的bootloader(引导装载程序)。本系统U-Boot 将从NAND Flash 中加载并启动,把最核心的启动程序放在NAND 闪存的前4K中,并在启动前完成硬件平台的核心配置,然后将启动代码的剩余部分搬到RAM 中运行。初始化NAND闪存,并从NAND 闪存中把U-Boot 搬移到SRAM 中,最后需要让U-Boot 支持NAND 闪存的命令操作。内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。本系统使用中兴提供的CEGL linux3.10 并进行相应裁剪,内核中特定于体系结构的部分首先执行,设置硬件寄存器、配置内存映射、执行特定于体系结构的初始化,然后将控制转给内核中与体系结构无关的部分。根文件系统是内核启动时所挂载的第一个文件系统。本系统的根文件系统类型为ext4 格式,同时包含着系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件。最后,将闪存MTD驱动程序、摄像头、触摸屏等设备的驱动程序以及Qt 和opencv,通过交叉编译后移植到系统中。
图2 系统硬件设计
应用程序需要实现人脸识别功能,主要实现人脸图像采集、图像识别、信息管理和人机交互4 个主要功能。基于UVC 协议和Video4Linux2 接口,通过USB 摄像头采集图像,通过人脸检测算法AdaBoost 对其采集的图像中对人脸进行定位,并使用LBP 特征提取,结合SVM 分类器识别人脸,最后将识别后的图像信息进行管理并最终反馈给用户,形成一个完整的人脸识别系统。
AdaBoost 人脸检测是使用Haar-like 特征表示人脸,积分图实现特征数值的快速计算,并利用AdaBoost 算法选出少部分关键特征,通过训练训练出多个不同的弱分类器并将其集合成一个强分类器,即构成最终的决策分类器,从而有效提高速度和精度,达到人脸检测的目的[4]。
Haar 特征通常定义为白色矩形灰度和减去黑色矩形的灰度和,对边缘、线段比较敏感,从而用来检测边界、线性和对角特征[5]。积分图是由于一张图片的Haar 特征值的计算量非常大,为了使计算过程变得简单方便而进行的快速计算矩形特征的算法。主要思想是将图像中各个点矩形区域像素之和作为一个数字保存在内存并作为以后的计算索引,从而加快计算速度。每个Haar 特征都对应一个弱分类器,m个特征,n个训练样本就会产生m×n个弱分类器。为选出最优,要确定最优阈值θ和偏置p,公式为:
h(x,f,p,θ)为弱分类器的值,x表示一个检测子窗口,f代表第j个特征在x图像上的特征值,θ表示阈值p=-1 或p=1 表示不等号方向。根据公式判断是否为人脸。N1和N2为人脸和非人脸数目,m1和m2分别表示当前特征人脸和非人脸的平均特征值。经过多次迭代循环训练出足够的最佳弱分类器,然后对训练样本的权重重新调整,循环迭代最终得到一个线性组合的弱分类器,再通过加权合成一个强分类器。
具体算法如下。
(2)训练弱分类器h(x,f,p,θ),计算错误率εt,并选择错误率最小的弱分类器作为最佳,即:
(3)获得最佳弱分类器,确定对应迭代中的参数后,更新权重:
(4)如果ei=0,则表示xi分类正确;ei=1,表示分类失败。
(5)经过T次迭代后,获得T个最佳弱分类器,并最终提升为强分类器:
(6)最终分类器由多个强分类器级联组成形成级联分类器,以提高运算速度和检测精度。全部通过每一级分类器检测的区域则表示为人脸区域。
局部二值模式(Local Binary Pattern,LBP)是从纹理局部近邻定义中衍生出来,用来分析图像纹理特征的一种灰度范围内的纹理度量算子[6]。通过局部区域中心与周边像素灰度值的差异,将局部区域纹理转换为二进制编码。原始的LBP 算子对于像素点其周围3×3 邻域像素点进行纹理描述,其LBP 算子公式为:
当threshold为0 时,每个像素点生成的LBP算子如图3 所示。
图3 像素生成LBP 算子图示
以其灰度作为基准,与其相邻8 个像素点的灰度值比对。如果相邻像素点灰度值大于中心点的灰度值,则对应相邻像素点设置为1;否则,为0。结果按一定顺序转换成8 位二进制和对应十进制,则为中心像素点的LBP 值。但是,基本LBP 算子邻域像素的关联性不够全面,只覆盖了8 个领域像素区域,所以实际使用的是基本LBP 算子扩展后的圆形LBP。圆形LBP 将3×3 扩展到任意邻域像素数目,R半径邻域中N个像素个数,其圆形LBP 算子的编码公式为:
gi的坐标为:
其中gi-gc为第i个邻域像素值与中心像素值的差。圆形LBP 不但具有灰度不变性和旋转不变性,同时对图像的整体灰度单调变化具有鲁棒性,具有较强的纹理描述和分类能力。
不同尺度的圆形LBP 算子,如图4 所示。
图4 不同尺度的圆形LBP 算子
LBP 在特征提取上是个有效方法,但在分类性能上存在不足。分类器对提取的特征向量进行分类处理,采用不同的学习方法建立模型,所以将LBP与分类器SVM 结合来提高图像的识别率。SVM 构造多个最优超平面对样本进行分类,同时最大化样本到超平面的距离。低维空间线性判别函数形式为g(x)=wTx+b,在线性可分的情况下,通过简单的几何变换得知两类样本之间的分类间隔为Margin=2/||w||。容易得知,要使得对所有样本能够正确分类,就是求得分类间隔大小在 满 足yi(wTxi+b)-1 ≥0,i=1,2,…,n条件下的最小值。通过构造一个Lagrange函数:
经过系列推导可获得最优分类函数:
sgn()为符号函数,非零Lagrange 因子ai对应的样本向量xi。b*可以根据任一个支持向量或两类中任一对支持向量取中值求得。根据支持向量和分类函数构造出最优分类面,将训练样本正确分开,不同训练样本则得到不同的最优分类面和支持向量。如今SVM 已经扩展到解决非线性可分的多分类问题,将其输入向量经非信息变换映射到另一个高维空间,变换后寻找最优的分类面。
Opencv 是一个由C/C++编写并可运行在linux/window/mac 等操作系统上开源的计算机视觉库,同时提供了python、ruby、matlab 等其他语言的接口。Opencv 包含了500 多个函数,覆盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、摄像机标定、机器人、信息安全以及用户界面等。Qt 是一个开发的跨平台C++图形用户界面应用程序开发框架。本系统通过Qt 调用OpenCV 编程实现从视频中采集样本保存到人脸库(getSampleFromVideo)、从视频中识别人脸(recognizeFromVideo)、获取样本身份(getSampleName)等功能。在人脸预处理模块中调用cv::VideoCapture 采集视频帧、调用cv::cvtColor 实现灰度转换、调用cv::qeualizeHist 实现直方图均衡化。在人脸、双眼检测模块中,分别调用OpenCV 中的CascadeClassifier 函数(级联分类器),加载haarcascade_frontalface_alt.xml 和haarcascade_eye_tree_eyeglasses.xml 文件检测人脸和双眼。通过人脸对其模块、特征提取模块后,最终调用cv::compareHist 实现特征匹配模块。该系统用户界面如图5 所示。
图5 系统界面
分别从ORL、Yale 和FERET 人脸库中随机选取300 个人的脸部图像做训练样本,每人6 张图片共1 800 张图片作为图像训练集,并测试LBP、PCA、ICA、FIsherface 和文中算法平均识别率。结果表明,通过圆形LBP 提取图像纹理特征,并通过SVM 分类器来识别人脸的成功率明显高于直接通过LBP、PCA、FIsherface、ICA 的识别率高。
表1 人脸识别测试结果
随着时代的发展,计算机拟人视觉功能、图像的处理与识别将有十分广阔的发展前景。本文详细分析了人脸识别的主要流程与算法,编写LPB 特征提取模块,并通过Qt 调用OpenCV 的人脸识别模块,使得在基于RK3288 芯片架构、中兴CEGL linux3.10 操作系统国产化平台下实现了人脸检测和人脸识别等功能。LBP 与SVM 结合的人脸识别算法对周围环境的变化具有鲁棒性,同时也能在上述国产化平台下快速运行,为以后相似设备的国产化提供一定的参考。