陳志恒,姜明新
(大連民族學(xué)院 遼寧 大連 116600)
隨著計算機(jī)與數(shù)字信號處理技術(shù)的高速發(fā)展,人臉檢測技術(shù)在眾多領(lǐng)域得到廣泛應(yīng)用。人臉檢測技術(shù)是指在視頻或圖像中檢測出現(xiàn)人臉位置、大小的過程。作為人臉信息處理中的一項(xiàng)關(guān)鍵技術(shù),人臉檢測技術(shù)已經(jīng)超出了其它人臉識別模式的應(yīng)用范疇,在視頻處理,圖像處理,身份驗(yàn)證,安全監(jiān)測等方面有著重要的應(yīng)用價值。隨著計算機(jī)語言算法的發(fā)展,近年來出現(xiàn)了大量的人臉檢測的算法,其中,能夠較好的解決人臉的檢測速度與檢測效果的算法,是在2001年由Paul Viola和Michael Jones首先提出的Adaboost算法。openCV[1]是由Intel提供的一系列包括C與C++的提供計算機(jī)視覺和圖像處理的開源軟件包,它為視頻或圖像處理搭建了很好的軟件平臺。本系統(tǒng)就是基于openCV,利用Adaboost算法設(shè)計的一個簡單的人臉檢測系統(tǒng),該系統(tǒng)能夠快速、準(zhǔn)確的檢測到圖像或視頻中的人臉。
對人臉檢測的研究最初可以追溯到20世紀(jì) 70年代,早期的研究方向與現(xiàn)在的研究方向與方法不同。目前在實(shí)際中應(yīng)用的人臉檢測方法較為普遍的是基于 Adaboost算法的方法。
Viola的人臉檢測方法是一種基于積分圖、級聯(lián)分類檢測器和Adaboost算法的方法,方法框架可以分為以下3大步驟:
1)使用Haar-like特征表示人臉,使用“積分圖”實(shí)現(xiàn)特征數(shù)值的快速計算;
2)使用Adaboost算法挑選出一些最能代表人臉的矩形特征(弱分類器),按照加權(quán)投票的方式將弱分類器構(gòu)造為一個強(qiáng)分類器;
3)將得到的若干強(qiáng)分類器串聯(lián)組成一個級聯(lián)結(jié)構(gòu)的層疊分類器,訓(xùn)練得到的強(qiáng)級聯(lián)結(jié)構(gòu)能有效地提高分類器的檢測速度。
haar特征是基于灰度圖,首先通過大量的具有比較明顯的haar特征(矩形)的物體圖像用模式識別的方法訓(xùn)練出分類器,分類器是個級聯(lián)的,每級都以大概相同的識別率保留進(jìn)入下一級的具有物體特征的候選物體,而每一級的子分類器則由許多haar特征構(gòu)成(由積分圖像計算得到,并保存下位置),有水平的、豎直的、傾斜的,并且每個特征帶一個閾值和兩個分支值,每級子分類器帶一個總的閾值。識別物體的時候,同樣計算積分圖像為后面計算haar特征做準(zhǔn)備,然后采用與訓(xùn)練的時候有物體的窗口同樣大小的窗口遍歷整幅圖像,以后逐漸放大窗口,同樣做遍歷搜索物體;每當(dāng)窗口移動到一個位置,即計算該窗口內(nèi)的haar特征,加權(quán)后與分類器中haar特征的閾值比較從而選擇左或者右分支值,累加一個級的分支值與相應(yīng)級的閾值比較,大于該閾值才可以通過進(jìn)入下一輪篩選。當(dāng)通過分類器所有分類級的時候說明這個物體以大概率被識別。常用的Haar-like特征有線性特征,邊緣特征,中心特征。
圖1 Harr-like特征Fig.1 Harr-like features
特征值是指圖像上兩個或者多個形狀大小相同的矩形內(nèi)部所有像素灰度值之和的差值,例如在邊緣特征中,特征值的計算公式為:
由于訓(xùn)練樣本通常有近萬個,并且矩形特征的數(shù)量非常龐大,如果每次計算特征值都要統(tǒng)計矩形內(nèi)所以像素之和,將會大大降低訓(xùn)練和檢測的速度。因此引入了一種新的圖像表示方法——積分圖像特征的特征值計算法,該方法只與此特征矩形的端點(diǎn)的積分圖有關(guān),所以不管此特征矩形的尺度變換如何,特征值的計算所消耗的時間都是常量。這樣只要遍歷圖像一次,就可以求得所有子窗口的特征值。積分圖[2]定義為:
其中 I(x′,y′)為圖像在點(diǎn)(x′,y′)處的像素值。 為了節(jié)約時間,減少重復(fù)計算,則圖像I的積分圖可按如下遞推公式計算:
這樣就可以進(jìn)行任意矩形區(qū)域內(nèi)像素積分運(yùn)算。由圖像的積分圖可快速地計算圖像中任意矩形內(nèi)所有像素灰度積分。如圖2所示,點(diǎn)1的積分圖像的值為(其中Sum為求和):
圖2 特征和計算Fig.2 The sum of features
同理,點(diǎn)2、點(diǎn)3、點(diǎn)4的積分圖像分別為:
矩形區(qū)域D內(nèi)的所有像素灰度積分可由矩形端點(diǎn)的積分圖像值得到:
Adaboost是一種迭代算法,其核心思想是針對同一個訓(xùn)練集訓(xùn)練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構(gòu)成一個更強(qiáng)的最終分類器(強(qiáng)分類器)。其算法本身是通過改變數(shù)據(jù)分布來實(shí)現(xiàn)的,它根據(jù)每次訓(xùn)練集之中每個樣本的分類是否正確,以及上次的總體分類的準(zhǔn)確率,來確定每個樣本的權(quán)值。將修改過權(quán)值的新數(shù)據(jù)集送給下層分類器進(jìn)行訓(xùn)練,最后將每次訓(xùn)練得到的分類器最后融合起來,作為最后的決策分類器。使用Adaboost分類器可以排除一些不必要的訓(xùn)練數(shù)據(jù)特征,并將關(guān)鍵放在關(guān)鍵的訓(xùn)練數(shù)據(jù)上面。
Adaboost算法中不同的訓(xùn)練集是通過調(diào)整每個樣本對應(yīng)的權(quán)重來實(shí)現(xiàn)的。開始時,每個樣本對應(yīng)的權(quán)重是相同的,即其中 n為樣本個數(shù),在此樣本分布下訓(xùn)練出一弱分類器。對于分類錯誤的樣本,加大其對應(yīng)的權(quán)重;而對于分類正確的樣本,降低其權(quán)重,這樣分類錯的樣本就被突出出來,從而得到一個新的樣本分布。在新的樣本分布下,再次對弱分類器進(jìn)行訓(xùn)練,得到弱分類器。依次類推,經(jīng)過 T次循環(huán),得到 T個弱分類器,把這T個弱分類器按一定的權(quán)重疊加(boost)起來,得到最終想要的強(qiáng)分類器。
Adaboost[3]的具體算法如下:
設(shè)輸入 的 n 個 訓(xùn)練 樣本為:{(x1,y1),(x2,y2)......(xn,yn)},其中xi是輸入的訓(xùn)練樣本,yi∈{0,1}分別表示正樣本和負(fù)樣本,其中正樣本數(shù)為l,負(fù)樣本數(shù)為m。n=l+m,具體步驟如下:
1)初始化每個樣本的權(quán)重;
2)對每個 t=1,...,T(T 為弱分類器的個數(shù))
①把權(quán)重歸一化為一個概率分布:
如此使得ωt為一個概率分布。
② 對每個特征f,訓(xùn)練一個弱分類器hj,計算對應(yīng)所有特征的弱分類器的加權(quán)錯誤率
③ 選取最佳的弱分類器ht(擁有最小錯誤率):θt
④按照這個最佳弱分類器,調(diào)整權(quán)重:
其中θi=0表示被正確的分類,ei=1表示被錯誤的分類,當(dāng)錯誤分類時:
3)最后的強(qiáng)分類器為:
級聯(lián)分類器是由多個強(qiáng)分類器級聯(lián)而成的,其中,每一層均有Abadoost算法訓(xùn)練得到的強(qiáng)分類器構(gòu)成,第一層分類器得到疑似人臉的正確結(jié)果后,觸發(fā)第二層進(jìn)行分類,當(dāng)?shù)诙臃诸惼鞯玫揭伤迫四樀恼_結(jié)果后,觸發(fā)第三層進(jìn)行分類,依次類推,最后確定疑似人臉的圖像就確認(rèn)為人臉。反之,當(dāng)觸發(fā)到某一層時,分類器得到的結(jié)果是非人臉時,就立即停止對圖像的檢測。級聯(lián)分類器的結(jié)構(gòu)類似于金字塔,如圖3所示,通過級聯(lián)分類器,可以很對人臉做出檢測。由于本系統(tǒng)較為簡單,所以只用到了4級強(qiáng)分類器構(gòu)成級聯(lián)分類器。
圖3 金字塔結(jié)構(gòu)Fig.3 The structure of Pyramid
基于VC++6.0搭建的人機(jī)界面,如圖4所示,該系統(tǒng)主要由3個部分組成,視頻成像區(qū),檢測區(qū),和菜單區(qū)。視頻成像區(qū)主要是基于攝像頭獲取的圖像進(jìn)行顯示,檢測區(qū)主要是基于視頻頭中的人臉和靜態(tài)圖像中的人臉的檢測,并在左上方顯示出檢測到的人臉的圖像,菜單區(qū)是主要實(shí)現(xiàn)基于攝像頭視頻和靜態(tài)圖像中人臉檢測的操作。在視頻成像區(qū)下方,有 detect(檢測)選項(xiàng)和 run(開始)選項(xiàng)。
圖4 人臉檢測系統(tǒng)界面Fig.4 The interface of face detection system
2.2.1 系統(tǒng)流程
該系統(tǒng)可分為兩個模塊,靜態(tài)圖像人臉檢測和視頻圖像中的人臉檢測。
基于靜態(tài)圖像的人臉檢測流程大致可分為4個過程(如圖5所示):1)加載已經(jīng)訓(xùn)練好的分類器;2)將其轉(zhuǎn)化為計算機(jī)可以識別的內(nèi)部格式;3)加載該圖片以進(jìn)行檢測;4)顯示檢測結(jié)果到檢測區(qū)。
圖5 基于靜態(tài)圖像的人臉檢測流程Fig.5 Flow chart of face detection based on static image
基于視頻圖像的人臉檢測主要流程為:1)攝像頭提取圖像;2)加載已訓(xùn)練好的級聯(lián)分類器并將圖像其轉(zhuǎn)化為內(nèi)部各式;3)判斷檢測標(biāo)志位,若為真,首先捕獲當(dāng)前一幀并創(chuàng)建該幀圖像,然后載入當(dāng)前一幀圖像,并對圖像的人臉區(qū)域進(jìn)行檢測,反之,結(jié)束檢測;4)將檢測到的結(jié)果顯示到檢測區(qū)。
2.2.2 openCV人臉檢測主要函數(shù)
openCV軟件包中提供了豐富的基于圖像和視頻處理的視覺類庫[4],該系統(tǒng)主要用到的函數(shù)[5]有:
1)cascade=(CvHaarClassifierCascade*)cvLoad (cascade_name,0,0,0); 該函數(shù)試下去呢載入級聯(lián)分類器的功能,其中,cascade_name為級聯(lián)分類器的路徑。
2)CvMemStorage*storage=cvCreateMemStorage(0);該函數(shù)創(chuàng)建一個默認(rèn)大小為64 kB的內(nèi)存塊并返回指向塊首的指針。
3)CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,1.1,1,0,cvSize(40,40));該函數(shù)的功能是使用訓(xùn)練好的級聯(lián)分類器在圖像中找到包含人臉目標(biāo)的矩形區(qū)域,并將這個區(qū)域作為一個矩形框返回。
4)cvRectangle(img,LeftPoint,RightPoint,color,2,7,0);該函數(shù)實(shí)現(xiàn)對檢測到的人臉區(qū)域用方框標(biāo)記出來。
5)獲得被檢測到的人臉后,要對圖像進(jìn)行包括圖像色彩轉(zhuǎn)換、圖像大小變換和直方圖均衡化等相關(guān)處理,方可把檢測到的人臉顯示在檢測區(qū)中。相關(guān)的函數(shù)包括:cvCvtColor(img,gray,CV_BGR2GRAY); 該函數(shù)是對圖像進(jìn)行色彩轉(zhuǎn)換。 cvResize(gray,small_img,CV_INTER_LINEAR);該函數(shù)是對圖像的大小進(jìn)行變換。cvEqualizeHist(small_img,small_img);該函數(shù)的作用是對灰度圖像直方圖的均衡化。
6)對于視頻圖像的人臉檢測來說,還需要從電腦上的攝像頭讀取視頻,openCV提供很好的實(shí)時視頻采集,cvCapture*cvCaptureFromCAM (int 1);該函數(shù)的功能是對攝像頭(個數(shù)為1)打開進(jìn)行定義。
制作分類器[6]需要制作正樣本文件和負(fù)樣本文件。負(fù)樣本可以來自于任意的圖片,但這些圖片不能包含目標(biāo)特征。負(fù)樣本由背景描述文件來描述。背景描述文件是一個文本文件,每一行包含了一個負(fù)樣本圖片的文件名(基于描述文件的相對路徑),該文件創(chuàng)建方法如下:采用Dos命令生成樣本描述文件。具體方法是在Dos下的進(jìn)入你的圖片目錄,比如我的圖片放在D:facedetect egdata中,則:按Ctrl+R打開Windows運(yùn)行程序,輸入 cmd,打開DOS命令窗口,輸入 d:回車,再輸入cd D:facedetect egdata進(jìn)入圖片路徑,再次輸入dir/b>negdata.dat,則在圖片路徑下生成一個negdata.dat文件,打開該文件將最后一行的negdata.dat刪除,這樣就生成了負(fù)樣本描述文件。對于正樣本文件,通常的做法是先把所有正樣本裁切好,并對尺寸做規(guī)整。由于HaarTraining訓(xùn)練時輸入的正樣本是vec文件,所以需要使用openCV自帶的CreateSamples程序,將準(zhǔn)備好的正樣本轉(zhuǎn)換為vec文件。正、負(fù)樣本創(chuàng)建之后,接下來要訓(xùn)練分類器,這個過程是由haartraining程序來實(shí)現(xiàn)的。該程序源碼由openCV自帶,且可執(zhí)行的程序在openCV安裝目錄的bin目錄下。訓(xùn)練結(jié)束后,會在目錄data下生成一些子目錄,即為訓(xùn)練好的分類器。用performance.exe進(jìn)行樣本的測試訓(xùn)練,最終生成xml文件。
在個人用的筆記本電腦上進(jìn)行視頻圖像中的人臉檢測和圖片中的人臉檢測的測試,得到程序測試圖如圖6和圖7所示。結(jié)果表明,基于openCV的簡單的人臉檢測系統(tǒng),可以快速的從視頻或靜態(tài)圖像中檢測到人臉,在檢測區(qū)將人臉用方框標(biāo)記,并在檢測區(qū)左上方顯示出檢測到的人臉。
圖6 基于攝像頭視頻的人臉檢測結(jié)果Fig.6 Result of face detection based on camera video
文中簡要闡述了在Adaboost人臉檢測算法的基礎(chǔ)上,采用級聯(lián)分類器的方法檢測動態(tài)視頻和靜態(tài)圖像中人臉,在檢測區(qū)對人臉進(jìn)行標(biāo)記,并對結(jié)果進(jìn)行了分析。分析結(jié)果顯示,采用計算機(jī)視覺類庫openCV實(shí)現(xiàn)基于Adaboost算法的人臉檢測,具有檢測速度快,檢測結(jié)果準(zhǔn)確,實(shí)時性強(qiáng)等優(yōu)點(diǎn),且實(shí)現(xiàn)的方法簡單實(shí)用。文中所闡述的基于openCV的簡單人臉檢測系統(tǒng)可用于其他人臉識別與實(shí)時監(jiān)控的軟件系統(tǒng)開發(fā)。
圖7 基于靜態(tài)圖片的人臉檢測結(jié)果Fig.7 Result of face detection based on static image
[1]Ary Bradski,Adrian Kaebler.學(xué)習(xí)OpenCV[M].北京:清華大學(xué)出版社,2009.
[2]黃文杰,陳斌.一種快速圖像處理的積分方法[J].計算機(jī)應(yīng)用,2005,25(1):266-268.HUANG Wen-jie,CHEN Bin.A fast image process of integration method[J].Computer Applications,2005,25 (1):266-268.
[3]崔曉青.基于AdaBoost算法的人臉檢測人系統(tǒng)的研究與實(shí)現(xiàn)[D].長春:吉林大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院,2008.
[4]郭磊,王秋光.Adaboost人臉檢測算法研究及OpenCV實(shí)現(xiàn)[J].哈爾濱理工大學(xué)學(xué)報,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]陳勝勇,劉勝.基于OpenCV的計算機(jī)視覺技術(shù)實(shí)現(xiàn)[M].北京:科學(xué)出版社,2008.
[6]唐徙文,曾義.人臉檢測級聯(lián)分類器快速訓(xùn)練算法[J].計算機(jī)仿真,2007,24(12):324-327 TANG Xi-wen,ZENGYi.An improved algorithm for constructing cascade classifier based on adaboost[J].Computer Simulation,2007,24(12):324-327.