張洪杰,劉衛(wèi)光
基于嵌入式平臺(tái)的實(shí)時(shí)人臉檢測(cè)系統(tǒng)
張洪杰,劉衛(wèi)光
通過(guò)對(duì)實(shí)時(shí)人臉檢測(cè)算法AdaBoost和庫(kù)OpenCV的分析,設(shè)計(jì)并實(shí)現(xiàn)了在Intel PXA 270核心板上的嵌入式實(shí)時(shí)人臉檢測(cè)系統(tǒng).該系統(tǒng)不依賴(lài)圖形界面,使用V 4L和FrameBuffer直接讀取和顯示視頻圖像,根據(jù)嵌入式平臺(tái)特點(diǎn)優(yōu)化程序執(zhí)行效率,并解決了OpenCV 1.0版本在嵌入式平臺(tái)中部分函數(shù)不能正確執(zhí)行的問(wèn)題,在一定程度上達(dá)到了實(shí)時(shí)性和檢測(cè)精度的同時(shí)提升,具有一定的實(shí)用價(jià)值.
實(shí)時(shí)人臉檢測(cè);PXA 270;嵌入式;OpenCV;AdaBoost;V 4L;FrameBuffer
(中原工學(xué)院,鄭州 450007)
人臉檢測(cè)是指在一幅輸入的圖像中找到人臉的坐標(biāo)位置和它的大小的過(guò)程[1].近年來(lái),人臉檢測(cè)的應(yīng)用背景已經(jīng)遠(yuǎn)遠(yuǎn)超出了人臉識(shí)別系統(tǒng)的范疇,在圖像檢索、數(shù)字視頻處理、視覺(jué)檢測(cè)等方面有著重要的應(yīng)用價(jià)值[2].傳統(tǒng)的嵌入式平臺(tái)檢測(cè)系統(tǒng)是使用嵌入式設(shè)備作圖像采集,通過(guò)網(wǎng)絡(luò)方式傳輸?shù)椒?wù)器端進(jìn)行處理并檢測(cè);而隨著嵌入式硬件設(shè)備性能的不斷提高,可以使用嵌入式設(shè)備采集到圖像之后直接進(jìn)行處理,以減輕服務(wù)器端的壓力,而且能夠設(shè)計(jì)成便攜式的人臉檢測(cè)設(shè)備[3].
本文在 Intel PXA 270硬件平臺(tái)上,利用嵌入式Linux操作系統(tǒng)和開(kāi)源計(jì)算機(jī)視覺(jué)類(lèi)庫(kù)OpenCV的特點(diǎn),設(shè)計(jì)了嵌入式平臺(tái)實(shí)時(shí)人臉檢測(cè)系統(tǒng).這里先介紹對(duì)AdaBoost方法的具體算法分析,然后通過(guò)對(duì)Linux平臺(tái)的實(shí)時(shí)人臉檢測(cè)系統(tǒng)進(jìn)行分析設(shè)計(jì),最后從軟件設(shè)計(jì)方面著手,設(shè)計(jì)并實(shí)現(xiàn)了arm-Linux平臺(tái)的實(shí)時(shí)人臉檢測(cè)系統(tǒng).
在人臉檢測(cè)方法中,灰度、梯度和膚色是常見(jiàn)的人臉檢測(cè)方法.Viola P和Jones M通過(guò)積分圖概念的引入[4],提出了基于類(lèi) Haar特征和級(jí)聯(lián)結(jié)構(gòu)的 Ada-Boost算法,成功地實(shí)現(xiàn)了物體的快速檢測(cè),并將其應(yīng)用于人臉檢測(cè)領(lǐng)域,實(shí)現(xiàn)了實(shí)時(shí)人臉檢測(cè)[5].這種檢測(cè)方法檢測(cè)率較高,速度較快,準(zhǔn)確率也較高,更適合于嵌入式平臺(tái)的使用,因此這里采用AdaBoost算法.
A daBoost算法的基本思想是將大量的分類(lèi)能力一般的弱分類(lèi)器通過(guò)一定方法疊加起來(lái),構(gòu)成一個(gè)具有很強(qiáng)分類(lèi)能力的強(qiáng)分類(lèi)器[6].而且可以證明,分類(lèi)器的數(shù)量愈大,錯(cuò)誤率越低,檢測(cè)精度就會(huì)越高.
A daBoost算法描如下[7]:
這里的αm是一個(gè)權(quán)重序列;gm(x)是一個(gè)二值判別公式,{gm(x)}:X→{-1,+1},它通常由決策樹(shù)gm(x)=sgn[φm(x)-tm]來(lái)實(shí)現(xiàn) ,其中φm(x)表示特征值,tm表示閾值.gm(x)每次構(gòu)造錯(cuò)誤率最低的簡(jiǎn)單分類(lèi)器,并進(jìn)行遍歷,其中第m次迭代的最大下降趨向?yàn)?
gm(x)=argming(err(m))
而這里的err(m)就是gm(x)和二值判別函數(shù)I產(chǎn)生的總錯(cuò)誤值,即
其中,二值判別函數(shù)為:
最后,更新權(quán)重:
得到分類(lèi)器GAmda(x),最終得到的最優(yōu)分類(lèi)步數(shù)目為:
OpenCV(Intel OpenSource Computer Vision Library)是Intel公司研發(fā)的一套開(kāi)源計(jì)算機(jī)視覺(jué)類(lèi)庫(kù),它是由一些C函數(shù)和C++類(lèi)所組成的,其中包含了一些基本的圖像處理算法和計(jì)算機(jī)視覺(jué)算法.代碼非常簡(jiǎn)潔高效,很適合嵌入式平臺(tái)使用.
在人臉檢測(cè)之前,需要獲取圖像,并對(duì)獲取的目標(biāo)圖像進(jìn)行預(yù)處理,達(dá)到增強(qiáng)圖像的目的,為下一步的檢測(cè)做好準(zhǔn)備.而OpenCV中包含了很多對(duì)圖像進(jìn)行預(yù)處理的函數(shù),如灰度處理、中值濾波、尺寸裁剪等.而且源碼公開(kāi),可以根據(jù)實(shí)際情況來(lái)定制所需要的函數(shù).OpenCV中的圖像數(shù)據(jù)信息都被封裝在一個(gè)叫做Ip l Image的結(jié)構(gòu)體中,類(lèi)似于 W indow s系統(tǒng)中的BM P格式,其中包含了圖像的通道、像素的位深、圖像像素大小等相關(guān)信息和圖像數(shù)據(jù)本身.而且其中包含了對(duì)Adaboost算法的C語(yǔ)言實(shí)現(xiàn),可以直接通過(guò)相應(yīng)的程序來(lái)訓(xùn)練分類(lèi)器并檢測(cè)目標(biāo)圖像,大大降低了開(kāi)發(fā)周期,提高了開(kāi)發(fā)效率.
這里選用的是OpenCV的1.0版本,函數(shù)實(shí)現(xiàn)比較簡(jiǎn)單,而且絕大多數(shù)使用的是純C函數(shù),執(zhí)行效率較高,更適合在嵌入式Linux系統(tǒng)中應(yīng)用.其中一個(gè)Haar特征由2~3個(gè)具有相應(yīng)權(quán)重的矩形組成,結(jié)構(gòu)體CvHaarStageClassifier作為一個(gè)強(qiáng)分類(lèi)器節(jié)點(diǎn),其中包含了弱分類(lèi)器的數(shù)量、分類(lèi)器閾值等信息,結(jié)構(gòu)體CvHaarClassifierCascade包含了標(biāo)志位、級(jí)聯(lián)分類(lèi)器中強(qiáng)分類(lèi)器的數(shù)目、訓(xùn)練中原始目標(biāo)的大小、待檢測(cè)物體的大小、Haar塊縮放的尺寸等.
OpenCV中包含的AdaBoost方法的 C語(yǔ)言實(shí)現(xiàn),包括創(chuàng)建所有可能的 Haar特征、從正樣本集中載入正樣本、從負(fù)樣本集中載入負(fù)樣本、計(jì)算 Haar特征值和訓(xùn)練一個(gè)強(qiáng)分類(lèi)器等.
這里使用OpenCV中自帶的訓(xùn)練程序,在 Red-Hat Linux中編譯為可執(zhí)行程序,就可以直接通過(guò)正負(fù)樣本的輸入訓(xùn)練來(lái)得到需要的人臉?lè)诸?lèi)器.本文使用的樣本是從M IT人臉庫(kù)挑選的部分樣本,來(lái)作為輸入樣本進(jìn)行訓(xùn)練,正樣本共2 000個(gè),負(fù)樣本4 000個(gè).訓(xùn)練完成的分類(lèi)器保存在XML文件中,供檢測(cè)算法讀取調(diào)用.同時(shí),OpenCV本身也提供了已經(jīng)訓(xùn)練好的人臉?lè)诸?lèi)器,可供直接使用.
檢測(cè)算法主要步驟如圖1所示.
圖1 檢測(cè)算法
(1)加載分類(lèi)器,將訓(xùn)練好的分類(lèi)器XML文件加載,為下一步的檢測(cè)做好準(zhǔn)備.
(2)讀取目標(biāo)圖像,按照 Ip l Image的格式封裝,為下一步的掃描做準(zhǔn)備.
(3)掃描目標(biāo)圖像,然后用cvhaarobjectdetects函數(shù)檢測(cè)圖像中的所有人臉.
使用訓(xùn)練好的級(jí)聯(lián)分類(lèi)器,在圖像中找到包含目標(biāo)物體的矩形區(qū)域,并且將這些區(qū)域作為一序列的矩形框返回.函數(shù)以不同比例大小的掃描窗口對(duì)圖像進(jìn)行若干次搜索,每次對(duì)圖像中的這些重疊區(qū)域進(jìn)行檢測(cè),利用Canny邊緣檢測(cè)器來(lái)排除一些邊緣很少或者很多的圖像區(qū)域,因?yàn)檫@樣的區(qū)域一般不含被檢目標(biāo),人臉檢測(cè)中使用這種方法,提高了檢測(cè)速度.
本系統(tǒng)的基本設(shè)計(jì)思路為:通過(guò)OV 511驅(qū)動(dòng)把從攝像頭獲取的一幀圖像壓縮為RGB編碼格式的圖像數(shù)據(jù),通過(guò)V 4L[8]提供的相關(guān)函數(shù)讀取從視頻設(shè)備獲取的數(shù)據(jù),然后把得到的RGB格式的圖像數(shù)據(jù)提交給圖像處理和檢測(cè)函數(shù)進(jìn)行處理,處理過(guò)的圖像數(shù)據(jù)映射至FrameBuffer,通過(guò)FrameBuffer的接口函數(shù)將結(jié)果直接顯示在LCD顯示器中.這里沒(méi)有使用任何的圖形界面類(lèi)庫(kù),目的是使系統(tǒng)簡(jiǎn)潔、高效.系統(tǒng)設(shè)計(jì)如圖2所示.
圖2 系統(tǒng)設(shè)計(jì)框圖
根據(jù)圖2所示設(shè)計(jì)框圖編寫(xiě)程序,在裝有Red Hat Linux的 PC上,將OpenCV的源碼使用gcc進(jìn)行安裝[9],生成x86下的動(dòng)態(tài)鏈接庫(kù)文件,然后進(jìn)行編譯、執(zhí)行.系統(tǒng)實(shí)現(xiàn)的主要流程如下:
流程 1:定義 V 4L視頻采集數(shù)據(jù)結(jié)構(gòu)體 v4l_struct,其中包含了 FrameBuffer設(shè)備句柄、Frame-Buffer屏幕可變的信息、FrameBuffer固定不變的信息、video_capability 、video_picture、video_channel 、video_mmap、video_mbuf等信息.
流程2:Video4linux下視頻編程的基本流程如圖3所示.
圖3 視頻編程的基本流程圖
(1)打開(kāi)視頻設(shè)備.使用Linux的讀文件函數(shù)open函數(shù)以讀寫(xiě)方式打開(kāi)視頻設(shè)備文件.
(2)讀取設(shè)備信息.使用 ioctl函數(shù)的控制符V ID IOCGCAP和V ID IOCGPICT讀取設(shè)備信息.
(3)更改設(shè)備當(dāng)前設(shè)置.設(shè)置圖像數(shù)據(jù)格式為RGB24,以方便下一步進(jìn)行圖像處理和檢測(cè).
(4)進(jìn)行視頻采集.有2種方法:①內(nèi)存映射的方法;②直接從設(shè)備讀取的方法.
這里采用的是使用雙緩沖的內(nèi)存映射方法,使用ioctl函數(shù)的控制符 V ID IOCMCAPTURE和V ID IOCSYNC來(lái)讀取幀數(shù)據(jù)和進(jìn)行同步控制.這樣通過(guò)2幀雙通道來(lái)完成視頻數(shù)據(jù)的采集工作,在某些場(chǎng)合應(yīng)用時(shí)還可以采用緩沖隊(duì)列等方式.
通過(guò)當(dāng)前幀號(hào)和當(dāng)前使用情況,2個(gè)元素來(lái)控制雙幀采集,以及采集相關(guān)操作函數(shù).
(5)對(duì)采集的圖像數(shù)據(jù)進(jìn)行處理.讀取緩沖區(qū)中的圖像數(shù)據(jù),將從緩沖區(qū)獲得的一幀圖像提交給detect函數(shù)進(jìn)行預(yù)處理和人臉檢測(cè),其中detect函數(shù)的執(zhí)行流程如圖4所示.
圖4 detect函數(shù)的執(zhí)行流程圖
①讀取分類(lèi)器.讀取訓(xùn)練好的分類(lèi)器XML文件,為下一步的檢測(cè)做好準(zhǔn)備.
②創(chuàng)建動(dòng)態(tài)內(nèi)存塊.動(dòng)態(tài)內(nèi)存塊是一個(gè)可用來(lái)存儲(chǔ)諸如序列、輪廓、圖形、子劃分等動(dòng)態(tài)增長(zhǎng)數(shù)據(jù)結(jié)構(gòu)的底層結(jié)構(gòu),用來(lái)存儲(chǔ)檢測(cè)到的一序列候選目標(biāo)矩形框的內(nèi)存區(qū)域.
③檢測(cè)目標(biāo)圖像,進(jìn)行預(yù)處理,然后用cvhaarobjectdetects函數(shù)檢測(cè)圖像中的所有人臉.
④掃描圖像,獲取所有符合特征的人臉,標(biāo)識(shí)人臉區(qū)域,并將處理過(guò)的圖像數(shù)據(jù)按照RGB24格式返回,為下一步的圖像數(shù)據(jù)顯示做好準(zhǔn)備.
(6)打開(kāi)Frame_buffer,實(shí)時(shí)顯示數(shù)據(jù);通過(guò)打開(kāi)設(shè)備文件“/dev/fb0”,對(duì) FrameBuffer進(jìn)行相關(guān)讀寫(xiě)操作,并將處理過(guò)的RGB24格式的圖像數(shù)據(jù)通過(guò)行掃描和列掃描的方式,實(shí)現(xiàn)LCD實(shí)時(shí)顯示處理過(guò)的圖像.
處理完畢并顯示成功后,從緩存區(qū)讀取下一幀圖像并處理顯示,這樣反復(fù)循環(huán),以達(dá)到實(shí)時(shí)顯示的目的.
本系統(tǒng)采用的是基于OV511+的網(wǎng)眼2000CMOS攝像頭,30萬(wàn)像素,USB插口.開(kāi)發(fā)使用的核心板為Intel PXA270,主頻520 M Hz,顯示屏為256色彩色液晶屏(320×240像素)的STN LCD設(shè)備.PXA270是 Intel XScale系列芯片,它屬于ARM的V5TE體系,擁有7級(jí)流水線,低功耗,高性能,顯著改善了多媒體處理性能,適合于作多媒體處理器[10].
本系統(tǒng)采用的Linux內(nèi)核版本為2.4.18,根文件系統(tǒng)采用了cramfs只讀文件系統(tǒng).由于PXA 270芯片屬于arm體系結(jié)構(gòu),因此這里需要建立arm-linux交叉編譯環(huán)境,以編譯OpenCV源碼和目標(biāo)程序.Linux內(nèi)核2.4版本中已經(jīng)包含了OV 511攝像頭的驅(qū)動(dòng)和V 4L支持,只需要在編內(nèi)核的時(shí)候加載編入內(nèi)核即可[8];還可以添加支持大容量USB的設(shè)備,方便以后使用U盤(pán)對(duì)根文件系統(tǒng)中數(shù)據(jù)的讀取.
在PC的RedHat Linux中調(diào)試程序,運(yùn)行正常之后可以向嵌入式平臺(tái)移植系統(tǒng).主要的移植工作包括:OpenCV類(lèi)庫(kù)的編譯和目標(biāo)程序針對(duì)arm平臺(tái)上的性能優(yōu)化.
本系統(tǒng)采用的OpenCV版本為1.0,在移植到arm體系結(jié)構(gòu)中運(yùn)行時(shí),用到了其中的highgui庫(kù).由于大小端的問(wèn)題,OpenCV 1.0版本對(duì)于端序支持存在BUG(在2.0以上版本中已解決),需要將cxtypes.h文件中的cvround函數(shù)最后一句的返回值改為:
return(int)(value+(value>=0?0.5∶-0.5))
否則的話,所有使用到該函數(shù)的函數(shù)命令都無(wú)法在arm體系結(jié)構(gòu)平臺(tái)中正常運(yùn)行.人臉檢測(cè)中的cv HaarDetectObjects函數(shù)正是用到了cvround函數(shù),在沒(méi)有修改返回值的情況下,處理后的圖像點(diǎn)陣數(shù)據(jù)全為0.修改后,使用arm-linux-gcc編譯OpenCV類(lèi)庫(kù),產(chǎn)生動(dòng)態(tài)鏈接庫(kù)文件,放入將要制作的根文件系統(tǒng)文件夾,制作成cramfs類(lèi)型的根文件系統(tǒng).
對(duì)于目標(biāo)程序而言,性能優(yōu)化包括閾值調(diào)整和浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算[11].目標(biāo)程序在x86平臺(tái)已經(jīng)能夠正常運(yùn)行,但是由于嵌入式平臺(tái)硬件資源相對(duì)緊缺,需要調(diào)整檢測(cè)閾值來(lái)提高運(yùn)行速度.為了能對(duì)視頻圖像進(jìn)行更快的實(shí)時(shí)檢測(cè)并同時(shí)具有一定的識(shí)別精度,經(jīng)過(guò)多次的實(shí)驗(yàn)嘗試,最終將cvHaarDetectObjects函數(shù)參數(shù)設(shè)置為:scale_factor=1.2,min_neighbors=3,flags=CV_HAAR_DO_CANNY_PRUN ING,min_size=(30,30)).此外,由于ARM處理器本身并不支持浮點(diǎn)運(yùn)算,所有的浮點(diǎn)運(yùn)算都是在浮點(diǎn)運(yùn)算模擬器上進(jìn)行,因此計(jì)算速度特別緩慢.需要浮點(diǎn)運(yùn)算的函數(shù),常要耗費(fèi)數(shù)千個(gè)循環(huán)才能執(zhí)行完畢.因此這里將盡量避免使用浮點(diǎn)運(yùn)算,出現(xiàn)的浮點(diǎn)數(shù)都盡可能強(qiáng)制轉(zhuǎn)換為定點(diǎn)數(shù),在一些運(yùn)算中可以提高數(shù)倍、數(shù)十倍甚至更高的速度.
內(nèi)核和根文件系統(tǒng)移植完畢后,使用U盤(pán)將編譯過(guò)的應(yīng)用程序放入目標(biāo)板的Linux目錄下,啟動(dòng)人臉檢測(cè)應(yīng)用程序,系統(tǒng)會(huì)通過(guò)驅(qū)動(dòng)加載自動(dòng)判斷USB攝像頭是否接入,并完成人臉的自動(dòng)檢測(cè).
在CPU主頻為2.67 GHz、內(nèi)存為256 MB、操作系統(tǒng)為RedHat Linux 9的PC中檢測(cè)一幀視頻圖像需要6 ms左右,由于嵌人式微處理器本身速度的限制,檢測(cè)一幀視頻圖像中的所有人臉目標(biāo)需要300 ms左右,每秒大概能夠處理3~4幀視頻圖像,基本上實(shí)現(xiàn)了實(shí)時(shí)檢測(cè),最終的實(shí)驗(yàn)結(jié)果對(duì)比如圖5和圖6所示.
本文通過(guò)對(duì)Adaboost算法的分析,使用了開(kāi)源類(lèi)庫(kù)OpenCV,在嵌入式Linux平臺(tái)上設(shè)計(jì)并實(shí)現(xiàn)了實(shí)時(shí)人臉檢測(cè)系統(tǒng).隨著嵌入式微處理器性能的不斷提高,檢測(cè)時(shí)間進(jìn)一步縮短,精度和性能都會(huì)有很大的提升,其應(yīng)用范圍會(huì)更加廣泛.
[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]梁路宏,艾海舟,徐光祐,等.人臉檢測(cè)研究綜述[J].計(jì)算機(jī)學(xué)報(bào),2002,25(5):449-458.
[3]李外云,王淑仙,劉錦高.基于嵌入式Linux的便攜式自動(dòng)人臉檢測(cè)與跟蹤系統(tǒng)的應(yīng)用研究[J].微型電腦應(yīng)用,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ī)的人臉檢測(cè)訓(xùn)練集增強(qiáng)[J].軟件學(xué)報(bào),2008,19(11):2921-2931.
[6]阮錦新,尹俊勛.基于人臉特征和AdaBoost算法的多姿態(tài)人臉檢測(cè)[J].計(jì)算機(jī)應(yīng)用,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的視頻監(jiān)控系統(tǒng)的設(shè)計(jì)[J].安防科技,2009(6):18-21.
[9]譚學(xué)科.基于ARM和OpenCV的增強(qiáng)現(xiàn)實(shí)平臺(tái)研究[D].大連:大連理工大學(xué),2008.
[10]王金莉,蘇宛新.基于PXA 270的嵌入式系統(tǒng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008,24(4):11-12.
[11]石學(xué)林,張兆慶,武成崗.定浮點(diǎn)數(shù)據(jù)算術(shù)及其優(yōu)化[J].計(jì)算機(jī)科學(xué),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
河南省科技攻關(guān)計(jì)劃項(xiàng)目(092102210331)
張洪杰(1986-),男,河南洛陽(yáng)人,碩士生.