陳志恒,姜明新
(大連民族學(xué)院 遼寧 大連 116600)
隨著計(jì)算機(jī)與數(shù)字信號(hào)處理技術(shù)的高速發(fā)展,人臉檢測(cè)技術(shù)在眾多領(lǐng)域得到廣泛應(yīng)用。人臉檢測(cè)技術(shù)是指在視頻或圖像中檢測(cè)出現(xiàn)人臉位置、大小的過程。作為人臉信息處理中的一項(xiàng)關(guān)鍵技術(shù),人臉檢測(cè)技術(shù)已經(jīng)超出了其它人臉識(shí)別模式的應(yīng)用范疇,在視頻處理,圖像處理,身份驗(yàn)證,安全監(jiān)測(cè)等方面有著重要的應(yīng)用價(jià)值。隨著計(jì)算機(jī)語言算法的發(fā)展,近年來出現(xiàn)了大量的人臉檢測(cè)的算法,其中,能夠較好的解決人臉的檢測(cè)速度與檢測(cè)效果的算法,是在2001年由Paul Viola和Michael Jones首先提出的Adaboost算法。openCV[1]是由Intel提供的一系列包括C與C++的提供計(jì)算機(jī)視覺和圖像處理的開源軟件包,它為視頻或圖像處理搭建了很好的軟件平臺(tái)。本系統(tǒng)就是基于openCV,利用Adaboost算法設(shè)計(jì)的一個(gè)簡(jiǎn)單的人臉檢測(cè)系統(tǒng),該系統(tǒng)能夠快速、準(zhǔn)確的檢測(cè)到圖像或視頻中的人臉。
對(duì)人臉檢測(cè)的研究最初可以追溯到20世紀(jì) 70年代,早期的研究方向與現(xiàn)在的研究方向與方法不同。目前在實(shí)際中應(yīng)用的人臉檢測(cè)方法較為普遍的是基于 Adaboost算法的方法。
Viola的人臉檢測(cè)方法是一種基于積分圖、級(jí)聯(lián)分類檢測(cè)器和Adaboost算法的方法,方法框架可以分為以下3大步驟:
1)使用Haar-like特征表示人臉,使用“積分圖”實(shí)現(xiàn)特征數(shù)值的快速計(jì)算;
2)使用Adaboost算法挑選出一些最能代表人臉的矩形特征(弱分類器),按照加權(quán)投票的方式將弱分類器構(gòu)造為一個(gè)強(qiáng)分類器;
3)將得到的若干強(qiáng)分類器串聯(lián)組成一個(gè)級(jí)聯(lián)結(jié)構(gòu)的層疊分類器,訓(xùn)練得到的強(qiáng)級(jí)聯(lián)結(jié)構(gòu)能有效地提高分類器的檢測(cè)速度。
haar特征是基于灰度圖,首先通過大量的具有比較明顯的haar特征(矩形)的物體圖像用模式識(shí)別的方法訓(xùn)練出分類器,分類器是個(gè)級(jí)聯(lián)的,每級(jí)都以大概相同的識(shí)別率保留進(jìn)入下一級(jí)的具有物體特征的候選物體,而每一級(jí)的子分類器則由許多haar特征構(gòu)成(由積分圖像計(jì)算得到,并保存下位置),有水平的、豎直的、傾斜的,并且每個(gè)特征帶一個(gè)閾值和兩個(gè)分支值,每級(jí)子分類器帶一個(gè)總的閾值。識(shí)別物體的時(shí)候,同樣計(jì)算積分圖像為后面計(jì)算haar特征做準(zhǔn)備,然后采用與訓(xùn)練的時(shí)候有物體的窗口同樣大小的窗口遍歷整幅圖像,以后逐漸放大窗口,同樣做遍歷搜索物體;每當(dāng)窗口移動(dòng)到一個(gè)位置,即計(jì)算該窗口內(nèi)的haar特征,加權(quán)后與分類器中haar特征的閾值比較從而選擇左或者右分支值,累加一個(gè)級(jí)的分支值與相應(yīng)級(jí)的閾值比較,大于該閾值才可以通過進(jìn)入下一輪篩選。當(dāng)通過分類器所有分類級(jí)的時(shí)候說明這個(gè)物體以大概率被識(shí)別。常用的Haar-like特征有線性特征,邊緣特征,中心特征。

圖1 Harr-like特征Fig.1 Harr-like features
特征值是指圖像上兩個(gè)或者多個(gè)形狀大小相同的矩形內(nèi)部所有像素灰度值之和的差值,例如在邊緣特征中,特征值的計(jì)算公式為:

由于訓(xùn)練樣本通常有近萬個(gè),并且矩形特征的數(shù)量非常龐大,如果每次計(jì)算特征值都要統(tǒng)計(jì)矩形內(nèi)所以像素之和,將會(huì)大大降低訓(xùn)練和檢測(cè)的速度。因此引入了一種新的圖像表示方法——積分圖像特征的特征值計(jì)算法,該方法只與此特征矩形的端點(diǎn)的積分圖有關(guān),所以不管此特征矩形的尺度變換如何,特征值的計(jì)算所消耗的時(shí)間都是常量。這樣只要遍歷圖像一次,就可以求得所有子窗口的特征值。積分圖[2]定義為:

其中 I(x′,y′)為圖像在點(diǎn)(x′,y′)處的像素值。 為了節(jié)約時(shí)間,減少重復(fù)計(jì)算,則圖像I的積分圖可按如下遞推公式計(jì)算:

這樣就可以進(jìn)行任意矩形區(qū)域內(nèi)像素積分運(yùn)算。由圖像的積分圖可快速地計(jì)算圖像中任意矩形內(nèi)所有像素灰度積分。如圖2所示,點(diǎn)1的積分圖像的值為(其中Sum為求和):

圖2 特征和計(jì)算Fig.2 The sum of features

同理,點(diǎn)2、點(diǎn)3、點(diǎn)4的積分圖像分別為:

矩形區(qū)域D內(nèi)的所有像素灰度積分可由矩形端點(diǎn)的積分圖像值得到:

Adaboost是一種迭代算法,其核心思想是針對(duì)同一個(gè)訓(xùn)練集訓(xùn)練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構(gòu)成一個(gè)更強(qiáng)的最終分類器(強(qiáng)分類器)。其算法本身是通過改變數(shù)據(jù)分布來實(shí)現(xiàn)的,它根據(jù)每次訓(xùn)練集之中每個(gè)樣本的分類是否正確,以及上次的總體分類的準(zhǔn)確率,來確定每個(gè)樣本的權(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)整每個(gè)樣本對(duì)應(yīng)的權(quán)重來實(shí)現(xiàn)的。開始時(shí),每個(gè)樣本對(duì)應(yīng)的權(quán)重是相同的,即其中 n為樣本個(gè)數(shù),在此樣本分布下訓(xùn)練出一弱分類器。對(duì)于分類錯(cuò)誤的樣本,加大其對(duì)應(yīng)的權(quán)重;而對(duì)于分類正確的樣本,降低其權(quán)重,這樣分類錯(cuò)的樣本就被突出出來,從而得到一個(gè)新的樣本分布。在新的樣本分布下,再次對(duì)弱分類器進(jìn)行訓(xùn)練,得到弱分類器。依次類推,經(jīng)過 T次循環(huán),得到 T個(gè)弱分類器,把這T個(gè)弱分類器按一定的權(quán)重疊加(boost)起來,得到最終想要的強(qiáng)分類器。
Adaboost[3]的具體算法如下:
設(shè)輸入 的 n 個(gè) 訓(xùn)練 樣本為:{(x1,y1),(x2,y2)......(xn,yn)},其中xi是輸入的訓(xùn)練樣本,yi∈{0,1}分別表示正樣本和負(fù)樣本,其中正樣本數(shù)為l,負(fù)樣本數(shù)為m。n=l+m,具體步驟如下:
1)初始化每個(gè)樣本的權(quán)重;

2)對(duì)每個(gè) t=1,...,T(T 為弱分類器的個(gè)數(shù))
①把權(quán)重歸一化為一個(gè)概率分布:

如此使得ωt為一個(gè)概率分布。
② 對(duì)每個(gè)特征f,訓(xùn)練一個(gè)弱分類器hj,計(jì)算對(duì)應(yīng)所有特征的弱分類器的加權(quán)錯(cuò)誤率

③ 選取最佳的弱分類器ht(擁有最小錯(cuò)誤率):θt
④按照這個(gè)最佳弱分類器,調(diào)整權(quán)重:

其中θi=0表示被正確的分類,ei=1表示被錯(cuò)誤的分類,當(dāng)錯(cuò)誤分類時(shí):

3)最后的強(qiáng)分類器為:

級(jí)聯(lián)分類器是由多個(gè)強(qiáng)分類器級(jí)聯(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ā)到某一層時(shí),分類器得到的結(jié)果是非人臉時(shí),就立即停止對(duì)圖像的檢測(cè)。級(jí)聯(lián)分類器的結(jié)構(gòu)類似于金字塔,如圖3所示,通過級(jí)聯(lián)分類器,可以很對(duì)人臉做出檢測(cè)。由于本系統(tǒng)較為簡(jiǎn)單,所以只用到了4級(jí)強(qiáng)分類器構(gòu)成級(jí)聯(lián)分類器。

圖3 金字塔結(jié)構(gòu)Fig.3 The structure of Pyramid
基于VC++6.0搭建的人機(jī)界面,如圖4所示,該系統(tǒng)主要由3個(gè)部分組成,視頻成像區(qū),檢測(cè)區(qū),和菜單區(qū)。視頻成像區(qū)主要是基于攝像頭獲取的圖像進(jìn)行顯示,檢測(cè)區(qū)主要是基于視頻頭中的人臉和靜態(tài)圖像中的人臉的檢測(cè),并在左上方顯示出檢測(cè)到的人臉的圖像,菜單區(qū)是主要實(shí)現(xiàn)基于攝像頭視頻和靜態(tài)圖像中人臉檢測(cè)的操作。在視頻成像區(qū)下方,有 detect(檢測(cè))選項(xiàng)和 run(開始)選項(xiàng)。

圖4 人臉檢測(cè)系統(tǒng)界面Fig.4 The interface of face detection system
2.2.1 系統(tǒng)流程
該系統(tǒng)可分為兩個(gè)模塊,靜態(tài)圖像人臉檢測(cè)和視頻圖像中的人臉檢測(cè)。
基于靜態(tài)圖像的人臉檢測(cè)流程大致可分為4個(gè)過程(如圖5所示):1)加載已經(jīng)訓(xùn)練好的分類器;2)將其轉(zhuǎn)化為計(jì)算機(jī)可以識(shí)別的內(nèi)部格式;3)加載該圖片以進(jìn)行檢測(cè);4)顯示檢測(cè)結(jié)果到檢測(cè)區(qū)。

圖5 基于靜態(tài)圖像的人臉檢測(cè)流程Fig.5 Flow chart of face detection based on static image
基于視頻圖像的人臉檢測(cè)主要流程為:1)攝像頭提取圖像;2)加載已訓(xùn)練好的級(jí)聯(lián)分類器并將圖像其轉(zhuǎn)化為內(nèi)部各式;3)判斷檢測(cè)標(biāo)志位,若為真,首先捕獲當(dāng)前一幀并創(chuàng)建該幀圖像,然后載入當(dāng)前一幀圖像,并對(duì)圖像的人臉區(qū)域進(jìn)行檢測(cè),反之,結(jié)束檢測(cè);4)將檢測(cè)到的結(jié)果顯示到檢測(cè)區(qū)。
2.2.2 openCV人臉檢測(cè)主要函數(shù)
openCV軟件包中提供了豐富的基于圖像和視頻處理的視覺類庫[4],該系統(tǒng)主要用到的函數(shù)[5]有:
1)cascade=(CvHaarClassifierCascade*)cvLoad (cascade_name,0,0,0); 該函數(shù)試下去呢載入級(jí)聯(lián)分類器的功能,其中,cascade_name為級(jí)聯(lián)分類器的路徑。
2)CvMemStorage*storage=cvCreateMemStorage(0);該函數(shù)創(chuàng)建一個(gè)默認(rèn)大小為64 kB的內(nèi)存塊并返回指向塊首的指針。
3)CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,1.1,1,0,cvSize(40,40));該函數(shù)的功能是使用訓(xùn)練好的級(jí)聯(lián)分類器在圖像中找到包含人臉目標(biāo)的矩形區(qū)域,并將這個(gè)區(qū)域作為一個(gè)矩形框返回。
4)cvRectangle(img,LeftPoint,RightPoint,color,2,7,0);該函數(shù)實(shí)現(xiàn)對(duì)檢測(cè)到的人臉區(qū)域用方框標(biāo)記出來。
5)獲得被檢測(cè)到的人臉后,要對(duì)圖像進(jìn)行包括圖像色彩轉(zhuǎn)換、圖像大小變換和直方圖均衡化等相關(guān)處理,方可把檢測(cè)到的人臉顯示在檢測(cè)區(qū)中。相關(guān)的函數(shù)包括:cvCvtColor(img,gray,CV_BGR2GRAY); 該函數(shù)是對(duì)圖像進(jìn)行色彩轉(zhuǎn)換。 cvResize(gray,small_img,CV_INTER_LINEAR);該函數(shù)是對(duì)圖像的大小進(jìn)行變換。cvEqualizeHist(small_img,small_img);該函數(shù)的作用是對(duì)灰度圖像直方圖的均衡化。
6)對(duì)于視頻圖像的人臉檢測(cè)來說,還需要從電腦上的攝像頭讀取視頻,openCV提供很好的實(shí)時(shí)視頻采集,cvCapture*cvCaptureFromCAM (int 1);該函數(shù)的功能是對(duì)攝像頭(個(gè)數(shù)為1)打開進(jìn)行定義。
制作分類器[6]需要制作正樣本文件和負(fù)樣本文件。負(fù)樣本可以來自于任意的圖片,但這些圖片不能包含目標(biāo)特征。負(fù)樣本由背景描述文件來描述。背景描述文件是一個(gè)文本文件,每一行包含了一個(gè)負(fù)樣本圖片的文件名(基于描述文件的相對(duì)路徑),該文件創(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,則在圖片路徑下生成一個(gè)negdata.dat文件,打開該文件將最后一行的negdata.dat刪除,這樣就生成了負(fù)樣本描述文件。對(duì)于正樣本文件,通常的做法是先把所有正樣本裁切好,并對(duì)尺寸做規(guī)整。由于HaarTraining訓(xùn)練時(shí)輸入的正樣本是vec文件,所以需要使用openCV自帶的CreateSamples程序,將準(zhǔn)備好的正樣本轉(zhuǎn)換為vec文件。正、負(fù)樣本創(chuàng)建之后,接下來要訓(xùn)練分類器,這個(gè)過程是由haartraining程序來實(shí)現(xiàn)的。該程序源碼由openCV自帶,且可執(zhí)行的程序在openCV安裝目錄的bin目錄下。訓(xùn)練結(jié)束后,會(huì)在目錄data下生成一些子目錄,即為訓(xùn)練好的分類器。用performance.exe進(jìn)行樣本的測(cè)試訓(xùn)練,最終生成xml文件。
在個(gè)人用的筆記本電腦上進(jìn)行視頻圖像中的人臉檢測(cè)和圖片中的人臉檢測(cè)的測(cè)試,得到程序測(cè)試圖如圖6和圖7所示。結(jié)果表明,基于openCV的簡(jiǎn)單的人臉檢測(cè)系統(tǒng),可以快速的從視頻或靜態(tài)圖像中檢測(cè)到人臉,在檢測(cè)區(qū)將人臉用方框標(biāo)記,并在檢測(cè)區(qū)左上方顯示出檢測(cè)到的人臉。

圖6 基于攝像頭視頻的人臉檢測(cè)結(jié)果Fig.6 Result of face detection based on camera video
文中簡(jiǎn)要闡述了在Adaboost人臉檢測(cè)算法的基礎(chǔ)上,采用級(jí)聯(lián)分類器的方法檢測(cè)動(dòng)態(tài)視頻和靜態(tài)圖像中人臉,在檢測(cè)區(qū)對(duì)人臉進(jìn)行標(biāo)記,并對(duì)結(jié)果進(jìn)行了分析。分析結(jié)果顯示,采用計(jì)算機(jī)視覺類庫openCV實(shí)現(xiàn)基于Adaboost算法的人臉檢測(cè),具有檢測(cè)速度快,檢測(cè)結(jié)果準(zhǔn)確,實(shí)時(shí)性強(qiáng)等優(yōu)點(diǎn),且實(shí)現(xiàn)的方法簡(jiǎn)單實(shí)用。文中所闡述的基于openCV的簡(jiǎn)單人臉檢測(cè)系統(tǒng)可用于其他人臉識(shí)別與實(shí)時(shí)監(jiān)控的軟件系統(tǒng)開發(fā)。

圖7 基于靜態(tài)圖片的人臉檢測(cè)結(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ì)算機(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算法的人臉檢測(cè)人系統(tǒng)的研究與實(shí)現(xiàn)[D].長(zhǎng)春:吉林大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,2008.
[4]郭磊,王秋光.Adaboost人臉檢測(cè)算法研究及OpenCV實(shí)現(xiàn)[J].哈爾濱理工大學(xué)學(xué)報(bào),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ì)算機(jī)視覺技術(shù)實(shí)現(xiàn)[M].北京:科學(xué)出版社,2008.
[6]唐徙文,曾義.人臉檢測(cè)級(jí)聯(lián)分類器快速訓(xùn)練算法[J].計(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.