摘要基于FPGA内嵌的NiosⅡ处理器,设计了一个实时人脸检测系统。介绍了基于Haar特征的AdaBoost人脸检测算法,描述了依据AdaBoost算法的人脸检测软件实现过程,最后在以Altera公司CycloneⅡ系列EP2C70为核心芯片的DE-2开发平台上,对检测系统进行了整体设计。测试结果表明,系统有较高的检测率,可以满足实时人脸检测的要求。
人脸检测是指在图像中判断是否有人脸存在,并且将检测到的人脸部分在图像中标识出来的过程。作为人脸信息处理中的一项关键技术,人脸检测在自动人脸识别、视频会议、智能人机交互等领域得到广泛应用。目前人脸检测系统多采用PC或DSP作为处理平台。在PC上,人脸检测系统实现虽已经达到基本要求,但由于携带不便,无法满足实时检测,且成本较高。采用通用的DSP方式,外围电路较复杂,设计难度大,调试也需要较长的时间,且系统的可扩展性和移植性差。文中利用SOPC技术设计了基于NiosⅡ处理器的人脸检测系统,不仅达到了实时性要求,而且在PC上开发的程序,可方便地移植到Nios II处理器上。
1 Nios II处理器
Nios II处理器是Altera公司为其FPGA产品配套开发的软核CPU。在逻辑功能上,它是一款通用的RISC结构的CPU;在实现方式上,它在FPGA上通过编程实现。由于Nios II有一个开放式的ALU,通过用户自定义指令集,可以方便地完成对系统的操作;同时采用哈佛结构的总线模式,大幅地提高了系统的处理速度;另外,Nios II系统中的外设具有可配置性,这在较大程度上简化了硬件开发的难度,缩短了产品开发周期。
2 算法概述
文中采用Viola P提出的基于Haar特征的AdaBoost人脸检测算法,该算法主要分为以下3部分:
(1)使用Haar-like特征表示人脸,将“积分图”的概念用于Haar矩形特征的快速计算。
(2)使用AdaBoost算法训练得到大量弱分类器,按照权值补偿的方式级联得到强分类器。
(3)将训练得到的强分类器串联组成层叠分类器,这种结构能及时摒弃非人脸图像子模块,减少了计算的数据量,有效提高系统的检测速度。
训练得到一个好的分类器,将大幅提高系统性能。文中通过对大量的人脸及非人脸图像进行训练,经过多次迭代,获得一系列弱分类器。在迭代过程当中,选择错误率最小的弱分类器作为本次迭代产生的弱分类器hn(x),之后更新样本权值,使得那些在上次检测过程中被误判的样本在此次检测时能得到足够的重视,然后再次迭代,获得新的弱分类器,以此类推,经过k次迭代,得到k个弱分类器,而所有弱分类器组合后便得到分类能力较强的强分类器。
系统中,每级强分类器都有相应的阈值,通过调整每级强分类器的阈值,使得几乎所有含人脸的图像都可以顺利通过分类器,而绝大多数的非人脸图像被拒绝。分类器位置越靠前,只需少量的特征即可滤除大量的非人脸图像,而位置靠后,分类器的结构相对较复杂,需要较多的特征才能排除那些具有一定人脸特征的非人脸图像。最终,通过每级强分类器的检测,人脸图像将被保留,而非人脸图像则在检测过程当中被某级强分类器所淘汰。
概括说来,该检测算法的主要流程为:首先对检测图像进行积分图运算,然后用一定大小的子窗口遍历整幅待检测图像,并将子窗口截取到的图像输入到分类器中判断是否包含人脸,若该子图像通过全部强分类器,则判定当前子图像包含人脸特征,记录该子图像的位置和大小,否则抛弃当前子图像,进入下一帧的检测,当该子窗口遍历整幅图像后,放大子窗口尺寸,重新遍历待检测图像,直到子窗口大小超过图像大小,检测结束,流程如图3所示。
3 人脸检测系统的硬件设计框架
按照人脸检测系统的功能要求,可以将整个系统分为几个模块:视频采集模块、视频缓存模块、视频输出模块、人脸检测算法实现模块、IO接口模块(LCD显示模块和按键模块);同时为项目开发的延续,在不影响系统功能的基础上再添加通讯接口模块,这样既可以实现数据的远距离传输,又能与个人PC协同处理。
系统的工作流程:通过CCD摄像机(25帧/s)采集视频,之后利用ADV7121将CCD送来的NTSC、PAL模拟视频信号转换成符合CCIR 656标准的YCrCb4:2:2视频数据;然后在FPGA中通过视频采集模块、视频缓存模块、视频输出模块、人脸检测算法实现模块实现人脸检测;最后在LCD上显示最终检测结果。通过FPGA内部的I2C总线控制器模块,实现对ADV7121视频解码芯片的配置。视频输出模块,通过控制信号提取、制式检测、灰度有效数据提取等单元,完成视频数据流中灰度图像数据的提取。人脸检测算法实现模块根据AdaBoost人脸检测算法流程对人脸进行检测,然后输出人脸的相关数据。LCD显示模块主要是输出行同步信号(HS)和场同步信号(VS),结合人脸检测算法实现模块的检测结果和视频缓存模块存放的视频数据,完成人脸位置显示和视频数据中人脸位置标定。硬件系统的设计框架如图4所示。
具体功能流程如下:
(1)初始化:FPGA通过I2C总线传输SDAT和SCLK信号,完成对ADV7121的配置;来自模拟摄像机的模拟视频信号,经过ADV7121,输出ITU—RBT.656格式数字视频信号。
(2)FPGA将转换后的数字视频数据传输给SRAM1。图5为视频采集模块框图。ADV7121主要完成视频数据采集,其视频数据总线、帧图像数据时钟(PCLK)、场同步信号(Vsync)、行同步信号(Hsync)与FPGA视频采集模块相连。FPGA协调两块SRAM“乒乓模式”的读写操作,并完成模块的外部接口。
(3)FPGA等待一帧图像数据存储结束后,调用人脸检测模块,同时等待下一帧图像数据,并存储到SRAM2。
(4)检测结束,FPGA将得到的人脸位置写回图像所在SRAM中。
(5)当SRAM2存储完毕,通知人脸检测模块,同时等待下一帧图像数据,并存储到SRAM1。检测结束,将得到的人脸位置坐标写回图像所在SRAM中。每秒25帧,每帧周期40 ms,因此从写入视频图像到检测模块返回结果,需要在40 ms内完成。
4 实验结果
经过对A、B、C 3名同学在多种不同情况下的反复测试,得到测试数据如表1所示。
其中,N、n、FR分别为该条件下测试的总次数、错检次数以及误检率。
此外,还对网络上的具有多个人脸的图像进行了测试,实验结果表明,系统对多人脸模式也有较好的识别能力,效果图如图6所示。
5 实验结论
通过对实验结果的分析,可得如下结论:
(1)检测速度:通过分析人脸检测算法,经过训练分类器、定点化、以及硬件加速后,使人脸检测系统在DE-2开发板平台上,基本达到实时检测的效果。
(2)检测定位:从检测结果可以看到,人脸的范围较小,侧重点主要集中在眉毛、眼睛、鼻子、嘴唇等器官上,没有耳朵信息特征表现。这是因为人脸训练库主要是围绕几个主要特征,所以检测定位是小区域定位。
(3)检测率与误检率:通过反复实验可以看到,该系统具有较高的检测率和可以接受的误检率,尤其是在正面人脸、小角度倾斜、光照比较均匀的情况下。漏检往往是因为头像过小、脸部特征发生暂时性变化(戴眼镜)、只出现部分人脸或偏转角度过大,又或者光照不均匀等。而那些被判定为人脸的非人脸图像,通常是因为背景复杂,而且该图像又具有人脸某些特征等因素造成的。
(4)资源利用率:从最终的综合和仿真结果来看,在所有模块当中,积分图资源占用最多,分类器计算时间最长,因此选用一种好的处理架构,能大幅提升系统的整体性能。