1. 程式人生 > >adaboost 人臉檢測(3.2)

adaboost 人臉檢測(3.2)

1. 弱分類器

在確定了訓練子視窗中的矩形特徵數量和特徵值後,需要對每一個特徵f ,訓練一個弱分類器h(x,f,p,O) 。

在CSDN裡編輯公式太困難了,所以這裡和公式有關的都用截圖了。

特別說明:在前期準備訓練樣本的時候,需要將樣本歸一化和灰度化到20*20的大小,這樣每個樣本的都是灰度影象並且樣本的大小一致,保證了每一個Haar特徵(描述的是特徵的位置)都在每一個樣本中出現。

2. 訓練強分類器

在訓練強分類器中,T表示的是強分類器中包含的弱分類器的個數。當然,如果是採用級聯分類器,這裡的強分類器中的弱分類器的個數可能會比較少,多個強分類器在級聯起來。

在c(2)步驟中,“每個特徵f”指的是在20*20大小的訓練樣本中所有的可能出現的矩形特徵,大概要有80,000中,所有的這些都要進行計算。也就是要計算80,000個左右的弱分類器,在選擇效能好的分類器。

訓練強分類器的步驟如圖:

3. 再次介紹弱分類器以及為什麼可以使用Haar特徵進行分類

對於本演算法中的矩形特徵來說,弱分類器的特徵值f(x)就是矩形特徵的特徵值。由於在訓練的時候,選擇的訓練樣本集的尺寸等於檢測子視窗的尺寸,檢測子視窗的尺寸決定了矩形特徵的數量,所以訓練樣本集中的每個樣本的特徵相同且數量相同,而且一個特徵對一個樣本有一個固定的特徵值。

對於理想的畫素值隨機分佈的影象來說,同一個矩形特徵對不同影象的特徵值的平均值應該趨於一個定值k。
這個情況,也應該發生在非人臉樣本上,但是由於非人臉樣本不一定是畫素隨機的影象,因此上述判斷會有一個較大的偏差。

對每一個特徵,計算其對所有的一類樣本(人臉或者非人臉)的特徵值的平均值,最後得到所有特徵對所有一類樣本的平均值分佈。

下圖顯示了20×20 子窗口裡面的全部78,460 個矩形特徵對全部2,706個人臉樣本和4,381 個非人臉樣本6的特徵值平均數的分佈圖。由分佈看出,特徵的絕大部分的特徵值平均值都是分佈在0 前後的範圍內。出乎意料的是,人臉樣本與非人臉樣本的分佈曲線差別並不大,不過注意到特徵值大於或者小於某個值後,分佈曲線出現了一致性差別,這說明了絕大部分特徵對於識別人臉和非人臉的能力是很微小的,但是存在一些特徵及相應的閾值,可以有效地區分人臉樣本與非人臉樣本。

為了更好地說明問題,我們從78,460 個矩形特徵中隨機抽取了兩個特徵A和B,這兩個特徵遍歷了2,706 個人臉樣本和4,381 個非人臉樣本,計算了每張影象對應的特徵值,最後將特徵值進行了從小到大的排序,並按照這個新的順序表繪製了分佈圖如下所示:

可以看出,矩形特徵A在人臉樣本和非人臉樣本中的特徵值的分佈很相似,所以區分人臉和非人臉的能力很差。

下面看矩形特徵B在人臉樣本和非人臉樣本中特徵值的分佈:

可以看出,矩形特徵B的特徵值分佈,尤其是0點的位置,在人臉樣本和非人臉樣本中差別比較大,所以可以更好的實現對人臉分類。

由上述的分析,閾值q 的含義就清晰可見了。而方向指示符p 用以改變不等號的方向。

一個弱學習器(一個特徵)的要求僅僅是:它能夠以稍低於50%的錯誤率來區分人臉和非人臉影象,因此上面提到只能在某個概率範圍內準確地進行區分就
已經完全足夠。按照這個要求,可以把所有錯誤率低於50%的矩形特徵都找到(適當地選擇閾值,對於固定的訓練集,幾乎所有的矩形特徵都可以滿足上述要求)。每輪訓練,將選取當輪中的最佳弱分類器(在演算法中,迭代T 次即是選擇T 個最佳弱分類器),最後將每輪得到的最佳弱分類器按照一定方法提升(Boosting)為強分類器

4 弱分類器的訓練及選取

訓練一個弱分類器(特徵f)就是在當前權重分佈的情況下,確定f 的最優閾值,使得這個弱分類器(特徵f)對所有訓練樣本的分類誤差最低。
選取一個最佳弱分類器就是選擇那個對所有訓練樣本的分類誤差在所有弱分類器中最低的那個弱分類器(特徵)。

對於每個特徵 f,計算所有訓練樣本的特徵值,並將其排序。通過掃描一遍排好序的特徵值,可以為這個特徵確定一個最優的閾值,從而訓練成一個弱分類器。具體來說,對排好序的表中的每個元素,計算下面四個值:

5. 強分類器

注意,這裡所說的T=200個弱分類器,指的是非級聯的強分類器。若果是用級聯的強分類器,則每個強分類器的弱分類器的個數會相對較少。

一般學術界所說的級聯分類器,都是指的是級聯強分類器,一般情況有10個左右的強分類器,每個強分類有10-20個弱分類器。當然每一層的強分類器中弱分類器的個數可以不相等,可以根據需要在前面的層少放一些弱分類器,後面的層次逐漸的增加弱分類器的個數。

6. 影象檢測過程

在對輸入影象進行檢測的時候,一般輸入影象都會比20*20的訓練樣本大很多。在Adaboost 演算法中採用了擴大檢測視窗的方法,而不是縮小圖片。

為什麼擴大檢測視窗而不是縮小圖片呢,在以前的影象檢測中,一般都是將圖片連續縮小十一級,然後對每一級的影象進行檢測,最後在對檢測出的每一級結果進行彙總。然而,有個問題就是,使用級聯分類器的AdaBoost的人臉檢測演算法的速度非常的快,不可能採用影象縮放的方法,因為僅僅是把影象縮放11級的處理,就要消耗一秒鐘至少,已經不能達到Adaboost 的實時處理的要求了。

因為Haar特徵具有與檢測視窗大小無關的特性(想要了解細節還要讀一下原作者的文獻),所以可以將檢測視窗進行級別方法。

在檢測的最初,檢測視窗和樣本大小一致,然後按照一定的尺度引數(即每次移動的畫素個數,向左然後向下)進行移動,遍歷整個影象,標出可能的人臉區域。遍歷完以後按照指定的放大的倍數引數放大檢測視窗,然後在進行一次影象遍歷;這樣不停的放大檢測視窗對檢測影象進行遍歷,直到檢測視窗超過原影象的一半以後停止遍歷。因為整個演算法的過程非常快,即使是遍歷了這麼多次,根據不同電腦的配置大概處理一幅影象也就是幾十毫秒到一百毫秒左右。

在檢測視窗遍歷完一次影象後,處理重疊的檢測到的人臉區域,進行合併等操作。

程式程式碼樣例請到第一節找下載地址。