安恒煊,張學習,李超,陳文輝,鄒兵
(1.廣東工業大學自動化學院,廣東廣州510006;2.北京航天航空大學北京100191)
人臉檢測技術是對輸入的圖像進行檢測并判斷是否包含人臉,并且能夠準確返回人臉出現的位置的一種計算機自動檢測技術[1],目前的人臉檢測技術主要分為兩大類,一類是基于幾何特征的人臉檢測方法,另外一類是基于統計理論的檢測方法。基于幾何特征的人臉檢測方法又可分為3種:基于先驗知識方法、基于特征不變方法、基于模板的方法。傳統的android人臉檢測技術,是通過基于特征不變的方法來實現的,根據已知的形態學相關知識找出人臉的特征如眼睛、鼻子、嘴等相關區域,然后再進行人臉判斷[2]。根據已知的形態學來來檢測人臉,比如通過定位雙眼位置來檢測人臉。指定雙眼來檢測人臉存在主觀問題,如人戴眼鏡多數情況下會影響人臉檢測的效果。而王延江等利用膚色特征方法將圖像分割成多個候選區域[5],然后對分割出來的候選區域使用小波分解以提取出相關人臉特征并進行分析,然后根據分析結果來判斷該區域是否包含人臉信息,此方法在復雜的環境下易出現很大的漏檢率。Viola P等[3-4]于2001年提出的基于Boosting方法是一個實時人臉檢測系統。他們首先用“積分圖”提高了圖像特征計算的速度,增加了系統運行效率。然后采用了AdaBoost方法對提取的特征值進行選擇,形成了多個弱分類器并按照各個分類器的權重組合成一個最終得強分類器,這樣能適應多種復雜的環境,檢測效果好,OpenCV現提供C、C++、Python通用編程接口,其開放性和實用性得到了大量從事計算機視覺研究和軟件開發人員的青睞[5-6]。本文將基于OpenCV開發的基于統計理論AdaBoost算法成功的移植到了Android系統中,經過測試,取得了較好的效果。
在計算機視覺的目標檢測中,主要都是基于如下圖所示的過程[7]:

圖1 視覺目標檢測過程Fig.1 Visual target detection process
在上面的過程中,特征提取和分類器分類是整個檢測過程的核心部分。圖像的采集一般都是通過傳感器等設備獲得原始圖片,然后經過預處理,預處理的目的是為了更好地進行特征提取,而特征提取中,首先要考慮提取什么樣的特征,接著需要考慮使用何種分類算法將特征分開并進行分類,特征選取和特征計算在AdaBoost人臉檢測算法占有重要地位,這也決定了AdaBoost算法的運行速度[8-9]。
基于像素的人臉檢測的算法計算成本較高,Haar特征是基于"塊"的特征,能夠降低計算成本,本文主要采用Haar特征,用來進行特征提取,并且采用積分圖的方式來計算特征值,由于采用了積分圖,能夠在常規時間算出每一個特征值,運算效率大大增加。
1.1.1 矩形特征
矩形特征值的定義為兩個不同矩形區域像素和之差,有以下常見的3種特征類型:2-矩形特征、3-矩形特征、4-矩形特征[10],分別對應如下各圖,如圖。

圖2 矩形特征模板Fig.2 Rectangular feature templates
根據上述定義,上圖2中的A,B,D的特征值計算公式:

C圖較于A,B,D不同,計算如下:

在上式(1)(2)中,將黑色區域像素和乘以2,主要是為了使兩種矩形區域中像素數目一致。在進行特征提取時,可以通過改變特征模板的大小與所處的位置,就可以獲取很多的特征值。單個矩形特征的計算是非常簡單與快速的[11]。由于需要各類原型特征模板及多種尺度在圖像區域的各個位置進行計算,從而導致了特征數量的總量相當大,這勢必會帶來非常大的計算量。假設W,H分別為圖像窗口的寬度和高度,X=[W/w],Y=[H/h],那么對于矩形特征的原型,其特征數量的計算如下:

根據公式,在人臉檢測過程中,一個2424的圖像窗口,特征總數可以超過110 000多個。這將導致后續的檢測速度很慢,所以Viola等人提出來積分圖的概念。
1.1.2 積分圖
Viola等人在2004年提出了積分圖的概念[12],加快了矩形特征值的計算速度。積分圖像的定義為:某個像素點的積分圖為圖像原點到該點的矩形區域內的所有像素值之和。另外,在計算積分圖的時候,所使用的像素值為圖像的灰度值,如果圖像為彩色圖像,則需要對彩色圖像進行灰度變換。
矩形的積分圖像公式定義如下:

圖3 垂直矩形積分圖像Fig.3 Vertical rectangular integral image

其中I(x′,y′)為圖像在點(x′,y′)處的灰度值,圖像I的積分圖可以使用遞推公式計算:

其中s(x,y)表示為列積分,其意義表示的是圖形點(x,y)及其在y方向上所有圖像點的灰度值之和。可以肯定為:

在使用積分圖的表示方法下,特征值的計算只和圖像的端點有關。所以不管特征矩陣的位置如何,只要遍歷圖像一次,就可以求得所有圖像子窗口的特征值。
目前在實際中應用的人臉檢測方法多為基于AdaBoost學習算法的方法。該方法在檢測人臉時實時性比較強,檢測率也比較高。本文主要采用AdaBoost算法在Android系統上實現人臉檢測。
AdaBoost算法是由Freund和Schapire在1995年提出來的[13],其核心思想是通過訓練獲得多個弱分類器,然后把弱分類器按照一定的權重加權構成強分類器。下面是AdaBoost算法過程:
給定樣本圖像集合(x1,y1),(x2,y2),…,(xn,yn),其中x表示所取樣本的空間,而y表示每個樣本所對應值,n表示樣本的個數。在該系統中y的值代表正負樣本,其中yi=1表示正樣本,yi=0表示負樣本。
1)初始化m個正樣本以及l個負樣本的權重。每個正樣本的權值在初始都一樣每個負樣本的權重為
2)設置循環迭代次數T。
3)對每一輪迭代t=1,…,T都做以下步驟:
①首先歸一化權重,使得所有權重能夠符合相應的概率分布,

②然后針對特征值j訓練其分類器hj。并把計算其評價誤差,即該分類器對樣本進行正確分類與錯誤分類加權和,其公式如下:

③然后從其中選擇出具有最小加權分類誤差的分類器ht,其對應的加權分類誤差為εt。
④然后對每個樣本都進行更新權重的操作,其公式如下:

參數的含義為:當樣本xi被分類器ht正確分類時,參數ei=0,而若其被錯誤分類時
4)最終將輸出強分類器,其公式為:

本實驗是在Android模擬器上面開發,并且進行真機的人臉檢測,所以首先需要介紹Android應用的開發工具等,在訓練好分類器后,就需要使用該分類器來進行系統的實現。人臉檢測的模塊主要是設置分類器,然后獲取圖像數據,并向底層傳遞,底層圖像進行圖像數據的判斷,并返回人臉檢測信息。

圖4 人臉檢測流程圖Fig.4 The flow chart of face detection
由于Android的上層開發工具是Java語言,在Windows xp系統下,需要配置三個Java開發工具:Eclipse IDE,Java JDK和Android SDK。Opencv是面向C接口的,這里就牽涉到了Java與C/C++的混合編程了,這里借助Android NDK編寫本地代碼,Android NDK需要在Linux環境下運行,故本文采用Ubuntu9.1系統開發環境。本系統所使用的軟件資源如下:
系統環境:Ubuntu9.1,OpenCV
SDK:Android SDK2.3.1
NDK:Android NDK
開發環境:Eclipes3.5+JDK2.0+Android ADT
開發環境搭建步驟:
1)下載安裝java SDK,版本為SDK1.6。
2)下載Android NDK,并配置NDK開發環境。
3)配置Eclipse開發環境,下載并解壓Eclipse3.5,設置好開發環境后,下載Android ADT插件。
在Opencv的3個cv,cvaux,cxcore的功能模塊中,與圖像界面相關的模塊是highgui模塊,如果需要將Opencv編譯到Android中,需要用到Android中的NDK,Android NDK是一個交叉編譯工具,開發者自己需要根據實際情況手動編譯Android.mk文件。這里采用GCC對Android ndk實行交叉編譯,GCC需要在Linux環境下運行,故本文采用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關鍵字是指開發者最后生成的一個LOCAL_SRC_FILES,在Linux系統下,鍵入./ndk命令后,在工程目錄下會自動產生一個/libs/armeabi的文件夾,編譯時的.so文件就放入這個文件夾中。
在人臉檢測中,樣本的選擇對于創建分類器有非常大的影響,如果選取的樣本足夠豐富,對于訓練的結果就比較好。如果選取不當,就會嚴重影響后面的檢測效果。訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢測的目標樣本(如人臉或者手勢)反例樣本可以指其他任意的圖片,在本系統中,使用的是MIT人臉庫,其中樣本總數為7 087個,人臉樣本數有2706個,而非人臉樣本數有4 381個。在MIT樣本庫中的人臉樣圖像尺寸為20×20像素,在正樣本集合中都是正面的人臉,而且還有同一個人在不同光照條件下的樣本。非人臉樣本尺寸和人臉樣本相同,是從圖像中隨機自動截取的。如圖5,負樣本來自任意圖片,這些圖片都沒有包含目標特征,如圖6人臉正樣本包括基本的目標特征。

圖5 人臉負樣本Fig.5 Face the negative samples

圖6 人臉正樣本Fig.6 Face the positive samples
本實驗通過與android自帶的人臉庫進行比較,系統的自帶的人臉檢測類FaceDetector,該類主要是采用模板匹配的方法,通過雙眼來檢測人臉的位置,但是無法檢測到人的嘴和側臉信息,并且戴上眼鏡會影響檢測效果,通過對系統FaceDetector進行單人臉檢測,發現檢測率也不是很高,而且當戴上眼鏡時,根本無法檢測到人臉。

圖7 Android系統人臉檢測Fig.7 The Android system face detection
本系統主要是通過輸入靜態圖片進行人臉檢測,并查看系統檢測檢測效果。本系統的簡單背景下單人臉圖片檢測如圖8。對比系統檢測如圖8,人臉檢測只檢測到了人臉的一部分,本系統人臉檢測完全檢測到人臉。

圖8 本系統人臉檢測Fig.8 The face detection system
對有眼鏡的圖片,檢測率也比較高。當人戴眼鏡時,系統檢測檢測不出人臉,而本系統對戴眼鏡的人臉也能夠檢測得到。

圖9 戴眼鏡的人臉檢測Fig.9 Face detection with a pair of glasses
本系統與系統自帶的人臉檢測用MIT人臉庫進行對比檢測,檢測結果如下表,通過MIT人臉庫的測試以及自制圖片的測試,通過158張626個人臉進行檢測,本系統達到91.69%的人臉檢測率。對比與Android系統自帶的人臉檢測功能,本系統有非常大的改進,能夠適用于多種應用環境。

表1 兩系統檢測比較Tab.1 The two system s test comparison
目前的人臉檢測大多數是基于PC機處理,而本文中將AdaBoost算法成功移植到Android平臺上,達到了較高的檢測水平。使得AdaBoost算法實現了跨平臺應用。經過實驗證明,AdaBoost算法在Android平臺上,比Android系統自帶的人臉檢測,檢測效率高,能適用多種復雜環境。
[1] 梁路宏,艾海舟,徐光祜,等.人臉檢測研究綜述[J].計算機學報,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]計算機工程,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快速訓練算法[J].復旦學報,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,Freund,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.