1. 程式人生 > >Adaboost分類器 haar特徵 整理

Adaboost分類器 haar特徵 整理

Adaboost是一種迭代演算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)

其演算法本身是通過改變資料分佈來實現的,它根據每次訓練集之中每個樣本的分類是否正確以及上次的總體分類的準確率,來確定每個樣本的權值

將修改過權值的新資料集送給下層分類器進行訓練,最後將每次訓練得到的分類器最後融合起來,作為最後的決策分類器。

使用adaboost分類器可以排除一些不必要的訓練資料特徵,並將關鍵放在關鍵的訓練資料上面。  目前,對Adaboost演算法的研究以及應用大多集中於分類問題,同時近年也出現了一些在迴歸問題上的應用。就其應用Adaboost

系列主要解決了:兩類問題、多類單標籤問題、多類多標籤問題、大類單標籤問題,迴歸問題。它用全部的訓練樣本進行學習。  1.1Adaboost(AdaptiveBoosting)演算法  對於boosting演算法,存在兩個問題:  1.如何調整訓練集,使得在訓練集上訓練的弱分類器得以進行;  2.如何將訓練得到的各個弱分類器聯合起來形成強分類器。  針對以上兩個問題,adaboost演算法進行了調整:  1.使用加權後選取的訓練資料代替隨機選取的訓練樣本,這樣將訓練的焦點集中在比較難分的訓練資料樣本上;  2.將弱分類器聯合起來,使用加權的投票機制代替平均投票機制。讓分類效果好的弱分類器具有較大的權重,而分類效果差的分類器具有較小的權重。  Adaboost
演算法是FreundSchapire根據線上分配演算法提出的,他們詳細分析了Adaboost演算法錯誤率的上界,以及為了使強分類器 達到錯誤率,演算法所需要的最多迭代次數等相關問題。

Boosting演算法不同的是adaboost演算法不需要預先知道弱學習演算法學習正確率的下限即弱分類器的誤差,並且最後得到的強分類器的分類精度依賴於所有弱分類器的分類精度,這樣可以深入挖掘弱分類器演算法的能力。  Adaboost演算法中不同的訓練集是通過調整每個樣本對應的權重來實現的。開始時,每個樣本對應的權重是相同的,即其中n為樣本個數,在此樣本分佈下訓練出一弱分類器。對於分類錯誤的樣本,加大其對應的權重;而對於分類正確的樣本,降低其權重,這樣分錯的樣本就被突出出來,從而得到一個新的樣本分佈。在新的樣本分佈下,再次對弱分類器進行訓練,得到弱分類器。依次類推,經過T

次迴圈,得到T個弱分類器,把這T個弱分類器按一定的權重疊加(boost)起來,得到最終想要的強分類器。  1.給定訓練樣本集S,其中XY分別對應於正例樣本和負例樣本;T為訓練的最大迴圈次數;

  2.初始化樣本權重為1/n,即為訓練樣本的初始概率分佈;

  3.第一次迭代:

  (1)訓練樣本的概率分佈相當下,訓練弱分類器:

  (2)計算弱分類器的錯誤率:

  (3)選取合適閾值,使得錯誤率最小

  (4)更新樣本權重:

  (5)最終得到的強分類器:

每輪迴圈後,權值應做多大的調整呢?這個答案依賴於當前分類器的總體誤差。明確地說,如果e代表分類器在加權資料上的誤差率(在01之間的一個小數),那麼對於正確分類的例項,權值更新為

權值=權值*e/(1-e)

對於錯誤分類的例項,權值保持不變。當然,這並沒有如前所述,增加被錯誤分類的例項的權值。然而,在更新了所有例項的權值後,要進行正常化處理,使它們的權值總和與原來的相同。每個例項的權值都要除以新權值總和再乘以原來的權值總和。這樣便自動增加了每個錯誤分類例項的權值,同時減小了每個正確分類例項的權值。

每當在加權的訓練資料集上的誤差率大於等於0.5時,提升程式將刪除當前的分類器並不再繼續進行迴圈。當誤差率等於0時,也同樣處理,因為這時所有例項的權值都為0

為了做出一個預測,使用一個加了權的投票來組合它們的輸出。要決定這些權值,效能表現好的分類器(e接近於0)應當獲得一個高的權值,而效能表現差的分類器(e接近於0.5)則應獲得一個較低的權值。更具體地說

權值=-log(e/(1-e))

這是一個0和無窮大之間的正數。為了做出預測,將投給某個具體類的所有分類器的權值相加,選擇相加總和最大的那個類別。  Adaboost演算法是經過調整的Boosting演算法,其能夠對弱學習得到的弱分類器的錯誤進行適應性調整。上述演算法中迭代了T次的主迴圈,每一次迴圈根據當前的權重分佈對樣本x定一個分佈P,然後對這個分佈下的樣本使用若學習演算法得到一個錯誤率為e的弱分類器,對於這個演算法定義的弱學習演算法的錯誤率的上限並不需要事先知道,實際上。每一次迭代,都要對權重進行更新。更新的規則是:減小弱分類器分類效果較好的資料的概率,增大弱分類器分類效果較差的資料的概率。最終的分類器是個弱分類器的加權平均。

一個弱分類器就是一個基本和上圖類似的決策樹,最基本的弱分類器只包含一個Haar-like特徵,也就是它的決策樹只有一層,被稱為樹樁(stump)。

        最重要的就是如何決定每個結點判斷的輸出,要比較輸入圖片的特徵值和弱分類器中特徵,一定需要一個閾值,當輸入圖片的特徵值大於該閾值時才判定其為人臉。訓練最優弱分類器的過程實際上就是在尋找合適的分類器閾值,使該分類器對所有樣本的判讀誤差最低。

具體操作過程如下:

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

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

  在表中尋找e值最小的元素,則該元素作為最優閾值。有了該閾值,我們的第一個最優弱分類器就誕生了。

強分類器的誕生需要T輪的迭代,具體操作如下:

1.給定訓練樣本集S,共N個樣本,其中XY分別對應於正樣本和負樣本; T為訓練的最大迴圈次數;  

2.初始化樣本權重為1/N,即為訓練樣本的初始概率分佈;  

3.第一次迭代訓練N個樣本,得到第一個最優弱分類器,

4.提高上一輪中被誤判的樣本的權重;

5.將新的樣本和上次本分錯的樣本放在一起進行新一輪的訓練。

6.迴圈執行4-5步驟,T輪後得到T個最優弱分類器。

7.組合T個最優弱分類器得到強分類器,組合方式如下:

 或

1. 先通過對N個訓練樣本的學習得到第一個弱分類器; 2. 將分錯的樣本和其他的新資料一起構成一個新的N個的訓練樣本,通過對這個樣本的學習得到第二個弱分類器 ; 3. 將1和2都分錯了的樣本加上其他的新樣本構成另一個新的N個的訓練樣本,通過對這個樣本的學習得到第三個弱分類器; 4. 最終經過提升的強分類器 。即某個資料被分為哪一類要通過 , ……的多數表決。

下面我們講講級聯分類器的訓練

K是一個級聯檢測器的層數,D是該級聯分類器的檢測率,F是該級聯分類器的誤識率,di是第i層強分類器的檢測率,fi是第i層強分類器的誤識率。如果要訓練一個級聯分類器達到給定的F值和D值,只需要訓練出每層的d值和f值,這樣:

d^K = D, f^K = F

級聯分類器的要點就是如何訓練每層強分類器的d值和f值達到指定要求。

         AdaBoost訓練出來的強分類器一般具有較小的誤識率,但檢測率並不很高,一般情況下,高檢測率會導致高誤識率,這是強分類閾值的劃分導致的,要提高強分類器的檢測率既要降低閾值,要降低強分類器的誤識率就要提高閾值,這是個矛盾的事情。據參考論文的實驗結果,增加分類器個數可以在提高強分類器檢測率的同時降低誤識率,所以級聯分類器在訓練時要考慮如下平衡,一是弱分類器的個數和計算時間的平衡,二是強分類器檢測率和誤識率之間的平衡。

      具體訓練方法如下,我用偽碼的形式給出:

1)設定每層最小要達到的檢測率d,最大誤識率f,最終級聯分類器的誤識率Ft;

2)P=人臉訓練樣本,N=非人臉訓練樣本,D0=1.0,F0=1.0;

3)i=0;

4)for : Fi>Ft

++i;

l ni=0;Fi=Fi-1;

for :Fi>f*Fi-1

++ni;

利用AdaBoost演算法在P和N上訓練具有ni個弱分類器的強分類器;

衡量當前級聯分類器的檢測率Di和誤識率Fi;

for :di<d*Di-1;

Ø 降低第i層的強分類器閾值;

Ø 衡量當前級聯分類器的檢測率Di和誤識率Fi;

N = Φ;

利用當前的級聯分類器檢測非人臉影象,將誤識的影象放入N;