基于嵌入式平台的实时人脸检测系统

2011-12-27 08:16张洪杰刘卫光
中原工学院学报 2011年4期
关键词:人脸分类器嵌入式

张洪杰,刘卫光

基于嵌入式平台的实时人脸检测系统

张洪杰,刘卫光

通过对实时人脸检测算法AdaBoost和库OpenCV的分析,设计并实现了在Intel PXA 270核心板上的嵌入式实时人脸检测系统.该系统不依赖图形界面,使用V 4L和FrameBuffer直接读取和显示视频图像,根据嵌入式平台特点优化程序执行效率,并解决了OpenCV 1.0版本在嵌入式平台中部分函数不能正确执行的问题,在一定程度上达到了实时性和检测精度的同时提升,具有一定的实用价值.

实时人脸检测;PXA 270;嵌入式;OpenCV;AdaBoost;V 4L;FrameBuffer

(中原工学院,郑州 450007)

人脸检测是指在一幅输入的图像中找到人脸的坐标位置和它的大小的过程[1].近年来,人脸检测的应用背景已经远远超出了人脸识别系统的范畴,在图像检索、数字视频处理、视觉检测等方面有着重要的应用价值[2].传统的嵌入式平台检测系统是使用嵌入式设备作图像采集,通过网络方式传输到服务器端进行处理并检测;而随着嵌入式硬件设备性能的不断提高,可以使用嵌入式设备采集到图像之后直接进行处理,以减轻服务器端的压力,而且能够设计成便携式的人脸检测设备[3].

本文在 Intel PXA 270硬件平台上,利用嵌入式Linux操作系统和开源计算机视觉类库OpenCV的特点,设计了嵌入式平台实时人脸检测系统.这里先介绍对AdaBoost方法的具体算法分析,然后通过对Linux平台的实时人脸检测系统进行分析设计,最后从软件设计方面着手,设计并实现了arm-Linux平台的实时人脸检测系统.

1 实时人脸检测算法分析

在人脸检测方法中,灰度、梯度和肤色是常见的人脸检测方法.Viola P和Jones M通过积分图概念的引入[4],提出了基于类 Haar特征和级联结构的 Ada-Boost算法,成功地实现了物体的快速检测,并将其应用于人脸检测领域,实现了实时人脸检测[5].这种检测方法检测率较高,速度较快,准确率也较高,更适合于嵌入式平台的使用,因此这里采用AdaBoost算法.

A daBoost算法的基本思想是将大量的分类能力一般的弱分类器通过一定方法叠加起来,构成一个具有很强分类能力的强分类器[6].而且可以证明,分类器的数量愈大,错误率越低,检测精度就会越高.

A daBoost算法描如下[7]:

这里的αm是一个权重序列;gm(x)是一个二值判别公式,{gm(x)}:X→{-1,+1},它通常由决策树gm(x)=sgn[φm(x)-tm]来实现 ,其中φm(x)表示特征值,tm表示阈值.gm(x)每次构造错误率最低的简单分类器,并进行遍历,其中第m次迭代的最大下降趋向为:

gm(x)=argming(err(m))

而这里的err(m)就是gm(x)和二值判别函数I产生的总错误值,即

其中,二值判别函数为:

最后,更新权重:

得到分类器GAmda(x),最终得到的最优分类步数目为:

2 嵌入式平台的视觉库分析

OpenCV(Intel OpenSource Computer Vision Library)是Intel公司研发的一套开源计算机视觉类库,它是由一些C函数和C++类所组成的,其中包含了一些基本的图像处理算法和计算机视觉算法.代码非常简洁高效,很适合嵌入式平台使用.

在人脸检测之前,需要获取图像,并对获取的目标图像进行预处理,达到增强图像的目的,为下一步的检测做好准备.而OpenCV中包含了很多对图像进行预处理的函数,如灰度处理、中值滤波、尺寸裁剪等.而且源码公开,可以根据实际情况来定制所需要的函数.OpenCV中的图像数据信息都被封装在一个叫做Ip l Image的结构体中,类似于 W indow s系统中的BM P格式,其中包含了图像的通道、像素的位深、图像像素大小等相关信息和图像数据本身.而且其中包含了对Adaboost算法的C语言实现,可以直接通过相应的程序来训练分类器并检测目标图像,大大降低了开发周期,提高了开发效率.

这里选用的是OpenCV的1.0版本,函数实现比较简单,而且绝大多数使用的是纯C函数,执行效率较高,更适合在嵌入式Linux系统中应用.其中一个Haar特征由2~3个具有相应权重的矩形组成,结构体CvHaarStageClassifier作为一个强分类器节点,其中包含了弱分类器的数量、分类器阈值等信息,结构体CvHaarClassifierCascade包含了标志位、级联分类器中强分类器的数目、训练中原始目标的大小、待检测物体的大小、Haar块缩放的尺寸等.

OpenCV中包含的AdaBoost方法的 C语言实现,包括创建所有可能的 Haar特征、从正样本集中载入正样本、从负样本集中载入负样本、计算 Haar特征值和训练一个强分类器等.

这里使用OpenCV中自带的训练程序,在 Red-Hat Linux中编译为可执行程序,就可以直接通过正负样本的输入训练来得到需要的人脸分类器.本文使用的样本是从M IT人脸库挑选的部分样本,来作为输入样本进行训练,正样本共2 000个,负样本4 000个.训练完成的分类器保存在XML文件中,供检测算法读取调用.同时,OpenCV本身也提供了已经训练好的人脸分类器,可供直接使用.

3 检测算法的实现

检测算法主要步骤如图1所示.

图1 检测算法

(1)加载分类器,将训练好的分类器XML文件加载,为下一步的检测做好准备.

(2)读取目标图像,按照 Ip l Image的格式封装,为下一步的扫描做准备.

(3)扫描目标图像,然后用cvhaarobjectdetects函数检测图像中的所有人脸.

使用训练好的级联分类器,在图像中找到包含目标物体的矩形区域,并且将这些区域作为一序列的矩形框返回.函数以不同比例大小的扫描窗口对图像进行若干次搜索,每次对图像中的这些重叠区域进行检测,利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域,因为这样的区域一般不含被检目标,人脸检测中使用这种方法,提高了检测速度.

4 系统设计与实现

本系统的基本设计思路为:通过OV 511驱动把从摄像头获取的一帧图像压缩为RGB编码格式的图像数据,通过V 4L[8]提供的相关函数读取从视频设备获取的数据,然后把得到的RGB格式的图像数据提交给图像处理和检测函数进行处理,处理过的图像数据映射至FrameBuffer,通过FrameBuffer的接口函数将结果直接显示在LCD显示器中.这里没有使用任何的图形界面类库,目的是使系统简洁、高效.系统设计如图2所示.

图2 系统设计框图

根据图2所示设计框图编写程序,在装有Red Hat Linux的 PC上,将OpenCV的源码使用gcc进行安装[9],生成x86下的动态链接库文件,然后进行编译、执行.系统实现的主要流程如下:

流程 1:定义 V 4L视频采集数据结构体 v4l_struct,其中包含了 FrameBuffer设备句柄、Frame-Buffer屏幕可变的信息、FrameBuffer固定不变的信息、video_capability 、video_picture、video_channel 、video_mmap、video_mbuf等信息.

流程2:Video4linux下视频编程的基本流程如图3所示.

图3 视频编程的基本流程图

(1)打开视频设备.使用Linux的读文件函数open函数以读写方式打开视频设备文件.

(2)读取设备信息.使用 ioctl函数的控制符V ID IOCGCAP和V ID IOCGPICT读取设备信息.

(3)更改设备当前设置.设置图像数据格式为RGB24,以方便下一步进行图像处理和检测.

(4)进行视频采集.有2种方法:①内存映射的方法;②直接从设备读取的方法.

这里采用的是使用双缓冲的内存映射方法,使用ioctl函数的控制符 V ID IOCMCAPTURE和V ID IOCSYNC来读取帧数据和进行同步控制.这样通过2帧双通道来完成视频数据的采集工作,在某些场合应用时还可以采用缓冲队列等方式.

通过当前帧号和当前使用情况,2个元素来控制双帧采集,以及采集相关操作函数.

(5)对采集的图像数据进行处理.读取缓冲区中的图像数据,将从缓冲区获得的一帧图像提交给detect函数进行预处理和人脸检测,其中detect函数的执行流程如图4所示.

图4 detect函数的执行流程图

①读取分类器.读取训练好的分类器XML文件,为下一步的检测做好准备.

②创建动态内存块.动态内存块是一个可用来存储诸如序列、轮廓、图形、子划分等动态增长数据结构的底层结构,用来存储检测到的一序列候选目标矩形框的内存区域.

③检测目标图像,进行预处理,然后用cvhaarobjectdetects函数检测图像中的所有人脸.

④扫描图像,获取所有符合特征的人脸,标识人脸区域,并将处理过的图像数据按照RGB24格式返回,为下一步的图像数据显示做好准备.

(6)打开Frame_buffer,实时显示数据;通过打开设备文件“/dev/fb0”,对 FrameBuffer进行相关读写操作,并将处理过的RGB24格式的图像数据通过行扫描和列扫描的方式,实现LCD实时显示处理过的图像.

处理完毕并显示成功后,从缓存区读取下一帧图像并处理显示,这样反复循环,以达到实时显示的目的.

5 嵌入式平台移植

本系统采用的是基于OV511+的网眼2000CMOS摄像头,30万像素,USB插口.开发使用的核心板为Intel PXA270,主频520 M Hz,显示屏为256色彩色液晶屏(320×240像素)的STN LCD设备.PXA270是 Intel XScale系列芯片,它属于ARM的V5TE体系,拥有7级流水线,低功耗,高性能,显著改善了多媒体处理性能,适合于作多媒体处理器[10].

本系统采用的Linux内核版本为2.4.18,根文件系统采用了cramfs只读文件系统.由于PXA 270芯片属于arm体系结构,因此这里需要建立arm-linux交叉编译环境,以编译OpenCV源码和目标程序.Linux内核2.4版本中已经包含了OV 511摄像头的驱动和V 4L支持,只需要在编内核的时候加载编入内核即可[8];还可以添加支持大容量USB的设备,方便以后使用U盘对根文件系统中数据的读取.

在PC的RedHat Linux中调试程序,运行正常之后可以向嵌入式平台移植系统.主要的移植工作包括:OpenCV类库的编译和目标程序针对arm平台上的性能优化.

本系统采用的OpenCV版本为1.0,在移植到arm体系结构中运行时,用到了其中的highgui库.由于大小端的问题,OpenCV 1.0版本对于端序支持存在BUG(在2.0以上版本中已解决),需要将cxtypes.h文件中的cvround函数最后一句的返回值改为:

return(int)(value+(value>=0?0.5∶-0.5))

否则的话,所有使用到该函数的函数命令都无法在arm体系结构平台中正常运行.人脸检测中的cv HaarDetectObjects函数正是用到了cvround函数,在没有修改返回值的情况下,处理后的图像点阵数据全为0.修改后,使用arm-linux-gcc编译OpenCV类库,产生动态链接库文件,放入将要制作的根文件系统文件夹,制作成cramfs类型的根文件系统.

对于目标程序而言,性能优化包括阈值调整和浮点转定点运算[11].目标程序在x86平台已经能够正常运行,但是由于嵌入式平台硬件资源相对紧缺,需要调整检测阈值来提高运行速度.为了能对视频图像进行更快的实时检测并同时具有一定的识别精度,经过多次的实验尝试,最终将cvHaarDetectObjects函数参数设置为:scale_factor=1.2,min_neighbors=3,flags=CV_HAAR_DO_CANNY_PRUN ING,min_size=(30,30)).此外,由于ARM处理器本身并不支持浮点运算,所有的浮点运算都是在浮点运算模拟器上进行,因此计算速度特别缓慢.需要浮点运算的函数,常要耗费数千个循环才能执行完毕.因此这里将尽量避免使用浮点运算,出现的浮点数都尽可能强制转换为定点数,在一些运算中可以提高数倍、数十倍甚至更高的速度.

内核和根文件系统移植完毕后,使用U盘将编译过的应用程序放入目标板的Linux目录下,启动人脸检测应用程序,系统会通过驱动加载自动判断USB摄像头是否接入,并完成人脸的自动检测.

在CPU主频为2.67 GHz、内存为256 MB、操作系统为RedHat Linux 9的PC中检测一帧视频图像需要6 ms左右,由于嵌人式微处理器本身速度的限制,检测一帧视频图像中的所有人脸目标需要300 ms左右,每秒大概能够处理3~4帧视频图像,基本上实现了实时检测,最终的实验结果对比如图5和图6所示.

6 结 语

本文通过对Adaboost算法的分析,使用了开源类库OpenCV,在嵌入式Linux平台上设计并实现了实时人脸检测系统.随着嵌入式微处理器性能的不断提高,检测时间进一步缩短,精度和性能都会有很大的提升,其应用范围会更加广泛.

[1]Feraud R,Bernier O J,Viallet J E,et al.A Fast and Accurate Face Detecto r Based on Neural Netwo rks[J].IEEE Transactions on Pattern Analysis and M achine Intelligence,2001,23:42-53.

[2]梁路宏,艾海舟,徐光祐,等.人脸检测研究综述[J].计算机学报,2002,25(5):449-458.

[3]李外云,王淑仙,刘锦高.基于嵌入式Linux的便携式自动人脸检测与跟踪系统的应用研究[J].微型电脑应用,2008(1):28-31.

[4]Viola P,Jones M.Robust Real Time Object Detection[C].IEEE ICCV Wo rkshop on Statistical and Computational Theories of Vision,Vancouver canada,2001.

[5]王瑞平,陈杰,山世光,等.基于支持向量机的人脸检测训练集增强[J].软件学报,2008,19(11):2921-2931.

[6]阮锦新,尹俊勋.基于人脸特征和AdaBoost算法的多姿态人脸检测[J].计算机应用,2010(4):967-970.

[7]Hamed Masnadi-Shirazi,Nuno Vasconcelos.Cost-Sensitive Boosting[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2011,33(2):294-309.

[8]刘步中,张曦煌,王庆磊.基于嵌入式Linux的视频监控系统的设计[J].安防科技,2009(6):18-21.

[9]谭学科.基于ARM和OpenCV的增强现实平台研究[D].大连:大连理工大学,2008.

[10]王金莉,苏宛新.基于PXA 270的嵌入式系统设计[J].微计算机信息,2008,24(4):11-12.

[11]石学林,张兆庆,武成岗.定浮点数据算术及其优化[J].计算机科学,2005,32(6):176-180.

Real-time Face Detection System Based on Embedded Platform

ZHANG Hong-jie,L IU Wei-guang
(Zhongyuan University of Technology,Zhengzhou 450007,China)

An embedded real-time face detection system has been designed and developed in the Intel PXA 270 core board after the analysis of the face detection algorithm A daBoost and the OpenCV library.This system does not depend on any other kinds of GU I,but uses the V 4L APIand FrameBuffer API to get and disp lay video frames.Acco rding to the characteristics of the embedded p latfo rm,the p rogram is op timized and a function’s bug has been solved in the OpenCV version 1.0 w hen excuted in the embedded p latform.To a certain extent,this system has better timeliness and p recision imp roved,w ith some p ractical values.

real-time face detect;PXA 270;embedded system;OpenCV;Adaboost;V 4L;FrameBuffer

TP391.4

A

10.3969/j.issn.1671-6906.2011.04.007

1671-6906(2011)04-0029-05

2011-06-27

河南省科技攻关计划项目(092102210331)

张洪杰(1986-),男,河南洛阳人,硕士生.

猜你喜欢
人脸分类器嵌入式
有特点的人脸
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
一起学画人脸
TS系列红外传感器在嵌入式控制系统中的应用
三国漫——人脸解锁
搭建基于Qt的嵌入式开发平台
基于差异性测度的遥感自适应分类器选择
基于实例的强分类器快速集成方法
基于层次化分类器的遥感图像飞机目标检测
长得象人脸的十种动物