基于嵌入式系统的人脸检测算法研究
2018-01-22方仲秋
方仲秋
摘 要:文章在A8处理器作为硬件平台,嵌入式Linux操作系统作为软件平台的基础上深入研究了AdaBoost人脸检测算法,并对其进行了优化改进,采用遗传算法消除了冗余弱分类器,形成了最终的强分类器。
关键词:人脸检测;嵌入式系统;AdaBoost
人脸识别技术不断进入大众视野。苹果新机iPhone X具备“刷脸”解锁功能,并且可运用到Apple Pay以及各种需要身份验证的APP中;首个“刷脸”支付的商用试点也在杭州一家肯德基餐厅开启;一些银行正尝试启用自动取款机“刷脸”取款功能;高铁检票、宾馆入住也在使用“刷脸”技术。人脸识别已经在人们衣食住行的各个领域发力,迎来运用的“井喷期”。本文针对嵌入式系统的应用平台,对人脸检测算法进行了改进和优化,并在嵌入式开发板上对改进后的算法进行了性能评测,效果良好。
1 AdaBoost人脸检测算法的原理
1.1 AdaBoost人脸检测算法的特点
采用积分图方法对Harr-like矩形特征值进行计算,方便快速;采用AdaBoost机器学习算法寻找出分类特征,利用这些分类特征生成弱分类器,然后将弱分类器进行叠加构成强分类器;强分类器通过串联的方式合成为分类效率高、结构复杂的级联分类器;使用最后产生的级联分类器对人脸待测图像进行搜索,可以快速排除掉不包括人脸的背景区域,大大节省了检测时间[1]。
1.2 AdaBoost人脸检测算法的检测过程
(1)加载人脸待测图像和级联分类器。(2)将人脸待测图像中YUV格式的像素值用八位灰度值表示,即转化为灰度图像。(3)对转化后的待测图像进行扫描并采用积分图方法对Harr-like矩形特征值进行计算。(4)对待测图像进行分步检测,首先按照一定的策略对整幅图像使用一定规格的子窗口进行检测,然后按照一定比例对子窗口的尺寸进行扩大,直到当前待测图像和检测窗口大小一致;子窗口对待测图像的检测过程,实际上就是由简单到复杂的过程,首先对比较明显的分类特征进行选择,去除大部分不包括人脸的背景区域,然后经过多级分类器的筛选,最终对待测图像是否存在人脸及存在的个数做出判断。(5)最后对待测图像中人脸的位置及大小进行确定。(6)分割人脸区域。
2 嵌入式平台上人脸检测算法的优化
2.1 代码的优化
2.1.1 消灭重复计算
通过分析工具,找出最影响速度的代码段,有针对性地优化。一般来说是判断窗口是否是人脸的代码最耗时,因为调用次数最多。代码里首先要消灭的是重复计算,如代码
int b1=pixels[y×step+x]-pixels[y×step+x+1];
int b2=pixels[y×step+x+2]-pixels[y×step+x+3];
可以写为
int offset=y×step+x;
int b1=pixels[offset]-pixels[offset+1];
int b2=pixels[offset+2]-pixels[offset+3];
2.1.2 展开循环
如果循环次数是固定的,可以去掉for循环,直接展开。代码行数虽然多了,但是少了for循环的条件判断,可以加速,例如可加速10%~20%。另外可以在设计分类器的时候,就把这些因素考虑进去,由训练程序生成的强分类器包含固定数目的弱分类器,或者某种规律数目的弱分类器,这样有利于检测代码优化。
2.1.3 利用SIMD指令
无论Intel CPU还是ARM CPU,都有单指令多数据(Single Instruction Multiple Data,SIMD)指令。利用这些指令,可以一次算多个数据。例如两个byte向量相加,支持128位的SIMD指令可以一次算16个byte的加法,理论上可以加速16倍。人们常用的加速利器积分图,其构建过程很难用SIMD加速。如果有更好的策略,可以果断抛弃积分图。
2.1.4 多核并行运算
共享存储并行编程(Open Multi-Processing,OpenMP)或者Inter线程构建模块(Thread Building Blocks,TBB)可以讓人们充分利用CPU的多个内核进行并行运算,提升速度。但用了OpenMP或TBB,未必可以加速,或未必可以加速到期望的倍数。多核并行,任务的拆分的粒度应该尽可能粗,不同的任务尽可能不用同一块内存,也就是任务之间的相关度低一些有利于加速。举个例子:如果两个矩阵相加,按像素进行并行操作,加速效果会很糟糕;如果按行并行,效果会好很多,但不要按列并行。
2.2 分类器的训练优化
AdaBoost人脸检测算法在嵌入式平台上的实现训练过程既复杂又耗时,由此产生的级联分类器也特别庞大,鉴于嵌入式系统的存储空间有限,需要对级联分类器训练进行改进。本文采用AdaBoost算法选取特征弱分类器,通过遗传算法来消除冗余弱分类器,同时学习相应的权值,权值和借助于遗传算法择优之后的弱分类器线性组合之后得到最终的强分类器。AdaBoost特征数目可以通过遗传算法所具有的全局寻优能力来实现有效地减少,从而减少计算量[2]。
2.3 单训练样本人脸识别模型的优化
单训练样本人脸识别问题,由于每个人都只有一幅人脸样本图像,没有充分具有代表性的一定数量的训练样本,采用一些常用的方法识别率将明显下降,有的甚至不适用。针对这一情况,本文在单样本人脸识别中引进了一些几何变换增加虚拟样本的数量,同时使用二维主成分分析,提取更利于进行分类的特征,大大提高了单训练样本人脸识别中的准确率和辨识率[3]。
3 实验分析endprint
为了验证优化后的AdaBoost人脸检测算法在嵌入式应用平台的有效性,本文在嵌入式环境下对人脸检测的检测速度和准确度进行了统计分析。实验平台的CPU选用了ARM A8处理器芯片,主频800 MHz,内存512 M,最高工作频率1 GHz,系統开发环境为Linux3.2.0版本。实验采用摄像头采集的图片,图片背景复杂而且成像随机,选用CMU数据库测试检测率。AdaBoost人脸检测原始算法和优化算法的检测率如表1所示。
本文通过选取同一张照片的不同分辨率对检测时间进行测试,检测结果如表2所示。
由表1和表2可以看出,优化后的AdaBoost人脸检测算法所构建的级联分类器能够以更快的检测速度完成检测功能,而且随着分辨率的提高,检测时间明显缩短。在鲁棒性方面,本文采用的AdaBoost人脸检测优化算法没有利用图像色彩对人脸进行检测,而是使用了图像的灰度信息,较好地避免了色彩对检测过程的干扰。部分图片的检测结果如图1所示。
4 结语
本文主要对AdaBoost人脸检测算法及其在嵌入式平台上的优化改进技术进行了研究分析,为人脸检测算法在嵌入式环境的应用提供了理论依据和解决方案。随着嵌入式技术的发展,对人脸检测技术的研究还将进一步深化,实现适合特定环境的高效算法,充分利用图像的灰度信息和色彩信息进行检测,提高人脸检测的精确度。
[参考文献]
[1]卢鑫.基于嵌入式系统的人脸检测算法研究与实现[D].西安:西安科技大学,2016.
[2]王芹芹.面向嵌入式系统的人脸识别算法性能优化研究[D].北京:中国石油大学,2010.
[3]张忠.Adaboost人脸检测算法在嵌入式平台上的实现与研究[D].上海:上海交通大学,2008.
Abstract:Based on the A8 processor as the hardware platform and the embedded Linux operating system as the software platform, this article studies the AdaBoost face detection algorithm in-depth and optimizes it. The genetic algorithm is used to eliminate the redundant weak classifier, formed the final strong classifier.
Key words:face detection; embedded system; AdaBoostendprint