AdaBoost人臉訓練算法

 

目前在實際中應用人臉檢測方法多爲基於Adaboost學習算法的方法,這種檢測方法最初由劍橋大學的兩位大牛Paul Viola和Michael Jones[ViolaJones01]提出,並由另一位大牛英特爾公司的Rainer Lienhart[Lienhart02]對這一方法進行了改善。

這裏,我先介紹ViolaJones的人臉檢測方法,然後再介紹Lienhart的人臉檢測算法。

我們可以發現,兩種檢測方法的大體框架是相同的,只是在Harr-like特徵的選取、計算以及AdaBoost的訓練算法上有區別。

 

ViolaJones人臉檢測方法

 

ViolaJones人臉檢測方法是一種基於積分圖、級聯檢測器和AdaBoost算法的方法,方法框架可以分爲以下三大部分:
    (1)使用Harr-like特徵表示人臉,使用“積分圖”實現特徵數值的快速計算;
    (2)使用Adaboost算法挑選出一些最能代表人臉的矩形特徵(弱分類器),按照加權投票的方式將弱分類器構造爲一個強分類器;
    (3)將訓練得到的若干強分類器串聯組成一個級聯結構的層疊分類器,級聯結構能有效地提高分類器的檢測速度。

 

一、Haar-like矩形特徵的特徵值的快速計算方法

 

影響AdaBoost人臉檢測訓練算法速度很重要的兩方面是特徵選取和特徵計算。選取的特徵爲矩特徵爲Haar特徵,計算的方法爲積分圖。

 

1、Haar-like特徵

 

Haar-like特徵最早是由Papageorgiou等應用於人臉表示,Viola和Jones在此基礎上,使用3種類型4種形式的特徵。

3種類型分別爲:2-矩形特徵、3-矩形特徵、4-矩形特徵。

Haar特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。

特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形像素和減去黑色矩形像素和。

 

 對於圖中的A,  B和D這類特徵,特徵數值計算公式爲:v=Sum白-Sum黑

 而對於C來說,計算公式如下:v=Sum白-2*Sum黑

之所以將黑色區域像素和乘以2,是爲了使兩種矩形區域中像素數目一致。

 

通過改變特徵模板的大小和位置,可在圖像子窗口中窮舉出大量的特徵。

上圖的特徵模板稱爲“特徵原型”;特徵原型在圖像子窗口中擴展(平移伸縮)得到的特徵稱爲“矩形特徵”;矩形特徵的稱爲“特徵值”。

假設訓練或檢測窗口大小爲W x H個像素,w , h分別爲特徵原型的長、寬,所示四種特徵原型對應的w /h分別爲:2/1,1/2,3/1,2/2。

 

一個haar-like特徵在24*24像素圖的子檢測窗口中的矩形特徵數量總計爲134736個。

 

2、積分圖(Integral Image)

 

積分圖主要的思想是將圖像從起點開始到各個點所形成的矩形區域像素之和作爲一個數組的元素保存在內存中,當要計算某個區域的像素和時可以直接索引數組的元素,不用重新計算這個區域的像素和,從而加快了計算。(最近聽過屈婉玲老師課的話,應該知道,這有個相應的稱呼,叫做動態規劃算法)

 

點(x,y)處的積分圖,定義爲點(x,y)左上角所有像素和。用公式表示爲:

 

其中,I(x',y')爲圖像在點(x',y')處的像素值。

爲了節約時間,減少重複計算,則積分圖可按如下遞推公式計算:

 

其中,ii(x,y)爲點(x,y)的積分圖,i(x,y)爲點(x,y)處的像素值,s(x,y)爲點(x,y)的累計行總和。

 

這樣就可以進行2種運算:

(1)任意矩形區域內像素積分

由圖像的積分圖可方便快速地計算圖像中任意矩形內所有像素灰度積分。

如下圖所示,點1的積分圖像

ii1的值爲(其中Sum爲求和):

ii1=Sum(A)

 

同理,點2、點3、點4的積分圖像分別爲:

ii2=Sum(A)+Sum(B);

ii3=Sum(A)+Sum(C);

ii4=Sum(A)+Sum(B)+Sum(C)+Sum(D);

矩形區域D內的所有像素灰度積分可由矩形端點的積分圖像值得到:

        Sum(D)=ii1+ii4-(ii2+ii3)            (1)

 

(2)特徵值計算

矩形特徵的特徵值是兩個不同的矩形區域像素和之差。

由(1)式可以計算任意矩形特徵的特徵值。

 

上圖中,該特徵原型的特徵值定義爲:Sum(A)-Sum(B);

根據(1)式則有:Sum(A)=ii4+ii1-(ii2+ii3);Sum(B)=ii6+ii3-(ii4+ii5);

所以此類特徵原型的特徵值爲:(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)

 

矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管此特徵矩形的尺度變換如何,特徵值的計算所消耗的時間都是常量。這樣只要遍歷圖像一次,就可以求得所有子窗口的特徵值。

 

二、使用Adaboost算法選取優化的弱分類器和級聯結構的層疊分類器

 

在確定了特徵形式後,Harr- like特徵的數量就取決於訓練樣本圖像矩陣的大小,特徵模板在子窗口內任意放置,一種形態稱爲一種特徵,找出所有子窗口的特徵是進行弱分類訓練的基礎。

訓練過程分爲3個步驟:首先需要提取Haar特徵;然後將Haar特徵轉化成對應的弱分類器;最後從大量的弱分類器中迭代選擇出最優弱分類器。

 

(1)提取Haar特徵

 

 

常用的Haar特徵有4種。

當然也可以在這4種特徵的基礎上設計出更多、更復雜的特徵。以大小爲24x24像素的訓練樣本爲例,上述4種特徵的總個數超過了160000個。

這樣龐大的數字給後續的迭代訓練工作帶來了龐大的計算量,直接導致AdaBoost算法訓練過程極爲費時,這恰恰是算法需要改進的關鍵問題之一。

 

(2)生成弱分類器

 

AdaBoost的學習算法能從一個很大的特徵集中選擇很小的一部分關鍵的特徵,從而產生一個極其有效的分類器。

最初的AdaBoost學習算法可用於提高一個簡單的分類器(有時又稱爲弱分類器)的性能,它最終形成的強分類器的訓練錯誤率接近於零,而且具有很好的推廣性。

每一個Haar特徵都對應着一個弱分類器,每一個弱分類器都是根據它所對應的Haar特徵的參數來定義的。利用上述Haar特徵的位置信息,對訓練樣本進行統計就可以得到對應的特徵參數。

Viola共定義了180,000種矩形特徵,這個數遠大於圖像中像素的數目。每個特徵都能很快計算出來,再通過試驗選出一小部分作爲特徵以形成一個有效的分類器。要得到最終的強分類器,最重要的是如何找到這些特徵。

爲此起見,每個弱分類器的設計都是從能對正例和反例進行正確分類的所有弱分類器的集合中選擇錯誤率最小的一個。對每個特徵而言,弱學習器決定弱分類器的最佳的閾值,使其具有最小的誤分樣本數。

因此一個弱分類器(hj(x))是由一個特徵(fj)、一個閾值(θj)和一個指示不等式方向的校驗器(pj)構成:

 

其中x表示圖像中一個24 x24像素大小的子窗口。

 

(3)採用AdaBoost算法選取優化的弱分類

 

通過Adaboost算法挑選數千個有效的haar特徵來組成人臉檢測器,Adaboost算法中不同的訓練集是通過調整每個樣本對應的權重來實現的。

開始時,每個樣本對應的權重是相同的,對於h1分類錯誤的樣本,加大其對應的權重;而對於分類正確的樣本,降低其權重,這樣分錯的樣本就被突出出來,從而得到一個新的樣本分佈U2。

在新的樣本分佈下,再次對弱分類器進行訓練,得到弱分類器h2。依次類推,經過T次循環,得到T個弱分類器,把這T個弱分類器按一定的權重疊加(boost)起來,得到最終想要的強分類器。

 

 

 

這裏,我給出訓練弱分類器和選取優化的弱分類器的算法(算法圖若看不清,請點擊放大):

 

 

分類器訓練完以後,就可以應用於輸入圖像中的感興趣區域(與訓練樣本相同的尺寸)的檢測。檢測到目標區域(汽車或人臉)分類器輸出爲1,否則輸出爲0。

爲了檢測整副圖像,可以在圖像中移動搜索窗口,檢測每一個位置來確定可能的目標。爲了搜索不同大小的目標物體,分類器被設計爲可以進行尺寸改變,這樣比改變待檢圖像的尺寸大小更爲有效。

所以,爲了在圖像中檢測未知大小的目標物體,掃描程序通常需要用不同比例大小的搜索窗口對圖片進行幾次掃描。

 

(4)構成級聯結構的層疊分類器

 

每個特定分類器所使用的特徵用形狀、感興趣區域中的位置以及比例係數(這裏的比例係數跟檢測時候採用的比例係數是不一樣的,儘管最後會取兩個係數的乘積值)來定義。

分類器中的“級聯”是指最終的分類器是由幾個簡單分類器級聯組成。在圖像檢測中,被檢窗口依次通過每一級分類器,這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即爲目標區域。

 

 

同樣,我們給定訓練級聯結構的分類器的算法(算法圖若看不清,請點擊放大):

 

 

補充:訓練樣本的選擇和訓練系統總體框架

 

訓練樣本要求是面部特寫圖像,下圖是一簇訓練樣本,大小被歸一化爲24×24像素。

其中,正訓練樣本要求是面部特寫圖像,但是人臉形態千差萬別,所以訓練樣本選取過程中要考慮到樣本的多樣性。

負訓練樣本,大小被歸一化爲24×24像素,其中各樣本不完全相同,分別具有一定的代表性。

 

訓練系統總體框架,由“訓練部分”和“補充部分”構成。依據系統框架,本文的訓練系統可分爲以下幾個模塊:

(1)以樣本集爲輸入,在給定的矩形特徵原型下,計算並獲得矩形特徵集;

       (2)以特徵集爲輸入,根據給定的弱學習算法,確定閾值,將特徵與弱分類器一一對應,獲得弱分類器集;

        (3)以弱分類器集爲輸入,在訓練檢出率和誤判率限制下,使用A d a B o o s t算法

挑選最優的弱分類器構成強分類器;

       (4)以強分類器集爲輸入,將其組合爲級聯分類器;

        (5)以非人臉圖片集爲輸入,組合強分類器爲臨時的級聯分類器,篩選並補充非人臉樣本。

 

Lienhart的人臉檢測方法

 

就像我一開始說的,比起ViolaJones人臉檢測方法,Lienhart的人臉檢測方法只是在Harr-like特徵的選取、計算以及AdaBoost的訓練算法上有區別。

 

一、Harr-like特徵的選取

 

Lienhart提出了一些新的旋轉Haar-like特徵。

 

包含4個邊緣特徵、8個線性特徵和2箇中心特徵。

而對角線特徵(對應圖中的4)沒有用到,是因爲對角線特徵和線性特徵裏的特徵相似。

在特徵值的計算過程中,黑色區域的權值爲負值,白色區域的權值爲正值。

 

二、特徵值的計算

 

對於豎直矩陣,我們定義SAT(x,y)爲點(x,y)左上角區域的像素和。

用公式可以表示爲:

 

爲了節約時間,減少重複計算,可按如下遞推公式計算:

 

而計算矩陣特徵的特徵值,是位於對角線矩形SAT(x,y)之差。可參考下圖:

 

        

   

    對於45°旋角的矩形,我們定義RSAT(x,y)爲點(x,y)左上角45°區域和左下角45°區域的像素和。

       

 

用公式可以表示爲:

 

爲了節約時間,減少重複計算,可按如下遞推公式計算:

 

 

 

而計算矩陣特徵的特徵值,是位於十字行矩形RSAT(x,y)之差。可參考下圖:

 

 

三、AdaBoost的訓練算法

 

Lienhart通過學習得到的系統能夠用於旋轉人臉的快速檢測,同時也能使平均的誤檢率降低10%。

此外他還研究了一些其他的Boosting算法,如:離散的Adaboost算法(Discrete Adaboost),實值的Adaboost算法(Real Adaboost)和平緩的Adaboost算法(Gentle Adaboost)。

通過比較得出基於平緩的Adaboost算法(Gentle Adaboost)效果較好。

 

離散的Adaboost算法和平緩的Adaboost算法如下(算法圖若看不清,請點擊放大):

 

 

總的來說,基於Adaboost算法的系統在速度方面具有很大的優越性。它是在提出的一系列Haar-like特徵的基礎上,通過Adaboost算法學習一些弱分類器,再組合成一個強分器。

但一般一個強分類器還不足以圓滿完成任務,還要級聯一系列這樣的強分類器,但是要進一步提高檢測精度,就需要級聯更多的強分類器,但是這樣又會降低檢測速度。

我們認爲一方面可以採用更好的、計算卻更簡單的圖像特徵表述方法;另一方面就是綜合Adaboost和一些強分類器。

在Adaboost學習的過程中,可以提高正例學習的閾值,如可以將每級常採用的正檢率閾值(一般設爲98.5%)適當增加,當然誤檢的非人臉會相應增加,這樣學習得到的一些弱分類器組合後形成的強分類器作爲分級分類器的前面幾級,最後再用一個強分類器進一步過濾。

由於在前幾級消除了大多數的非人臉,因此通過最後一級強分類器的窗口將大大減少。這樣可以獲得一個既提高檢測速度又提高檢測精度的系統。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章