安恒煊,張學(xué)習(xí),李超,陳文輝,鄒兵
(1.廣東工業(yè)大學(xué)自動化學(xué)院,廣東廣州510006;2.北京航天航空大學(xué)北京100191)
人臉檢測技術(shù)是對輸入的圖像進(jìn)行檢測并判斷是否包含人臉,并且能夠準(zhǔn)確返回人臉出現(xiàn)的位置的一種計算機(jī)自動檢測技術(shù)[1],目前的人臉檢測技術(shù)主要分為兩大類,一類是基于幾何特征的人臉檢測方法,另外一類是基于統(tǒng)計理論的檢測方法?;趲缀翁卣鞯娜四槞z測方法又可分為3種:基于先驗知識方法、基于特征不變方法、基于模板的方法。傳統(tǒng)的android人臉檢測技術(shù),是通過基于特征不變的方法來實現(xiàn)的,根據(jù)已知的形態(tài)學(xué)相關(guān)知識找出人臉的特征如眼睛、鼻子、嘴等相關(guān)區(qū)域,然后再進(jìn)行人臉判斷[2]。根據(jù)已知的形態(tài)學(xué)來來檢測人臉,比如通過定位雙眼位置來檢測人臉。指定雙眼來檢測人臉存在主觀問題,如人戴眼鏡多數(shù)情況下會影響人臉檢測的效果。而王延江等利用膚色特征方法將圖像分割成多個候選區(qū)域[5],然后對分割出來的候選區(qū)域使用小波分解以提取出相關(guān)人臉特征并進(jìn)行分析,然后根據(jù)分析結(jié)果來判斷該區(qū)域是否包含人臉信息,此方法在復(fù)雜的環(huán)境下易出現(xiàn)很大的漏檢率。Viola P等[3-4]于2001年提出的基于Boosting方法是一個實時人臉檢測系統(tǒng)。他們首先用“積分圖”提高了圖像特征計算的速度,增加了系統(tǒng)運行效率。然后采用了AdaBoost方法對提取的特征值進(jìn)行選擇,形成了多個弱分類器并按照各個分類器的權(quán)重組合成一個最終得強(qiáng)分類器,這樣能適應(yīng)多種復(fù)雜的環(huán)境,檢測效果好,OpenCV現(xiàn)提供C、C++、Python通用編程接口,其開放性和實用性得到了大量從事計算機(jī)視覺研究和軟件開發(fā)人員的青睞[5-6]。本文將基于OpenCV開發(fā)的基于統(tǒng)計理論AdaBoost算法成功的移植到了Android系統(tǒng)中,經(jīng)過測試,取得了較好的效果。
在計算機(jī)視覺的目標(biāo)檢測中,主要都是基于如下圖所示的過程[7]:
圖1 視覺目標(biāo)檢測過程Fig.1 Visual target detection process
在上面的過程中,特征提取和分類器分類是整個檢測過程的核心部分。圖像的采集一般都是通過傳感器等設(shè)備獲得原始圖片,然后經(jīng)過預(yù)處理,預(yù)處理的目的是為了更好地進(jìn)行特征提取,而特征提取中,首先要考慮提取什么樣的特征,接著需要考慮使用何種分類算法將特征分開并進(jìn)行分類,特征選取和特征計算在AdaBoost人臉檢測算法占有重要地位,這也決定了AdaBoost算法的運行速度[8-9]。
基于像素的人臉檢測的算法計算成本較高,Haar特征是基于"塊"的特征,能夠降低計算成本,本文主要采用Haar特征,用來進(jìn)行特征提取,并且采用積分圖的方式來計算特征值,由于采用了積分圖,能夠在常規(guī)時間算出每一個特征值,運算效率大大增加。
1.1.1 矩形特征
矩形特征值的定義為兩個不同矩形區(qū)域像素和之差,有以下常見的3種特征類型:2-矩形特征、3-矩形特征、4-矩形特征[10],分別對應(yīng)如下各圖,如圖。
圖2 矩形特征模板Fig.2 Rectangular feature templates
根據(jù)上述定義,上圖2中的A,B,D的特征值計算公式:
C圖較于A,B,D不同,計算如下:
在上式(1)(2)中,將黑色區(qū)域像素和乘以2,主要是為了使兩種矩形區(qū)域中像素數(shù)目一致。在進(jìn)行特征提取時,可以通過改變特征模板的大小與所處的位置,就可以獲取很多的特征值。單個矩形特征的計算是非常簡單與快速的[11]。由于需要各類原型特征模板及多種尺度在圖像區(qū)域的各個位置進(jìn)行計算,從而導(dǎo)致了特征數(shù)量的總量相當(dāng)大,這勢必會帶來非常大的計算量。假設(shè)W,H分別為圖像窗口的寬度和高度,X=[W/w],Y=[H/h],那么對于矩形特征的原型,其特征數(shù)量的計算如下:
根據(jù)公式,在人臉檢測過程中,一個2424的圖像窗口,特征總數(shù)可以超過110 000多個。這將導(dǎo)致后續(xù)的檢測速度很慢,所以Viola等人提出來積分圖的概念。
1.1.2 積分圖
Viola等人在2004年提出了積分圖的概念[12],加快了矩形特征值的計算速度。積分圖像的定義為:某個像素點的積分圖為圖像原點到該點的矩形區(qū)域內(nèi)的所有像素值之和。另外,在計算積分圖的時候,所使用的像素值為圖像的灰度值,如果圖像為彩色圖像,則需要對彩色圖像進(jìn)行灰度變換。
矩形的積分圖像公式定義如下:
圖3 垂直矩形積分圖像Fig.3 Vertical rectangular integral image
其中I(x′,y′)為圖像在點(x′,y′)處的灰度值,圖像I的積分圖可以使用遞推公式計算:
其中s(x,y)表示為列積分,其意義表示的是圖形點(x,y)及其在y方向上所有圖像點的灰度值之和??梢钥隙椋?/p>
在使用積分圖的表示方法下,特征值的計算只和圖像的端點有關(guān)。所以不管特征矩陣的位置如何,只要遍歷圖像一次,就可以求得所有圖像子窗口的特征值。
目前在實際中應(yīng)用的人臉檢測方法多為基于AdaBoost學(xué)習(xí)算法的方法。該方法在檢測人臉時實時性比較強(qiáng),檢測率也比較高。本文主要采用AdaBoost算法在Android系統(tǒng)上實現(xiàn)人臉檢測。
AdaBoost算法是由Freund和Schapire在1995年提出來的[13],其核心思想是通過訓(xùn)練獲得多個弱分類器,然后把弱分類器按照一定的權(quán)重加權(quán)構(gòu)成強(qiáng)分類器。下面是AdaBoost算法過程:
給定樣本圖像集合(x1,y1),(x2,y2),…,(xn,yn),其中x表示所取樣本的空間,而y表示每個樣本所對應(yīng)值,n表示樣本的個數(shù)。在該系統(tǒng)中y的值代表正負(fù)樣本,其中yi=1表示正樣本,yi=0表示負(fù)樣本。
1)初始化m個正樣本以及l(fā)個負(fù)樣本的權(quán)重。每個正樣本的權(quán)值在初始都一樣每個負(fù)樣本的權(quán)重為
2)設(shè)置循環(huán)迭代次數(shù)T。
3)對每一輪迭代t=1,…,T都做以下步驟:
①首先歸一化權(quán)重,使得所有權(quán)重能夠符合相應(yīng)的概率分布,
②然后針對特征值j訓(xùn)練其分類器hj。并把計算其評價誤差,即該分類器對樣本進(jìn)行正確分類與錯誤分類加權(quán)和,其公式如下:
③然后從其中選擇出具有最小加權(quán)分類誤差的分類器ht,其對應(yīng)的加權(quán)分類誤差為εt。
④然后對每個樣本都進(jìn)行更新權(quán)重的操作,其公式如下:
參數(shù)的含義為:當(dāng)樣本xi被分類器ht正確分類時,參數(shù)ei=0,而若其被錯誤分類時
4)最終將輸出強(qiáng)分類器,其公式為:
本實驗是在Android模擬器上面開發(fā),并且進(jìn)行真機(jī)的人臉檢測,所以首先需要介紹Android應(yīng)用的開發(fā)工具等,在訓(xùn)練好分類器后,就需要使用該分類器來進(jìn)行系統(tǒng)的實現(xiàn)。人臉檢測的模塊主要是設(shè)置分類器,然后獲取圖像數(shù)據(jù),并向底層傳遞,底層圖像進(jìn)行圖像數(shù)據(jù)的判斷,并返回人臉檢測信息。
圖4 人臉檢測流程圖Fig.4 The flow chart of face detection
由于Android的上層開發(fā)工具是Java語言,在Windows xp系統(tǒng)下,需要配置三個Java開發(fā)工具:Eclipse IDE,Java JDK和Android SDK。Opencv是面向C接口的,這里就牽涉到了Java與C/C++的混合編程了,這里借助Android NDK編寫本地代碼,Android NDK需要在Linux環(huán)境下運行,故本文采用Ubuntu9.1系統(tǒng)開發(fā)環(huán)境。本系統(tǒng)所使用的軟件資源如下:
系統(tǒng)環(huán)境:Ubuntu9.1,OpenCV
SDK:Android SDK2.3.1
NDK:Android NDK
開發(fā)環(huán)境:Eclipes3.5+JDK2.0+Android ADT
開發(fā)環(huán)境搭建步驟:
1)下載安裝java SDK,版本為SDK1.6。
2)下載Android NDK,并配置NDK開發(fā)環(huán)境。
3)配置Eclipse開發(fā)環(huán)境,下載并解壓Eclipse3.5,設(shè)置好開發(fā)環(huán)境后,下載Android ADT插件。
在Opencv的3個cv,cvaux,cxcore的功能模塊中,與圖像界面相關(guān)的模塊是highgui模塊,如果需要將Opencv編譯到Android中,需要用到Android中的NDK,Android NDK是一個交叉編譯工具,開發(fā)者自己需要根據(jù)實際情況手動編譯Android.mk文件。這里采用GCC對Android ndk實行交叉編譯,GCC需要在Linux環(huán)境下運行,故本文采用Ubuntu 9.1,NDK版本為android-ndk-r4-linux。編譯時需要手動配置androi.mk,其文件格式如下:
LOCAL_PATH:=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE:=OpenCV
LOCAL_SRC_FILES:=
cxalloc.cpp
cxarithm.cpp
cxarray.cpp
cxcmp.cpp
cxconvert.cpp
cxcopy.cpp
cxdatastructs.cpp
cxdrawing.cpp
cxdxt.cpp
cxerror.cpp
cximage.cpp
cxjacobieigens.cpp
cxlogic.cpp
cxlut.cpp
include$(BUILD_SHARED_LIBRARY)
其中,里面的LOCAL_MODULE關(guān)鍵字是指開發(fā)者最后生成的一個LOCAL_SRC_FILES,在Linux系統(tǒng)下,鍵入./ndk命令后,在工程目錄下會自動產(chǎn)生一個/libs/armeabi的文件夾,編譯時的.so文件就放入這個文件夾中。
在人臉檢測中,樣本的選擇對于創(chuàng)建分類器有非常大的影響,如果選取的樣本足夠豐富,對于訓(xùn)練的結(jié)果就比較好。如果選取不當(dāng),就會嚴(yán)重影響后面的檢測效果。訓(xùn)練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢測的目標(biāo)樣本(如人臉或者手勢)反例樣本可以指其他任意的圖片,在本系統(tǒng)中,使用的是MIT人臉庫,其中樣本總數(shù)為7 087個,人臉樣本數(shù)有2706個,而非人臉樣本數(shù)有4 381個。在MIT樣本庫中的人臉樣圖像尺寸為20×20像素,在正樣本集合中都是正面的人臉,而且還有同一個人在不同光照條件下的樣本。非人臉樣本尺寸和人臉樣本相同,是從圖像中隨機(jī)自動截取的。如圖5,負(fù)樣本來自任意圖片,這些圖片都沒有包含目標(biāo)特征,如圖6人臉正樣本包括基本的目標(biāo)特征。
圖5 人臉負(fù)樣本Fig.5 Face the negative samples
圖6 人臉正樣本Fig.6 Face the positive samples
本實驗通過與android自帶的人臉庫進(jìn)行比較,系統(tǒng)的自帶的人臉檢測類FaceDetector,該類主要是采用模板匹配的方法,通過雙眼來檢測人臉的位置,但是無法檢測到人的嘴和側(cè)臉信息,并且戴上眼鏡會影響檢測效果,通過對系統(tǒng)FaceDetector進(jìn)行單人臉檢測,發(fā)現(xiàn)檢測率也不是很高,而且當(dāng)戴上眼鏡時,根本無法檢測到人臉。
圖7 Android系統(tǒng)人臉檢測Fig.7 The Android system face detection
本系統(tǒng)主要是通過輸入靜態(tài)圖片進(jìn)行人臉檢測,并查看系統(tǒng)檢測檢測效果。本系統(tǒng)的簡單背景下單人臉圖片檢測如圖8。對比系統(tǒng)檢測如圖8,人臉檢測只檢測到了人臉的一部分,本系統(tǒng)人臉檢測完全檢測到人臉。
圖8 本系統(tǒng)人臉檢測Fig.8 The face detection system
對有眼鏡的圖片,檢測率也比較高。當(dāng)人戴眼鏡時,系統(tǒng)檢測檢測不出人臉,而本系統(tǒng)對戴眼鏡的人臉也能夠檢測得到。
圖9 戴眼鏡的人臉檢測Fig.9 Face detection with a pair of glasses
本系統(tǒng)與系統(tǒng)自帶的人臉檢測用MIT人臉庫進(jìn)行對比檢測,檢測結(jié)果如下表,通過MIT人臉庫的測試以及自制圖片的測試,通過158張626個人臉進(jìn)行檢測,本系統(tǒng)達(dá)到91.69%的人臉檢測率。對比與Android系統(tǒng)自帶的人臉檢測功能,本系統(tǒng)有非常大的改進(jìn),能夠適用于多種應(yīng)用環(huán)境。
表1 兩系統(tǒng)檢測比較Tab.1 The two system s test comparison
目前的人臉檢測大多數(shù)是基于PC機(jī)處理,而本文中將AdaBoost算法成功移植到Android平臺上,達(dá)到了較高的檢測水平。使得AdaBoost算法實現(xiàn)了跨平臺應(yīng)用。經(jīng)過實驗證明,AdaBoost算法在Android平臺上,比Android系統(tǒng)自帶的人臉檢測,檢測效率高,能適用多種復(fù)雜環(huán)境。
[1] 梁路宏,艾海舟,徐光祜,等.人臉檢測研究綜述[J].計算機(jī)學(xué)報,2002,25(5):449-458.LIANG Lu-hong,AI Hai-zhou,XU Guang-you,et al.A survey of human face detection[J].Chinese Journal of Computers,2002,25(5):449-458.
[2] P Graf,et al.Locating Faces and Facial Parts[J].Proc.1st Int’l Workshop Automatic Face and Gesture Recognition,1995:41-46.
[3] Viola P,Jones MJ.Rapid Object Detection using a Boosted Cascade of Simple Features[J].Computer Vision and Pattern Recognition,2001(1):8-14.
[4] Viola P,Jones MJ.Robust Real-Time Face Detection.InternationalJournalofComputerVision.2004,57(2):137-154.
[5] Gray Bradski,Adrian Kaebler.Learning OpenCV:Computer Visionwith theOpenCVLibrary[M].USA:OReillymedia,2008.
[6] Willow Garage.OpenCV wiki[EB/OL].[2012-05](2012-07-01).http://opencv.willowgarage.com/wiki/Welcome.
[7] Vadakkepat De Silva L C,et a1.Multimodal Approach to Human-Face Detection and Tracking[J].IEEE Transactions on Industrial Electronics,2008,55(3):385-393.
[8] 黃超,謝康林,杜平.基于AdaBoost的快速人臉跟蹤算法[J]計算機(jī)工程,2000,0(z1):373-374.HUANG Chao,XIE Kang-lin,DU Ping.A fast face tracking algorithm based on powerfhl adaboost[J].Computer Engineering,2000,30(z1):373-374.
[9] 千海川,張立明.一種新的AdaBoost快速訓(xùn)練算法[J].復(fù)旦學(xué)報,2004,43(1):27-33.QIAN Hai-chuan,ZHANG Li-ming.A novel fast training algorithm for adaboost[J].Journal of Fudan University,2004,43(1):27-33.
[10] E Osuna,F(xiàn)reund,and F.Girosi Training Support Vector Machines:An Application toFaceDetection[C]//Proc.IEEEConf.Computer Vision and Pattern Recognition,1997:130-136.
[11] B.Heiselet,T Serre,MPontil,et al.Component-based Face Detection[C]//Proc IEEE Computer Society Conference on Computer Vision and Pattern Recognition,2001:657-662.
[12] Viola P.,Jones M.J.Robust Real-Time Face Detection International[J].Journal of Computer Vision,2004,57(2):137-154.
[13] Meynet J,Popovici V,Thiran J P.Face detection with boosted Gaussian features.Pattern.Recognition,2007(40):2283-2291.