王斌,郭攀,張坤,黃樂
(長安大學信息工程學院,陜西西安710064)
隨著計算機技術和數字信號處理技術的快速發展,計算機視覺技術逐漸應運而生,并得到了廣泛的應用。OpenCV[1](Open Source Computer Vision Library)是由Intel提供的由一系列C函數和少量C++類構成的計算機視覺開源軟件包,它擁有數百個可實現圖像處理和計算機視覺方面的中、高層API,可以十分方便地搭建基于計算機視覺技術的靜態圖像和視頻流處理軟件平臺,可作為二次開發的理想工具。由于基于Haar-like特征的AdaBoost人臉檢測算法具有檢測速度快、實時性強、魯棒性好等優點,本文采用基于Haar-like特征的AdaBoost人臉檢測算法和OpenCV相結合的方法在VC++6.0軟件開發平臺上分別對基于靜態圖像、攝像頭視頻和avi視頻的人臉檢測系統進行設計,實現了從靜態圖像中檢測出人臉并標記出人臉位置、從攝像頭視頻中實時檢測和標記出人臉的位置和從avi視頻中提取檢測出有人臉的幀并實時標記人臉,同時還實現了對標記后的人臉區域圖像進行實時顯示和存盤。
人臉檢測的目的就是把靜態圖像或視頻幀中的人臉區域和非人臉區域區分開。Viola等人提出的人臉檢測方法是一種基于積分圖、級聯分類器和AdaBoost算法的方法,該方法可分為以下3個步驟實現[2]。
1)使用Haar-like特征表示人臉,并采用一種新的圖像表示方式—“積分圖”快速計算其特征值。
2)利用AdaBoost機器學習算法挑選出一些最能代表人臉的矩形特征(弱分類器)并按照加權投票的方式將弱分類器構造成一個強分類器。
3)將訓練得到的若干個強分類器串聯起來構造成一個級聯結構的分類器,從而提高分類器的檢測速度。
用一些簡單的矩形特征來表示人臉特征,因其類似于Viola等人提出的Haar-like小波而得名[3]。常用的Haar-like特征有邊緣特征、線性特征和中心特征,如圖1所示。

圖1 Haar-like特征Fig.1 Haar-like features
其中特征值是指圖像上兩個或者多個形狀大小相同的矩形內部所有像素灰度值之和的差值,在系統中統一采用白色矩形區域所有像素灰度值之和減去黑色矩形區域所有像素灰度值之和[3]。例如,圖1(b)的特征值是靠兩邊的矩形像素總和與中間矩形像素和的差值。也可根據實際情況擴展出多種新的Haar-like特征模板。
為了提高樣本訓練和人臉檢測的速度,Viola等人提出了積分圖的表示方法,這種方法可使矩形特征值得到快速計算。積分圖的計算方法如公式(1)所示[4]:

其中I(x′,y′)為圖像在點(x′,y′)處的像素值,ii(x,y)是計算后的積分圖像。若采用遞推公式[4](2)和(3),積分圖只需遍歷一次原圖像所有點即可計算出來,其中s(x,y)為點(x,y)所在位置的列積分值,定義s(x,-1)=0,ii(-1,y)=0。

AdaBoost算法[5]是一種迭代算法,主要用于特征選擇和訓練分類器,其核心思想是針對不同的訓練集訓練同一個分類器(弱分類器),然后把這些在不同訓練集上得到的弱分類器通過一定的方法集合起來,構成一個最終的強分類器。在該算法中不同的訓練集是通過調整每個樣本對應的權重來實現的。最開始的時候,每個樣本的權重是相同的,在此樣本分布下訓練出一個弱分類器h1(x)。對于h1(x)分類錯誤的樣本則加大其對應的權重,而對于h1(x)分類正確的樣本則減小其對應的權重,從而把分類錯誤的樣本突出出來,進而組合成一個新的樣本分布。同時,根據分類錯誤的情況賦予h1(x)一個權重,表示該弱分類器的重要程度,分類錯誤的越少權重越大。在新的樣本分布下,對其進行再次訓練,得到弱分類器h2(x)及其權重。以此類推,經過T次循環訓練得到T個弱分類器和T個對應的權重,然后把這T個弱分類器按照一定的權重疊加起來,得到最終的強分類器。
級聯分類器是由多層強分類器級聯而成的,也稱之為級聯檢測器或瀑布型檢測器。其每一層都是由AdaBoost算法訓練得到的強分類器,第1層分類得到的正確結果觸發第2層分類器的分類,第2層分類得到的正確結果再觸發第3層分類器的分類,以此類推。這樣疑似人臉窗口依次通過各層分類器,就確認為人臉。反之,如果被檢測的窗口在某一層被判斷為非人臉,就立即停止對該窗口的檢測,開始進行下一個窗口的檢測[5]。這種級聯結構的分類器在設計時采用逐級復雜的原則來實現的,最初的幾層強分類器比較簡單,通常一層由一到幾個弱分類器構成,這樣可以快速排除掉那些明顯不是人臉的子窗口,使后續檢測目標越來越少,從而大大提高了檢測速度。此外,為了實現搜索不同大小的目標區域,分類器被設計為可進行尺寸改變,這樣可以避免直接對圖像進行縮放變換,減小了計算工作量,也提高了檢測速度。
級聯分類器的制作可采用OpenCV自帶的Haartraining程序訓練實現,首先準備大量的正樣本(人臉樣本)和負樣本(非人臉樣本),然后利用OpenCV安裝目錄中的bin子目錄下的createsamples.exe和haartraining.exe分別創建Sample和訓練Sample,直到收斂為止,最后利用bin子目錄下的performance.exe進行樣本測試的訓練,最終生成級聯分類器XML文件[6]。為了快速開發出一套人臉檢測系統,本文選取OpenCV自帶的基于Haar-like特征的級聯分類器haarcascade_frontalface_alt_tree.xml和haarcascade_profileface.xml進行實驗。
采用VC++6.0搭建前臺人機界面(如圖2所示),該界面主要分為3個部分,分別是檢測顯示區、定位顯示區和菜單區。檢測顯示區主要實現基于靜態圖像、攝像頭視頻和avi視頻的人臉檢測結果顯示,定位顯示區主要實現對標記后的人臉區域圖像進行實時顯示,菜單區主要實現基于靜態圖像、攝像頭視頻和avi視頻的人臉檢測與標記操作以及標記后的人臉區域圖像的顯示和存盤操作。

圖2 人臉檢測系統界面Fig.2 The interface of face detection system
基于靜態圖像的人臉檢測流程如圖3所示,大致可分為4個過程:1)加載訓練好的級聯分類器;2)將其轉化為內部格式,以便被計算機識別處理;3)加載待檢測的靜態圖像;4)檢測出圖像中的人臉區域并標記出人臉位置。

圖3 基于靜態圖像的人臉檢測流程圖Fig.3 Flow chart of face detection based on static image
基于攝像頭視頻的人臉檢測流程如圖4所示,主要過程:1)檢測并啟動攝像頭,如未安裝攝像頭將會發出警告并結束檢測,因視頻采集設備種類多和視頻處理的實時性要求,本文采用了實時視頻處理技術DirectX;2)加載已訓練好的級聯分類器并將其轉化為內部格式;3)判斷檢測標志位,若為真,首先捕獲當前一幀并創建該幀的圖像,然后載入當前一幀圖像,并對圖像中的人臉區域進行檢測和標記,最后判斷保存標志位,此時若為真則保存標記的人臉區域圖像并進入下一幀的檢測,否則直接進入下一幀的檢測;若檢測標志位為假則結束檢測。

圖4 基于攝像頭視頻的人臉檢測流程圖Fig.4 Flow chart of face detection based on camera video
視頻可以看成是一幀一幀的圖像在時間上的排列,這樣視頻人臉檢測可看作是對一組圖像序列的連續檢測,因此,基于avi視頻的人臉檢測和基于攝像頭視頻的人臉檢測的流程基本上是一樣的,不同之處是其不需要檢測啟動攝像頭這一步,而是進行加載avi視頻,所以其流程不再贅述。
計算機視覺類庫OpenCV中用于人臉檢測的主要函數為:
1)cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);該函數實現載入級聯分類器的功能,其中cascade_name為級聯分類器的路徑。
2)cvGrabFrame(capture);和frame=cvRetrieveFrame(capture);這兩個函數一起調用實現快速獲取avi視頻幀。其中capture=cvCaptureFromAVI(path);讀取捕獲avi視頻。
3)CvMemStorage*storage=cvCreateMemStorage(0);該函數創建一個默認大小為64 kB的內存塊并返回指向塊首的指針。
4)CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,1.1,2,0,cvSize(30,30));該函數的功能是使用訓練好的級聯分類器在圖像中找到包含人臉目標的矩形區域,并將這些區域作為一序列的矩形框返回。
5)cvRectangle(img,LeftPoint,RightPoint,color,3,8,0);該函數實現對檢測到的人臉區域用方框標記出來。
6)cvSaveImage(savepath+strcat(strCount,".bmp"),OutImage);該函數實現把標記的人臉區域圖像保存為bmp格式的圖像,其中OutImage=cvCreateImage(cvSize(120,120),8,3);創建頭并分配120×120大小的圖像數據空間。
7)獲取到被檢測圖像之后需要進行包括圖像色彩轉換、圖像大小變換和直方圖均衡化等相關處理后方可進行后面的人臉檢測。相關處理函數如下:cvCvtColor(img,gray,CV_BGR2GRAY);色彩轉換。cvResize(gray,small_img,CV_INTER_LINEAR);圖像大小變換。cvEqualizeHist(small_img,small_img);灰度圖像直方圖均衡化。
由微軟公司提供的多媒體編程接口DirectX采用C++編程語言實現,遵循COM,可以更好的構建Windows系統的機器視覺平臺。該接口可直接提供開發質量高、實時的應用程序所需要的各種資源。DirectX技術優點:1)為軟件開發者提供硬件無關性,即可使系統不再依賴任何特定的視頻采集設備;2)為硬件開發提供策略。基于攝像頭視頻的人臉檢測部分主要使用DirectX SDK中的DirectShow組件實現視頻的實時采集和處理,它采用一種叫Filter Graph的模型來管理整個數據流的處理過程,保持兼容VFW(Video For Windows)并且提供了更加優秀的接口。通過對OpenCV和DirectShow組件的實時視頻采集情況進行對比,采用DirectShow組件處理攝像頭視頻效果更加流暢。DirectShow組件中用于打開攝像頭和處理視頻的主要函數如下:
CCameraDS camera;//定義攝像類變量camera.OpenCamera(0,false,320,240));//打開攝像頭IplImage*pFrame=camera.QueryFrame();//獲取視頻幀
本文實現了對標記后的人臉區域圖像進行實時顯示和存盤的功能。因軟件界面有限,在定位顯示區最多可實時顯示被標記的前7幅人臉區域圖像,如圖5所示。當需要保存被標記的人臉區域圖像時,點擊“保存定位圖像”按鈕并選取保存路徑,即可實現存盤功能。
在Pentium T3200 2.0 GHz CPU,1 GB內存的筆記本電腦上進行實驗。對于靜態圖像的人臉檢測,實驗樣本是從互聯網上搜集的46張彩色圖像,最小尺寸為469×447,最大尺寸為1 936×1 288,共361個人臉,其中漏檢25個,誤檢13個,總體檢測效果良好,其中一張圖像檢測結果如圖5所示。利用筆記本電腦上自帶的30萬像素的攝像頭拍攝的實時視頻進行人臉檢測,視頻處理流暢,檢測結果完全滿足實時性需求,其中一幀檢測結果如圖6所示。最后,分別對從互聯網上下載的avi格式視頻文件U-go-girl.AVI和kissingyou.AVI進行人臉檢測,流暢度和實時性均能滿足需求,需要注意的是在進行人臉檢測前需要安裝XviD解碼器方可打開這兩個avi視頻文件,對U-go-girl.AVI文件其中一幀的檢測結果如圖7所示。在實驗中發現,漏檢的主要原因是人臉姿態偏轉角度較大造成的,因此,分類器訓練權重的更新規則需要進一步的改進和完善。在人臉檢測中需要注意的是靜態圖像的像素和視頻的清晰度都不能過高,當過高時人臉檢測的實時性將會大大降低,同時檢測率也會有所下降。

圖5 基于靜態圖像的人臉檢測結果Fig.5 Result of face detection based on static image

圖6 基于攝像頭視頻的人臉檢測結果Fig.6 Result of face detection based on camera video

圖7 基于avi視頻的人臉檢測結果Fig.7 Result of face detection based on avi video
本文在簡要闡述基于Haar-like特征的AdaBoost人臉檢測算法原理基礎上,利用由AdaBoost算法訓練的人臉級聯分類器在計算機視覺類庫OpenCV和VC++6.0平臺上進行軟件編程設計人臉檢測系統,分別實現了基于靜態圖像、攝像頭視頻和avi視頻的人臉檢測與標記以及標記后的人臉區域圖像實時顯示和存盤,并對檢測結果進行了分析和討論。實驗結果顯示,采用計算機視覺類庫OpenCV實現基于AdaBoost算法的人臉檢測,具有檢測速度快、檢測率高、實時性強等優點,且實現方法簡單實用,可用于實現人臉識別與跟蹤、運動分析及環境的實時監控等,有較好的開發和應用前景。
[1]陳勝勇,劉盛.基于OpenCV的計算機視覺技術實現[M].北京:科學出版社,2008.
[2]蘇景龍,林天威,王科俊,等.視頻流下的人臉檢測與跟蹤[J].應用科技,2011,38(3):5-11.
SU Jing-long,LIN Tian-wei,WANG Ke-jun,et al.Face detection and tracking in video[J].Applied Science and Technology,2011,38(3):5-11.
[3]花櫻,彭宏京,顧佳玲.Boosting協方差特征的人臉檢測方
法[J].計算機工程與應用,2010,46(18):186-189.
HUA Ying,PENG Hong-jing,GU Jia-ling.Face detection method by boosting covariance feature[J].Computer Engineering and Applications,2010,46(18):186-189.
[4]郭磊,王秋光.AdaBoost人臉檢測算法研究及OpenCV實現[J].哈爾濱理工大學學報,2009,14(5):123-126.
GUO Lei,WANG Qiu-guang.Research of face detection based on AdaBoost algorithm and OpenCV implementation[J].Journal of Harbin University of Science and Technology,2009,14(5):123-126.
[5]崔曉青.基于AdaBoost算法的人臉檢測系統的研究與實現[D].長春:吉林大學計算機科學與技術學院,2008.
[6]徐麒,王繼成.基于視頻圖像的人臉檢測與統計[J].計算機與現代化,2010,(1):120-123.
XU Qi,WANG Ji-cheng.Real-time face detection and statistics based on video image[J].Computer and Modernization,2010(1):120-123.