首页 > 范文大全 > 正文

基于GPU加速的并行人脸检测

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于GPU加速的并行人脸检测范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要 本分针对传统的人脸检测算法计算复杂度高,实现速度慢的缺点,提出了一种使用图像处理器(GPU)加速的并行人脸检测算法,并在GPU上使用OpenCL实现了这个算法,同时在GPU多线程和内存模型上对算法进行了优化。实验结果表明,对比CPU上单线程的优化实现,可以获得10倍~40倍左右的加速比,达到了实时的要求.

关键词 GPU;OpenCL;AdaBoost

中图分类号TP391 文献标识码A 文章编号 1674-6708(2011)55-0205-02

0 引言

人脸检测是指对于一幅任意给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果是则返回人脸的位置、大小和姿态 [1]。Viola和Jones提出的算法[2]是人脸检测领域的一个里程碑,它主要有3个方面的贡献:一是提出了一种基于AdaBoost的学习算法,用于训练分类器;二是积分图像的提出;三是级联分类器的设计。这种方法在速度上比以往有较大提升,但是还远不能达到实时级别的应用。OpenCV库中应用了OpenMP技术,利用多核CPU加速算法,但是结果不太理想,在VGA图像(640 x 480)格式下,检测速度只有1.78FPS[3]。Junguk Cho等人利用FPGA实现了人脸检测[4],速度上有较大提升,但是FPGA硬件成本过于昂贵。近年来,随着图形硬件的可编程性越来越高,gpu的通用计算能力得到了很大提高。GPU拥有超强的浮点运算能力,特别适合于大规模数据的并行处理。本文提出了一种基于GPU和Viola-Jones算法的高效并行解决方案。

1 Viola-Jones人脸检测系统

该系统的第一阶段是用AdaBoost学习算法训练出一个级联分类器,第二阶段是使用这个分类器,在待检测图片中搜索人脸。其中第一阶段是离线进行的,因而分类器的训练对检测速度并无直接影响,本文的讨论集中于第二阶段,即搜索阶段。搜索阶段流程如图1。

1.1 矩形特征

矩形特征可用于编码图像定区域中的状态。使用简单矩形组合作为特征模板,特征模板的特征值定义为黑色区域像素和与白色区域像素和之差。

特征模板可以在子窗口内以任意尺寸任意放置,每一种形态称为一个矩形特征。一个矩形特征就是一个弱分类器,许多弱分类器组合在一起就是一个强分类器。

人脸检测的过程就是扫描各个子窗口,根据训练得到的分类器,计算相应特征值,与训练所得的阈值相比较,从而判断待检测子窗口是否包含人脸。

1.2 积分图

矩形特征的数量是相当巨大的。要计算一个特征的特征值,需要计算出各个矩形内像素值之和,这个计算量也相当大,使用积分图可以快速完成以上运算。在积分图中,点(x,y)的积分值定义为某点左上方所有像素之和,即:

其中ii(x,y)代表点(x,y)处的积分值,i(x,y)代表点(x,y)的初始像素值。如果使用积分图像,任何矩形中的像素和都能通过4个顶点的积分图像值在常数时间内计算出来。

1.3 级联分类器

级联分类器是一种多层结构的分类器,每一层分类器所包含的特征数量逐渐增多。其思想就是在前期用尽可能少的运算量,将明显的非人脸区域快速地筛选掉,留下来更有可能包含人脸的子窗口,进行后续更加复杂的计算。

2 GPU并行检测算法与实现

2.1 积分图的并行计算

Blelloch等人给出了一个并行前缀求和算法[5]。而积分图像的计算实质上是一个二维前缀求和问题,我们对于Blelloch等人给出的算法加以改进,这里计算积分图可分为两步扫描。首先对图像的每一行进行并行前缀求和,在此基础上,对每一列执行并行前缀求和操作。算法流程如下:

2.2 子图像并行检测

串行的人脸检测算法用一个检测窗口去扫描图像中任意可能存在人脸的位置,并且检测窗口需要逐层等比放大以检测出不同大小的人脸图像。然而,不同位置、不同大小的子图像并没有相互依赖关系,可以进行并行处理。1.3节中描述的级联分类器是由很多个stage组成的,只有通过了当前stage的子图像才能进入到下一个stage,所以不同stage间需要串行处理,最后通过所有stage的子图像会被判定为人脸。算法如下

2.3 OpenCL实现

将分类器用OpenCL中的数据流表示,一个矩形区域可以表示为float4类型,4个分量分别存储矩形特征的左上角位置(x,y)和矩形大小(width,height),在检测中数据流被存储在device的global memory中,从而GPU的所有thread都可以访问这些数据流。每一个stage处理完待检测子图像以后,将检测结果以BOOL的形式存储在global memory中,kernel函数之间的信息交互就通过global memory完成。整个OpenCL数据流可用下图表示:

3 实验结果

本文的实验平台为Intel Q660 @2.4GHz CPU,ATI Radeon HD5870 GPU,4GB内存,操作系统为Windows 7 32 bit,使用了CMU Test Set库中的图像作为测试材料,对于不同分辨率的图像,分别运行CPU和GPU人脸检测。结果表明,GPU在保证了检测率的同时,检测速度也大大增加,实验结果如下。

4 结论

本文介绍了人脸检测算法的基本原理,以及对于AdaBoost算法的并行化改造,又在GPU上实现了并行的人脸检测算法。 实验数据表明,并行的方法能够显著提高人脸检测的速度。而且,使用GPU来进行并行计算,不仅可以应用于人脸检测,在数字图像处理、信号处理等领域也有广阔的应用空间。

参考文献

[1]Yang MH, Kriegman D, Ahuja N, Detecting faces in images: A survey, IEEE Trans Pattern Analysis and Machine Intelligence, 2002, 24(1): 34-58.

[2]P.Viola, M.Jones.“Rapid Object Detection using a Boosted Cascade of Simple Feature,”in Proceeding of the IEEE Computer Society Conference on Computer Vision and pattern Recognition, Kauai, Hawaii, USA,2001:511-518.

[3]Jesse Patrick Harvey.GPU acceleration of object classification algorithms using nvidia puting Engineering, 2009.

[4]Junguk Cho, Shahnam Mirzaei.Fpga-based face detection system using haar classifiers.Processing of the ACM/SIGDA international symposium on Filed programmable gate ways, 2009.

[5]Guy E.Blelloch.Prefix sums and their aplications. In: J.H.Reif, Synthesis of Parallel Algorithms(Morgan Kaufmann: San Francisco, CA, 1993), 1993.

[6]AdaBoost./wiki/AdaBoost.

[7]AMD.Ati Stream SDK./zones/OpenCLZone/Pages/default.aspx.