基于CUDA的快速人脸检测算法

2013-08-23 10:46孙立超张盛兵程训焘
计算机与现代化 2013年8期
关键词:级联线程人脸

孙立超,张盛兵,程训焘,张 萌

(西北工业大学计算机学院,陕西 西安 710129)

0 引言

随着计算机科技的发展,新的信息技术和媒体手段不断出现,这使得包括人脸分析在内的智能人机交互不仅成为可能,而且飞速发展。人脸检测作为人脸分析的第一步,负责数字图像中人脸的检测和定位,是目标检测技术的一个特例。2001年剑桥大学的Viola和Jones提出了第一种快速实时的目标检测方法——Viola-Jones级联分类器[1],其主要贡献是将 3个关键方法和概念应用在人脸检测中:积分图、Ada-Boost算法[2]和分类器级联。虽然此方法在CPU上已经实现了很快的检测速度,但随着图像分辨率的不断提高和人脸检测应用的发展,CPU平台已经无法满足快速检测的需求。

基于GPU的并行计算正被广泛应用于各种计算密集型的应用中。针对人脸检测内在并行性的特点,越来越多的人考虑运用并行计算的方法来加速人脸检测。随着高性能GPU的快速发展,Nvidia公司在2007年推出 CUDA 计算平台[3-5],研究者很快将目光转向基于CUDA平台的人脸检测。

文献[6]在FPGA上实现了人脸检测系统的并行加速,对于640×480像素的视频流实现了6.96帧每秒的检测速率,但是当图像尺寸变化时,系统需重新修改,设计开销较大。文献[7-9]设计的GPU加速人脸检测方法,取得了一定的加速效果,但其存在GPU负载不均衡的问题,加速效果并不理想。针对上述情况,本文在CUDA平台下实现一种基于Viola-Jones级联分类器的并行人脸检测方法,显著提高了检测速率,而且通过降低并行粒度,有效地解决了负载不均衡的问题。

1 人脸检测算法

人脸检测的方法可以大致分为基于特征和基于图像两类。基于特征的方法是以某种特征为处理对象,而基于图像的方法是以图像中的像素为处理对象。

1.1 Haar-like特征矩形

Viola-Jones级联分类器方法是一种基于 Haarlike特征的人脸检测算法。本文采用的5种Haarlike特征矩形如图1所示,白色区域像素值的和减去黑色区域像素值的和得到的差值称为特征矩形的特征值。由于人脸五官相互之间在颜色、形状和位置分布上都有着明显的差异,而且人脸本身和外界非人脸的杂乱信息相比具有极高的规律性,因此可用特征矩形的特征值作为人脸判断的依据。

图1 Haar-like 特征矩形

1.2 积分图

特征矩形的特征值计算是人脸检测过程中的重要一环。通过引入积分图,可将一个矩形区域内像素值和的计算简化为固定次数的加减运算。积分图上点ii(x,y)和矩形区域内像素值和S的计算如公式(1)、公式(2)所示:

其中,i(x',y')表示源图像(x',y')点的像素值,(xA,yA)、(xB,yB)、(xC,yC)和(xD,yD)分别为矩形区域左上、右上、左下和右下角的坐标。

1.3 Adaboost算法

给定一个训练集和一个特征矩形集合,任何机器学习方法都可以从中学习并生成一个分类器函数f=(X,θ),X为特征矩形,θ为阈值,函数 f的返回值由X的特征值与θ的大小关系决定。由于尺寸和位置的变化多样,特征矩形的数目众多,但是大部分特征矩形覆盖的均是非人脸特性。Adaboost算法被用于挑选覆盖人脸特性的特征矩形,构成弱分类器,并将若干个弱分类器级联构成一个强分类器,通过迭代学习获得合适的阈值和分类函数返回值,从而得到简单高效的分类器,进而大幅提高人脸检测速度。

1.4 级联分类器

由于本文重点在于人脸检测过程的并行加速,因此未自行训练生成分类器,采用 OpenCV[10-11]开源软件自带的正向人脸级联分类器,可通过软件安装获得。该分类器由20级强分类器级联构成,每级强分类器由若干个弱分类器组成,每个弱分类器包含两个特征矩形,窗口大小为20×20。级联的强分类器构成了一个决策树,每一级的强分类器尽可能多地排除确定非人脸的扫描窗口,只有通过所有级的强分类器的扫描窗口才被检测为人脸,整个运行过程如图2所示。通过将级联分类器设定为前级简单后级复杂的结构,可有效地减少运算量,从而提高检测速率。

图2 级联分类器

2 基于CUDA的人脸检测算法实现

人脸检测可以大体分为5部分:分类器和源图像的加载、积分图的计算、扫描窗口的检测、分类器的放大修正和人脸窗口的合并,其中积分图的计算、扫描窗口的检测和分类器的放大修正均可在CUDA平台下实现并行加速。

2.1 积分图计算的CUDA实现

对于积分图的计算,本文采用先行后列的积分算法,有效避免了数据相关性。行积分和列积分分别由两个Kernel实现。每个线程负责一行或一列的积分,线程直接没有相关性,不需要线程同步,具有较高的并行效率。但是由于CUDA中线程是以warp(32个线程)为单位调度的,行积分中同一warp内的线程需要按列访问源图像数据,数据不连续,需拆分成多次访问,效率较低,积分结果写回也存在相同的问题。如图3所示,本文利用共享存储器对行积分过程进行访存优化。

图3 行积分共享存储器优化图

图3中,源图像的宽度为M,block内线程数为N,共享存储器规模为N×N,block负责的N行M列数据被分为个N×N个数据块。对于每个数据块,首先block内线程将其按行读入到共享存储器,然后对共享存储器按列访存做行积分,最后将共享存储器中的积分结果按行写回全局存储器。由于共享存储器可实现高效列访存,共享存储器均为行访存,因此访存效率得到了有效的改善。

2.2 扫描窗口检测的CUDA实现

人脸检测过程中扫描窗口的检测相互独立,每个扫描窗口的检测可由一个线程完成,GPU可以保证大量线程的同时执行,理论上说可以取得非常可观的并行加速效果,但实际并不理想。因为级联分类器的设计思想是通过前级简单分类器尽可能多地排除非人脸窗口,减少后级复杂分类器的任务量,从而减少检测时间,而GPU上的执行单元采用的是SIMD结构,线程以warp为单位进行调度,同一warp内不同线程负责的扫描窗口分类器执行级数差距很大,warp总的执行时间由执行级数最大的线程决定,负载非常不均衡,大大降低了GPU的加速效果。

本文通过降低线程并行粒度为分类器,引入重映射数组均衡线程负载,尽可能地发挥GPU的并行性能。具体过程如图4所示,GPU上线程只负责一级分类器(Stage)的检测,线程i负责执行扫描窗口RemapIndex[i]的检测任务,FacialResult[i]是线程 i的检测结果。GPU每执行完一级分类器后,CPU根据检测结果,是将人脸的扫描窗口编号依次存入重映射数组RemapIndex,然后调用GPU进行下一级分类器检测,重复上述过程,直到分类器全部执行完毕或扫描窗口全为非人脸为止。

图4 扫描窗口重映射图

虽然并行粒度的降低有效地减少了扫描时间,但也引入主机端(CPU)和设备端(GPU)之间额外的数据通信开销。相对于设备端而言,该部分额外开销包括重映射数组的写入和检测结果的传出,均可通过零拷贝技术[12]优化掉。零拷贝技术是指存在于主机端的映射内存同时拥有主机端和设备端两个地址,设备端程序可以直接访问映射内存,而不再需要数据拷贝。由于映射内存资源较少,分配太多反而会导致系统性能下降,本文只对检测结果进行零拷贝技术优化。

2.3 分类器放大修正的CUDA实现

为检测不同大小的人脸图像,需将图像分解为不同尺寸的多批扫描窗口,对每批扫描窗口分别进行检测,最终通过人脸重复窗口合并得到人脸的相关信息。分类器窗口的原始尺寸为20×20,检测完一批扫描窗口后,分类器窗口需按比例放大,实际是放大分类器中特征矩形,由于舍入误差,放大后的特征矩形中矩形面积与权值乘积之和可能不再为零,需要进行权值修正处理。

分类器的放大修正相互独立,每个特征矩形由一个线程负责,负载任务均衡,具有很好的并行性能。因为分类器放大修正的执行结果直接保存在GPU全局存储器内,所以不仅减少了运算时间,而且还消除了分类器从CPU到GPU的传输时间,从而进一步提高了人脸检测速率。

3 实验与结果分析

本文采用CMU人脸库[13]对人脸检测程序进行了检测率和误检率的测试,采用不同尺寸的同幅图像测试人脸检测程序的检测速率。CMU人脸库是卡耐基梅隆大学提供的用于评估正向人脸检测算法性能的公开人脸数据集。测试环境如表1所示。

表1 测试环境信息表

3.1 检测精度结果与分析

本文选用CMU人脸库中的130幅非倾斜图像,其中人脸数目为489个,其中一幅图像的检测结果如图5所示。

图5 人脸检测结果

图5中共有57个人脸,检测程序给出了58个标记,其中1个为非人脸,则程序的人脸检测率为100%(57/57),误检率为1.72%(1/58)。本文利用CMU人脸库分别对CUDA版本、CPU版本和OpenCV版本的人脸检测程序进行测试,其中CPU版本为自行编写的串行程序,OpenCV版本为开源代码,采用Intel公司的 TBB(Threading Building Blocks)[14]技术进行多核优化。得到的检测率和误检率结果如表2所示。

表2 人脸检测率和误检率

表2中3个版本程序的误检率相当,CUDA版本的检测率与CPU版本相近,比OpenCV版本略低一些,但仍在可接受范围之内。存在差异的原因是本文为提高检测速率,在CUDA和CPU版本中采用了两种不同于OpenCV版本的处理方式:(1)将程序中的一些浮点中间变量由双精度改为单精度;(2)将扫描窗口检测部分中的一些重复操作合并转移到分类器放大修正部分,使得一些先乘后除的操作变为先除后乘操作,形成了一定的积累误差。

3.2 检测速率结果及分析

本文采用不同尺寸的同一幅人脸图像对3个版本的人脸检测程序进行测试,执行时间如表3所示,时间单位为秒。

表3 人脸检测速率表

CUDA和OpenCV版本相对于CPU版本程序的加速比如图6所示。

图6 CUDA和OpenCV版本的加速比图

从图6中可以看出,随着图像尺寸的增大,OpenCV版本相对于CPU版本的加速比一直保持在5左右,而CUDA版本的加速比不断增加,效果明显好于OpenCV版本。这说明TBB技术的加速性能是非常有限的,相比而言,CUDA技术更适合高清图像的实时检测。

4 结束语

本文实现了基于Viola-Jones级联分类器的CUDA人脸检测程序,有效解决了级联分类器造成的GPU负载不均衡的难题,取得了非常好的加速性能,与OpenCV开源库程序相比实现了1.58~4.56倍的加速比。

虽然本文有效地实现了GPU负载均衡,但是同级分类器中分支较多的问题还没得到有效解决。今后,笔者将通过修改分类器结构和改进实现方法来减少分支,从而进一步提高检测速率。

[1]Viola P,Jones M.Rapid object detection using a boosted cascade of simple feature[C]//Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision and Pattern Recognition.2001:511-518.

[2]Freund Yoav,Schapire Robert E.A short introduction to boosting[J].Journal of Japanese Society for Artificial Intelligence,1999,14(5):771-780.

[3]Rob Farber.高性能CUDA应用设计与开发[M].于玉龙,唐堃译.北京:机械工业出版社,2012:2-16.

[4]NVIDIA.CUDA_C Programming Guide[EB/OL].http://docs.nvidia.com/cuda/cuda-c-programming-guide/,2013-04-02.

[5]Jason Sanders,Edward kandrot.GPU高性能编程CUDA实战[M].聂雪军,等译.北京:机械工业出版社,2011:27-41.

[6]Junguk Cho,Shahnam Mirzaei,Jason Oberg,et al.FPGA-based face detection system using Haar classifiers[C]//Proceedings of the ACM/SIGDA International Symposium on Field Programmable Gate Arrays.2009:103-112.

[7]Kong Jiangang,Deng Yangdong.GPU accelerated face detection[C]//International Conference on Intelligent Control and Information Processing.2010:584-588.

[8]Sharma B,Thota R,Vydyanathan N,et al.Towards a robust,real-time face processing system using CUDA-enabled GPUs[C]//International Conference on High Performance Computing.2009:368-377.

[9]Bayazit M,Couture-Beil A,Mori G.Real-time motionbased gesture recognition using the GPU[C]//Proceedings of the IAPR Conference on Machine Vision Applications.2009:9-12.

[10]OpenCV.The OpenCV Reference Manual 2.3.0[EB/OL].http://opencv.org/documentation.html,2012-02-05.

[11]Bradski G,Keahler A.Learning OpenCV:Computer Vision with the OpenCV Library[M].O’Reilly,2008:506-516.

[12]张舒,褚艳利,赵开勇,等.GPU高性能运算之CUDA[M].北京:中国水利水电出版社,2009:152-163.

[13]CMU.Frontal Face Images[DB/OL].http://vasc.ri.cmu.edu//idb/html/face/frontal_images/index.html,1998-01-08.

[14]Wikipedia.Intel Threading Building Blocks[EB/OL].http://en.wikipedia.org/wiki/Intel_Threading_Building_Blocks,2013-01-08.

猜你喜欢
级联线程人脸
有特点的人脸
三国漫——人脸解锁
浅谈linux多线程协作
级联LDPC码的STBC-OFDM系统
基于级联MUSIC的面阵中的二维DOA估计算法
马面部与人脸相似度惊人
长得象人脸的十种动物
LCL滤波器在6kV级联STATCOM中的应用
H桥级联型STATCOM的控制策略研究
基于上下文定界的Fork/Join并行性的并发程序可达性分析*