1. 程式人生 > >Haar特徵與積分圖

Haar特徵與積分圖

Haar特徵與積分圖

1. Adaboost方法的引入

1.1 Boosting方法的提出和發展

        在瞭解Adaboost方法之前,先了解一下Boosting方法。

        回答一個是與否的問題,隨機猜測可以獲得50%的正確率。如果一種方法能獲得比隨機猜測稍微高一點的正確率,則就可以稱該得到這個方法的過程為弱學習;如果一個方法可以顯著提高猜測的正確率,則稱獲取該方法的過程為強學習。1994年,Kearns和Valiant證明,在Valiant的PAC(Probably ApproximatelyCorrect)模型中,只要資料足夠多,就可以將弱學習演算法通過整合的方式提高到任意精度。實際上,1990年,SChapire就首先構造出一種多項式級的演算法,將弱學習演算法提升為強學習演算法,就是最初的Boosting演算法。Boosting意思為提升、加強,現在一般指將弱學習提升為強學習的一類演算法。1993年,Drucker和Schapire首次以神經網路作為弱學習器,利用Boosting演算法解決實際問題。前面指出,將弱學習演算法通過整合的方式提高到任意精度,是Kearns和Valiant在1994年才證明的,雖然Boosting方法在1990年已經提出,但它的真正成熟,也是在1994年之後才開始的。1995年,Freund提出了一種效率更高的Boosting演算法。

1.2 AdaBoost演算法的提出

        1995年,Freund和Schapire提出了Adaboost演算法,是對Boosting演算法的一大提升。Adaboost是Boosting家族的代表演算法之一,全稱為Adaptive Boosting。Adaptively,即適應地,該方法根據弱學習的結果反饋適應地調整假設的錯誤率,所以Adaboost不需要預先知道假設的錯誤率下限。也正因為如此,它不需要任何關於弱學習器效能的先驗知識,而且和Boosting演算法具有同樣的效率,所以在提出之後得到了廣泛的應用。

 

首先,Adaboost是一種基於級聯分類模型的分類器。級聯分類模型可以用下圖表示:

 

級聯分類器介紹:級聯分類器就是將多個強分類器連線在一起進行操作。每一個強分類器都由若干個弱分類器加權組成,

例如,有些強分類器可能包含10個弱分類器,有些則包含20個弱分類器,一般情況下一個級聯用的強分類器包含20個左右的弱分類器,然後在將10個強分類器級聯起來,就構成了一個級聯強分類器,這個級聯強分類器中總共包括200弱分類器。因為每一個強分類器對負樣本的判別準確度非常高,所以一旦發現檢測到的目標位負樣本,就不在繼續呼叫下面的強分類器,減少了很多的檢測時間。因為一幅影象中待檢測的區域很多都是負樣本,這樣由級聯分類器在分類器的初期就拋棄了很多負樣本的複雜檢測,所以級聯分類器的速度是非常快的;只有正樣本才會送到下一個強分類器進行再次檢驗,這樣就保證了最後輸出的正樣本的偽正(false positive)的可能性非常低。

 也有一些情況下不適用級聯分類器,就簡單的使用一個強分類器的情況,這種情況下一般強分類器都包含200個左右的弱分類器可以達到最佳效果。不過級聯分類器的效果和單獨的一個強分類器差不多,但是速度上卻有很大的提升。

 級聯結構分類器由多個弱分類器組成,每一級都比前一級複雜。每個分類器可以讓幾乎所有的正例通過,同時濾除大部分負例。這樣每一級的待檢測正例就比前一級少,排除了大量的非檢測目標,可大大提高檢測速度。

其次,Adaboost是一種迭代演算法。初始時,所有訓練樣本的權重都被設為相等,在此樣本分佈下訓練出一個弱分類器。在第(  =1,2,3, …T,T為迭代次數)次迭代中,樣本的權重由第  -1次迭代的結果而定。在每次迭代的最後,都有一個調整權重的過程,被分類錯誤的樣本將得到更高的權重。這樣分錯的樣本就被突出出來,得到一個新的樣本分佈。在新的樣本分佈下,再次對弱分類器進行訓練,得到新的弱分類器。經過T次迴圈,得到T個弱分類器,把這T個弱分類器按照一定的權重疊加起來,就得到最終的強分類器。

2. 矩形特徵

2.1 Haar特徵\矩形特徵

AdaBoost演算法的實現,採用的是輸入影象的矩形特徵,也叫Haar特徵。下面簡要介紹矩形特徵的特點。

影響Adaboost檢測訓練演算法速度很重要的兩方面是特徵的選取和特徵值的計算。臉部的一些特徵可以由矩形特徵簡單地描繪。用圖2示範:

上圖中兩個矩形特徵,表示出人臉的某些特徵。比如中間一幅表示眼睛區域的顏色比臉頰區域的顏色深,右邊一幅表示鼻樑兩側比鼻樑的顏色要深。同樣,其他目標,如眼睛等,也可以用一些矩形特徵來表示。使用特徵比單純地使用畫素點具有很大的優越性,並且速度更快。

在給定有限的資料情況下,基於特徵的檢測能夠編碼特定區域的狀態,而且基於特徵的系統比基於象素的系統要快得多。
矩形特徵對一些簡單的圖形結構,比如邊緣、線段,比較敏感,但是其只能描述特定走向(水平、垂直、對角)的結構,因此比較粗略。如上圖,臉部一些特徵能夠由矩形特徵簡單地描繪,例如,通常,眼睛要比臉頰顏色更深;鼻樑兩側要比鼻樑顏色要深;嘴巴要比周圍顏色更深。

對於一個 24×24 檢測器,其內的矩形特徵數量超過160,000 個,必須通過特定演算法甄選合適的矩形特徵,並將其組合成強分類器才能檢測人臉。

常用的矩形特徵有三種:兩矩形特徵、三矩形特徵、四矩形特徵,如圖:

 

由圖表可以看出,兩矩形特徵反映的是邊緣特徵,三矩形特徵反映的是線性特徵、四矩形特徵反映的是特定方向特徵。

特徵模板的特徵值定義為:白色矩形畫素和減去黑色矩形畫素和。接下來,要解決兩個問題,1:求出每個待檢測子視窗中的特徵個數。2:求出每個特徵的特徵值。

子視窗中的特徵個數即為特徵矩形的個數。訓練時,將每一個特徵在訓練影象子視窗中進行滑動計算,獲取各個位置的各類矩形特徵。在子視窗中位於不同位置的同一型別矩形特徵,屬於不同的特徵。可以證明,在確定了特徵的形式之後,矩形特徵的數量只與子視窗的大小有關[11]。在24×24的檢測視窗中,矩形特徵的數量約為160,000個。

特徵模板可以在子視窗內以“任意”尺寸“任意”放置,每一種形態稱為一個特徵。找出子視窗所有特徵,是進行弱分類訓練的基礎。

 

2.2子視窗內的條件矩形,矩形特徵個數的計算

如圖所示的一個m*m大小的子視窗,可以計算在這麼大的子視窗記憶體在多少個矩形特徵。

以 m×m 畫素解析度的檢測器為例,其內部存在的滿足特定條件的所有矩形的總數可以這樣計算:
對於 m×m 子視窗,我們只需要確定了矩形左上頂點A(x1,y1)和右下頂點B(x2,63) ,即可以確定一個矩形;如果這個矩形還必須滿足下面兩個條件(稱為(s, t)條件,滿足(s, t)條件的矩形稱為條件矩形):

1) x 方向邊長必須能被自然數s 整除(能均等分成s 段);
2) y 方向邊長必須能被自然數t 整除(能均等分成t 段);
則 , 這個矩形的最小尺寸為s×t 或t×s, 最大尺寸為[m/s]·s×[m/t]·t 或[m/t]·t×[m/s]·s;其中[ ]為取整運算子。

2.3條件矩形的數量

我們通過下面兩步就可以定位一個滿足條件的矩形:

由上分析可知,在m×m 子視窗中,滿足(s, t)條件的所有矩形的數量為:

 

實際上,(s, t)條件描述了矩形特徵的特徵,下面列出了不同矩形特徵對應的(s, t)條件:

 

下面以 24×24 子視窗為例,具體計算其特徵總數量:

 

下面列出了,在不同子視窗大小內,特徵的總數量:

 

3. 積分圖

3.1 積分圖的概念

在獲取了矩形特徵後,要計算矩形特徵的值。Viola等人提出了利用積分圖求特徵值的方法。積分圖的概念可用圖3表示:

座標A(x,y)的積分圖是其左上角的所有畫素之和(圖中的陰影部分)。定義為:

    

其中ii(x,y)表示積分圖,i(x,y)表示原始影象,對於彩色影象,是此點的顏色值;對於灰度影象,是其灰度值,範圍為0~255。

 

在上圖中,A(x,y)表示點(x,y)的積分圖;s(x,y)表示點(x,y)的y方向的所有原始影象之和。積分圖也可以用公式(2)和公式(3)得出:

 

3.2 利用積分圖計算特徵值

 

3.3 計算特徵值

由上一節已經知道,一個區域的畫素值,可以由該區域的端點的積分圖來計算。由前面特徵模板的特徵值的定義可以推出,矩形特徵的特徵值可以由特徵端點的積分圖計算出來。以“兩矩形特徵”中的第二個特徵為例,如下圖,使用積分圖計算其特徵值:

 

級聯分類器與檢測過程

 

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

 

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

 

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

轉自:https://blog.csdn.net/liulina603/article/details/8617281