Adaboost算法詳解(haar人臉檢測)
Adaboost是一種叠代算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。Adaboost算法本身是通過改變數據分布來實現的,它根據每次訓練集之中每個樣本的分類是否正確,以及上次的總體分類的準確率,來確定每個樣本的權值。將修改過權值的新數據集送給下層分類器進行訓練,最後將每次得到的分類器最後融合起來,作為最後的決策分類器。
算法概述
1、先通過對N個訓練樣本的學習得到第一個弱分類器; 2、將分錯的樣本和其他的新數據一起構成一個新的N個的訓練樣本,通過對這個樣本的學習得到第二個弱分類器; 3、將1和2都分錯了的樣本加上其他的新樣本構成另一個新的N個的訓練樣本,通過對這個樣本的學習得到第三個弱分類器 4、最終經過提升的強分類器。即某個數據被分為哪一類要由各分類器權值決定。
與boosting算法比較
1. 使用加權後選取的訓練數據代替隨機選取的訓練樣本,這樣將訓練的焦點集中在比較難分的訓練數據樣本上; 2. 將弱分類器聯合起來,使用加權的投票機制代替平均投票機制。讓分類效果好的弱分類器具有較大的權重,而分類效果差的分類器具有較小的權重。
與Boosting算法不同的是,AdaBoost算法不需要預先知道弱學習算法學習正確率的下限即弱分類器的誤差,並且最後得到的強分類器的分類精度依賴於所有弱分類器的分類精度,這樣可以深入挖掘弱分類器算法的能力。
算法步驟
1. 給定訓練樣本集S,其中X和Y分別對應於正例樣本和負例樣本;T為訓練的最大循環次數; 2. 初始化樣本權重為1/n ,即為訓練樣本的初始概率分布; 3. 第一次叠代:(1)訓練樣本的概率分布相當,訓練弱分類器;(2)計算弱分類器的錯誤率;(3)選取合適閾值,使得誤差最小;(4)更新樣本權重; 經T次循環後,得到T個弱分類器,按更新的權重疊加,最終得到的強分類器。
具體步驟如下:
一.樣本
- Given: m examples (x1, y1), …, (xm, ym)
- where xi?X, yi?Y={-1, +1}
- xi表示X中第i個元素,
- yi表示與xi對應元素的屬性值,+1表示xi屬於某個分類,
- -1表示xi不屬於某個分類
二.初始化訓練樣本
- xi的權重D(i) :i=1,……,m;
- (1).若正負樣本數目一致,D1(i) = 1/m
- (2).若正負樣本數目m+, m-則正樣本D1(i) = 1/m+,
- 負樣本D1(i) = 1/m-
if(e>=0.5) stop;因為這個弱分類器將一半以上的樣本都分錯了;所以該特征不可作為弱分類器的特征使用;
實例詳解(例子好,必看)
圖中“+”和“-”表示兩種類別。我們用水平或者垂直的直線作為分類器進行分類。
算法開始前默認均勻分布D,共10個樣本,故每個樣本權值為0.1.
第一次分類:
第一次劃分有3個點劃分錯誤,根據誤差表達式
計算可得e1=(0.1+0.1+0.1)/1.0=0.3
分類器權重:
a1=(1/2).*(log((1-e1)./e1))=0.42;
然後根據算法把錯分點的權值變大。對於正確分類的7個點,權值不變,仍為0.1,對於錯分的3個點,權值為:
D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333
第二次分類:
如圖所示,有3個"-"分類錯誤。上輪分類後權值之和為:0.17+0.23333=1.3990
分類誤差:e2=0.1*3/1.3990=0.2144
分類器權重a2=0.6493
錯分的3個點權值為:D2=0.1*(1-0.2144)/0.2144=0.3664
第三次分類:
同上步驟可求得:e3=0.1365
;a3=0.9223
;D3=0.6326
最終的強分類器即為三個弱分類器的疊加,如下圖所示:
每個區域是屬於哪個屬性,由這個區域所在分類器的權值綜合決定。比如左下角的區域,屬於藍色分類區的權重為h1 中的0.42和h2 中的0.65,其和為1.07;屬於淡紅色分類區域的權重為h3 中的0.92;屬於淡紅色分類區的權重小於屬於藍色分類區的權值,因此左下角屬於藍色分類區。因此可以得到整合的結果如上圖所示,從結果圖中看,即使是簡單的分類器,組合起來也能獲得很好的分類效果。
分類器權值調整的原因
由公式可以看到,權值是關於誤差的表達式。每次叠代都會提高錯分點的權值,當下一次分類器再次錯分這些點之後,會提高整體的錯誤率,這樣就導致分類器權值變小,進而導致這個分類器在最終的混合分類器中的權值變小,也就是說,Adaboost算法讓正確率高的分類器占整體的權值更高,讓正確率低的分類器權值更低,從而提高最終分類器的正確率。
算法優缺點
優點
1)Adaboost是一種有很高精度的分類器 2)可以使用各種方法構建子分類器,Adaboost算法提供的是框架 3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單 4)簡單,不用做特征篩選 5)不用擔心overfitting(過度擬合)
缺點
1)容易受到噪聲幹擾,這也是大部分算法的缺點
2)訓練時間過長
3)執行效果依賴於弱分類器的選擇
y=y=(1-x)./x; (D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333)某點的權值的變化:
y=(1/2).*(log((1-x)./x));a1=(1/2).*(log((1-e1)./e1))=0.42;弱分類器權重:
這篇文章講解haar+adaboost檢測人臉將的好:https://www.cnblogs.com/dylantsou/archive/2012/08/11/2633483.html(主要看haar特征個數的計算;如何從haar特征中選取弱分類器需要的特征)
摘要:
基於haar特征的Adaboost人臉檢測技術
本文主要是對使用haar+Adabbost進行人臉檢測的一些原理進行說明,主要是快找工作了,督促自己復習下~~
一、AdaBoost算法原理
AdaBoost算法是一種叠代的算法,對於一組訓練集,通過改變其中每個樣本的分布概率,而得到不同的訓練集Si,對於每一個Si進行訓練從而得到一個弱分類器Hi,再將這些若分類器根據不同的權值組合起來,就得到了強分類器。
第一次的時候,每個樣本都是均勻分布,通過訓練得到分類器H0,在該訓練集中,分類正確的,就降低其分布概率;分類錯誤的,就提高其分布概率,這樣得到的新的訓練集S1就主要是針對不太好分類的樣本了。再使用S1進行訓練,得到分類器H1,依次叠代下去……,設叠代此外為T,則得到T個分類器。
對於每個分類器的權值,其分類準確性越高,權值越高。
二、Haar特征
Haar-like特征是計算機視覺領域一種常用的特征描述算子(也稱為Haar特征,這是因為Haar-like是受到一維haar小波的啟示而發明的,所以稱為類Haar特征),後來又將Haar-like擴展到三維空間(稱為3DHaar-Like)用來描述視頻中的動態特征。關於Haar的發展歷程如圖1所示。
2.1 特征樣子
就是一些矩形特征的模板,在viola&Jones的論文中,有下面這五種
在opencv中的方法中,有下面這14種,
2.2 特種的個數
對於一個給定的24X24的窗口,根據不同的位置,以及不同的縮放,可以產生超過160,000個特征。
特征個數的計算方法:
- int getHaarCount(int W, int H, int w, int h){
- int X = W / w;
- int Y = H / h;
- int count = 0;
- //放大Haar特征到 iw*jh
- for (int i = 1; i <= X; i++)
- for (int j = 1; j <= Y; j++)
- //滑動iw*jh矩形,遍歷圖像計算每個位置Haar特征
- for (int x = 1; x <= W - i*w + 1; x++)
- for (int y = 1; y <= H - j*h + 1; y++)
- count++;
- return count;
- }
2.3 特征計算方法——積分圖
有點類似於動態規劃的思想,一次計算,多次使用
對應於兩矩形特征2,矩陣A的值可以用i(5)+ii(1)-ii(4)-ii(2)表示,矩陣B的值用ii(6)+ii(2)-ii(3)-ii(5)表示
根據定義,haar特征的值為白色矩形減去黑色矩形的值。
三、選取弱分類器
一個弱分類器,實際上就是在這160,000+的特征中選取一個特征,用這個特征能夠區分出人臉or非人臉,且錯誤率最低。
現在有人臉樣本2000張,非人臉樣本4000張,這些樣本都經過了歸一化,大小都是24X24的圖像。那麽,對於160,000+中的任一特征fi,我們計算該特征在這2000人臉樣本、4000非人臉樣本上的值,這樣就得到6000個特征值。將這些特征值排序,然後選取一個最佳的特征值,在該特征值下,對於特征fi來說,樣本的加權錯誤率最低。選擇160,000+個特征中,錯誤率最低的特征,用來判斷人臉,這就是一個弱分類器,同時用此分類器對樣本進行分類,並更新樣本的權重。
轉自:http://blog.csdn.net/watkinsong/article/details/7631241(主要看弱分類器、強分類器的關系排布)
首先,Adaboost是一種基於級聯分類模型的分類器。級聯分類模型可以用下圖表示:
級聯分類器介紹:級聯分類器就是將多個強分類器連接在一起進行操作。每一個強分類器都由若幹個弱分類器加權組成,例如,有些強分類器可能包含10個弱分類器,有些則包含20個弱分類器,一般情況下一個級聯用的強分類器包含20個左右的弱分類器,然後在將10個強分類器級聯起來,就構成了一個級聯強分類器,這個級聯強分類器中總共包括200若分類器。因為每一個強分類器對負樣本的判別準確度非常高,所以一旦發現檢測到的目標位負樣本,就不在繼續調用下面的強分類器,減少了很多的檢測時間。因為一幅圖像中待檢測的區域很多都是負樣本,這樣由級聯分類器在分類器的初期就拋棄了很多負樣本的復雜檢測,所以級聯分類器的速度是非常快的;只有正樣本才會送到下一個強分類器進行再次檢驗,這樣就保證了最後輸出的正樣本的偽正(false positive)的可能性非常低。
也有一些情況下不適用級聯分類器,就簡單的使用一個強分類器的情況,這種情況下一般強分類器都包含200個左右的弱分類器可以達到最佳效果。不過級聯分類器的效果和單獨的一個強分類器差不多,但是速度上卻有很大的提升。
轉自:http://blog.csdn.net/watkinsong/article/details/7631949(主要看:分析為什麽haar可以用於檢測人臉;和弱分類器的訓練)
1. 弱分類器
在確定了訓練子窗口中的矩形特征數量和特征值後,需要對每一個特征f ,訓練一個弱分類器h(x,f,p,O) 。
在CSDN裏編輯公式太困難了,所以這裏和公式有關的都用截圖了。
特別說明:在前期準備訓練樣本的時候,需要將樣本歸一化和灰度化到20*20的大小,這樣每個樣本的都是灰度圖像並且樣本的大小一致,保證了每一個Haar特征(描述的是特征的位置)都在每一個樣本中出現。
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,計算所有訓練樣本的特征值,並將其排序。通過掃描一遍排好序的特征值,可以為這個特征確定一個最優的閾值,從而訓練成一個弱分類器。具體來說,對排好序的表中的每個元素,計算下面四個值:
6. 圖像檢測過程
在對輸入圖像進行檢測的時候,一般輸入圖像都會比20*20的訓練樣本大很多。在Adaboost 算法中采用了擴大檢測窗口的方法,而不是縮小圖片。
為什麽擴大檢測窗口而不是縮小圖片呢,在以前的圖像檢測中,一般都是將圖片連續縮小十一級,然後對每一級的圖像進行檢測,最後在對檢測出的每一級結果進行匯總。然而,有個問題就是,使用級聯分類器的AdaBoost的人臉檢測算法的速度非常的快,不可能采用圖像縮放的方法,因為僅僅是把圖像縮放11級的處理,就要消耗一秒鐘至少,已經不能達到Adaboost 的實時處理的要求了。
因為Haar特征具有與檢測窗口大小無關的特性(想要了解細節還要讀一下原作者的文獻),所以可以將檢測窗口進行級別方法。
在檢測的最初,檢測窗口和樣本大小一致,然後按照一定的尺度參數(即每次移動的像素個數,向左然後向下,一開始一次檢測20×20的區域)進行移動,遍歷整個圖像,標出可能的人臉區域。遍歷完以後按照指定的放大的倍數參數放大檢測窗口,然後在進行一次圖像遍歷;這樣不停的放大檢測窗口對檢測圖像進行遍歷,直到檢測窗口超過原圖像的一半以後停止遍歷。因為 整個算法的過程非常快,即使是遍歷了這麽多次,根據不同電腦的配置大概處理一幅圖像也就是幾十毫秒到一百毫秒左右。
在檢測窗口遍歷完一次圖像後,處理重疊的檢測到的人臉區域,進行合並等操作。
我的理解是:在檢測時:一開始用24×24的子窗口掃描原圖,子窗口分別用訓練好的Adaboost檢測,在第一級的時候就可以拋掉大部分的非人臉樣本了;然後將子窗口和特征窗口(haar窗口)放大相同的倍數再掃描原圖查找;
用Cascade Adaboost 檢測為什麽快:先用第一層檢測圖像標記可能是人臉的區域,用第二層檢測第一層標記的區域,再用第三層檢測第二層標記的區域,依次執行;被最後一層標記的區域即為人臉區域;
在檢測的最初,檢測窗口和樣本大小一致,然後按照一定的尺度參數(即每次移動的像素個數,向左然後向下,一開始一次檢測20×20的區域)進行移動,遍歷整個圖像,標出可能的人臉區域。
- 在檢測不同大小的人臉時,沒有采用金字塔策略,而是直接用不同尺度的人臉檢測器在同一幅圖像上掃。作者認為生成金字塔太慢。但除了24*24尺度的,其它尺度的檢測器的cascade細節幾乎沒有介紹。不知道是不是我搞錯了?
摘自:論文“Robust Real-Time Face Detection”:
這裏面的閾值(θ )應該是一個比值,表示的是前百分之多少判為正,(1-θ )×num判為正;
當判斷一個新值時也可以比較新特征在特征表中按大小排序的位置,看是不是百分之θ內的;
Adaboost算法:
Adaboost 和boosting 算法的區別:http://blog.csdn.net/whiteinblue/article/details/14518773
在最後顯然 a 表示的就是弱分類器的權值;當某個弱分類器認為是真樣本時使 h = 1;
假設 a 被歸一化了,那麽右邊必然等於0.5,左邊的 h 等於 0 或 1 ,意思豈不是判對的弱判決器的比重占到一半以上的話,就是正的話,你們強判決器就判為正;
誤檢率 F;檢測率 D ;
減小誤檢率的同時,也減小的檢測率;
Cascade Adaboost算法:
false positive rate:假正率、檢測為0的樣本中正樣本的概率:(檢測為1,實際為0的樣本)/(所有檢測為1的樣本);
TPR(True positive rate):召回率:(檢測為1實際也為1的樣本)/(所有檢測為1的樣本);
detection rate:(檢測到的正樣本)/(所有的正樣本);
- ? User selects values for f , the maximum acceptable false
- positive rate per layer and d, the minimum acceptable detection
- rate per layer.
- ? User selects target overall false positive rate, Ftarget.
- ? P = set of positive examples
- ? N = set of negative examples
- ? F0 = 1.0; D0 = 1.0
- ? i = 0
- ? while Fi > Ftarget (某層誤檢率小於Ftarget,則停止)
- – i ← i + 1
- – ni = 0; Fi = Fi?1
- – while Fi > f × Fi?1 (這層的錯檢率要小於上次的*f)
- ? ni ← ni + 1
- ? Use P and N to train a classifier with ni features using AdaBoost
- ? Evaluate current cascaded classifier on validation set to
- determine Fi and Di .
- ? Decrease threshold for the ith classifier until the current cascaded classifier has a detection rate of at least d × Di?1 (this also affects Fi )(這層的檢測率至少達到上次的檢測率*d)
- – N ← ?
- – If Fi > Ftarget then evaluate the current cascaded detector on the set of non-face images and put any false detections into the set N
- ? User selects values for f , the maximum acceptable false
- positive rate per layer and d, the minimum acceptable detection
- rate per layer.
- ? User selects target overall false positive rate, Ftarget.
- ? P = set of positive examples
- ? N = set of negative examples
- ? F0 = 1.0; D0 = 1.0
- ? i = 0
- ? while Fi > Ftarget (某層誤檢率小於Ftarget,則停止)
- – i ← i + 1
- – ni = 0; Fi = Fi?1
- – while Fi > f × Fi?1 (這層的錯檢率要小於上次的*f)
- ? ni ← ni + 1
- ? Use P and N to train a classifier with ni features using AdaBoost
- ? Evaluate current cascaded classifier on validation set to
- determine Fi and Di .
- ? Decrease threshold for the ith classifier until
- the current cascaded classifier has
- a detection rate of at least d × Di?1 (this also affects Fi )
- (這層的檢測率至少達到上次的檢測率*d)
- – N ← ?
- – If Fi > Ftarget then evaluate the current
- cascaded detector on the set of non-face images
- and put any false detections into the set N
反思:haar檢測中的特征個數為什麽那麽多,因為一個坐標的某個特征窗口的,某個尺寸就是一個特征;也就是說特征是由在歸一化後的訓練集(24×24圖片)的某個坐標上、某個特征窗、某個窗尺寸,,三個一起決定的,所以說訓練的時候,有所謂的是不是眼睛對齊、人臉在正中間等;
名詞解釋:
1 false positive rate(假陽率) :false positive rate,FPR.,誤診率或第Ⅰ類錯誤的。即實際無病或陰性,但被判為有病或陽性的百分比。
Adaboost算法詳解(haar人臉檢測)