目前一般使用的Haar-like特徵主要包括Paul Viola和Michal Jones在人臉檢測中使用的由Papageorgiou C首先提出的原始矩形特徵和Rainer Lienhart 和 Jochen Maydt提出的擴展矩形特徵。算法
圖1.Haar-like特徵api
Haar-like特徵值的計算就是用圖中矩形模板中白色矩形內全部像素值的和減去黑色矩形內全部像素值的和。Haar-like特徵能夠有效的提取圖像的紋理特徵,各模板經過平移、縮放提取不一樣位置和尺度的特徵值。因此Haar-like特徵的數量是巨大的,對於給定的W×H的圖片,其一個矩形特徵的數量爲:網絡
其中,wxh爲特徵模板尺寸性能
表示特徵模板在水平和垂直方向放大的最大比例。而對於45度的特徵數量爲:學習
關於這個公式,其推導過程比較難懂。在此說說個人理解:
首先得清楚兩點:
一、對於圖2中的某一特徵,特徵自己能夠沿水平、豎直方向縮放;水平方向需以w爲單位縮放,豎直方向需以h爲單位進行縮放;即縮放後寬高比可能與原特徵寬高比不一樣,但縮放後,寬和高與原特徵的寬和高是成比例的。因此對於圖2中某一w*h的矩形,其有X*Y种放大方式。spa
二、對圖2中的某一特徵矩形及其縮放後的特徵矩形,其處於圖像的位置不一樣,Haar特徵不一樣,因此需在窗口中滑動計算。例如圖2中的1(a)特徵大小爲2*1,對於24*24的圖像,水平可滑動23步,垂直可滑動24步,因此共有23*24個特徵。3d
理解了這兩點後如何繞開原著一大堆推導過程獲得上述公式呢?
在此引用一個網友的相比之下簡潔明瞭的推導過程:blog
這個公式是從機率方面獲得的,由於haar特徵框沒有對寬和高作比例的限制,所以其兩邊個數的選擇爲獨立同分布事件(此塊不知如何用語言描述,如不能理解請直接看計算步驟)。所以以高度邊爲例,haar特徵框爲h,訓練圖像爲H,則:
1)特徵框放大1倍(無放大):有(H-h+1)個特徵
2)特徵框放大2倍(只放大h一邊,下同):有(H-2h+1)個特徵
3)特徵框放大3倍:有(H-3h+1)個特徵
如此直到放大H/h倍
4)特徵框放大H/h倍:有1個特徵,即有(H-H/h*h+1)個特徵
以上所有相加有:
H-h+1+H-2h+1+H-3h+1+......+H-H/h*h+1=H*H/h+H/h-h*H/h*(1+H/h)/2
設H/h=Y,則上式可變爲Y(H+1-h(1+Y)/2),同理,對寬度邊作一樣處理可獲得X(W+1-w(1+X)/2),由於這種選取符合獨立同分布事件,所以總個數能夠直接相乘獲得,至此獲得文章中的公式。排序
看完他的表達有一種豁然開朗的感受!很顯然,在肯定了特徵的形式以後,矩形特徵的數量只與子窗口的大小有關。在24×24的檢測窗口中,能夠產生數以10萬計的特徵,對這些特徵求值的計算量是很是大的。
因爲數量的巨大,因此解決特徵的快速計算將顯得尤其重要。Paul Viola和Michal Jones提出使用積分圖來實現特徵的快速運算。構造的積分圖中的像素點存儲其左上方全部像素值之和,即:事件
其中,I(x,y)表示圖像(x,y)位置的像素值。顯然,積分圖能夠經過增量的方式經過迭代運算來實現:
邊界的初始化爲:
式子看上去沒有想象的那麼直觀易懂,你能夠試着在紙上畫小方格,假設x=2,y=2,用上述式子來推出SAT(x,y),與你在紙上獲得的SAT(x,y)比較,就會恍然大悟。
獲得積分圖後,計算矩形區域像素的和將只需四次查找和加減運算便可完成,以下圖3所示:
圖2.積分圖中矩形區域像素值和的計算示意圖
假設區域D的四個頂點爲a,b,c,d,則區域D內的像素和爲:
由此能夠看出,積分圖能夠加速特徵值的計算。
在瞭解Adaboost以前,先了解一下Boosting算法。
回答一個是與否的問題,隨機猜想能夠得到50%的正確率。若一種方法能得到比隨機猜想稍微高一點的正確率,則稱獲得這個方法的過程爲弱學習;若一種方法能顯著提升猜想的正確率,則稱獲得這個方法的過程爲強學習。「弱」和「強」很形象的表達了這兩個過程。
1994年,Kearns和Valiant證實:在Valiant的PAC(Probably Approximately Correct)模型中,只要數據足夠多,就能夠將弱學習算法經過集成的方式提升至任意精度。實際上,1990年,Schapire就首先構造出一種多項式級的算法,將弱學習算法提高爲強學習算法,就是最初的Boosting算法。Boosting意思爲提高、增強,如今通常指將弱學習提高爲強學習的一類算法。1993年,Drucker和Schapire首次以神經網絡做爲弱學習器,利用Boosting算法解決實際問題。前面指出,將弱學習算法經過集成的方式提升至任意精度,是Kearns和Valiant在1994年才證實的。雖然Boosting方法在1990年已經提出,但它真正成熟,也是在1994年以後纔開始的。
1995年,Freund和Schapire提出了Adaboost算法,是對Boosting算法的一大提高。Adaboost是Boosting家族的表明算法之一,全稱爲Adaptive Boosting。Adaptively,即適應性地,該算法根據弱學習的結果反饋適應地調整假設的錯誤率,因此Adaboost不須要預先知道假設的錯誤率下限。也正由於如此,它不須要任何關於弱學習器性能的先驗知識,並且和Boosting算法具備一樣的效率,因此提出以後獲得了普遍的應用。
傳統的提高算法須要解決兩個問題:(1)對於同一訓練數據集,怎樣改變其樣本分佈達到重複訓練的目的;(2)弱分類器的有機組合問題。
對於這兩個問題,Adaboost給出了「自適應」解決方法。首先,針對同一訓練集經過賦予樣本權重並在每一輪中根據分類結果改變其權重以獲得同一訓練集不一樣樣本分佈的目的。具體作法是經過賦予每個訓練樣本一個權重來標榜其重要性,具備較大權重的樣本獲得更大的正確分類的機率,這樣在每一輪訓練中所重點關注的樣本將會不一樣,從而達到同同樣本集不一樣分佈的目的。而樣本權重的更新是基於弱學習器對於當前訓練集中樣本的分類正確與否,具體地,提升那些被前一輪弱分類器錯誤分類的樣本的權值,下降那些被正確分類樣本的權值,這樣使下一輪弱分類器的訓練更多關注錯分的樣本,這樣,分類問題被弱分類器「分而治之」。
其次,弱分類器的組合採起加權多數表決的方法。具體地,分類偏差率小的弱分類器將加大組合權重,使其在表決中有較大的「影響力」,而偏差率大的弱分類器將減少其組合權重。這樣,將這些在訓練過程當中關注不一樣樣本不一樣特徵的弱分類器按其分類偏差率進行加權組合即構成一個分類性能更爲強大的最終分類器(強分類器)。能夠看到,使用Adaboost算法能夠提取對分類較有影響力的特徵,並將重點放在關鍵的訓練數據上面。
Adaboost算法描述以下:
假設輸入:數據集D={(x1,y1),(x2,y2),...,(xm,ym)};其中yi=0,1表示負樣本和正樣本;學習的循環次數爲T。
過程:
一、初始化樣本權重:對於yi=0,1的樣本分別初始化其權重爲ω1,i=1/m,1/l;其中m和l分別表示爲負樣本的數量和正樣本的數量。
二、for t=1,...T:
①權重歸一化,
②對每一個特徵j,訓練一個弱分類器hj(如何訓練弱分類器,以後會說起),計算全部特徵的加權錯誤率εf
③從②肯定的弱分類器中,找出一個具備最小εt的弱分類器ht;
④更新每一個樣本對應的權重
這裏,若是樣本xi被正確分類,則ei=0,不然ei=1,而
三、最終造成的強分類器組成爲:
其中:
在使用Adaboost算法訓練分類器以前,須要準備好正、負樣本,根據樣本特色選擇和構造特徵集。由算法的訓練過程可知,當弱分類器對樣本分類正確,樣本的權重會減少;而分類錯誤時,樣本的權重會增長。這樣,後面的分類器會增強對錯分樣本的訓練。最後,組合全部的弱分類器造成強分類器,經過比較這些弱分類器投票的加權和與平均投票結果來檢測圖像。
弱分類器之因此稱爲弱分類器,是由於咱們並不指望選擇出來的分類器具備很強的分類效果。舉例說明,對於一個給定的問題,在某一輪的訓練過程當中,獲得的弱分類器對於訓練樣本的分類率可能只有 51%。也就是說,只要弱分類器的分類率比隨機預測略好就能夠(隨機預測的分類率是 50%)。在每一輪的訓練結束之後,根據本輪選擇出來的弱分類器對訓練樣本的分類正確與否,修改各個樣本的權重,使得分類錯誤的樣本權重增長。全部的訓練過程結束後,產生的強分類器由各輪產生的弱分類器經過加權的投票造成。
怎麼樣來保證對於分類效果好的分類器賦予一個較高的權值,而對於分類效果很差的分類器賦予一個較低的權值呢?Adaboost 提供了一個很強有力的機制,把弱分類器和特徵掛起勾來,把性能很好的分類器選擇出來,並賦予相應的權值。將弱分類器和特徵掛鉤起來的一個很直接的方法是,將弱分類器和特徵作一一對應的關係,也就是說,一個弱分類器僅僅依賴一個特徵。爲了實現這個機制,每一輪分類器的訓練的過程就是選擇一個矩形特徵,使得這個特徵能最好的將正訓練樣本和反訓練樣本分離開。弱學習過程在每一輪訓練過程當中,對於每個特徵來講(有不少個特徵,如24*24的圖片,特徵的數量高達160000),都要肯定一個最優閾值,使得該閾值對樣本的分類效果最好。這樣,每一輪訓練過程均可以獲得一個分類效果最好的特徵(即從160000個特徵中選擇一個錯誤率最低的),而該特徵所對應的弱分類器就是該輪所選出的弱分類器。
在肯定了訓練子窗口中的矩形特徵數量和特徵值後,須要對每個特徵f,訓練一個弱分類器h(x,f,p,θ);
一個弱分類器是一個特徵 f(x)和一個閾值θ 的混合物。訓練一個弱分類器,就是在當前權重分佈的狀況下,肯定 f(x)的最優閾值,使得這個弱分類器對全部訓練樣本的分類偏差最低。選取一個最佳弱分類器就是選擇那個對全部訓練樣本的分類偏差在全部弱分類器中最低的那個弱分類器(特徵)。
因而,經過把這個排序的表從頭至尾掃描一遍就能夠爲弱分類器選擇使分類偏差 最小的閾值(最優閾值),以下圖所示
圖3.訓練一個弱分類器的算法
特別說明:在前期準備訓練樣本的時候,須要將樣本歸一化和灰度化到規定尺寸大小,這樣每一個樣本的都是灰度圖像而且樣本的大小一致,保證了每個Haar特徵(描述的是特徵的位置)都在每個樣本中出現。
在實際應用中使用一個強分類器每每沒法精確解決一些複雜的分類問題,並同時達到高檢出率和低誤檢率的要求,一般使用級聯的強分類器(cascade classifier)來解決這一問題。級聯分類器的策略是,將若干個強分類器由簡單到複雜排列,使每級強分類器具備較高的檢出率,而誤檢率的要求能夠放低,假設每級的檢出率爲99.9%,誤檢率爲50%,那麼一個15級的級聯分類器的檢測率爲0.99915≈0.9851;0.515≈0.00003,這樣就能夠知足現實要求了。
訓練過程當中,級聯強分類器中的每一級分類器採用AdaBoost算法訓練獲得,對於第一級強分類器,訓練數據爲全體訓練樣本,指定了較高的檢測率而對誤檢率只要求不小於隨機結果,因此訓練過程當中通常只需用到少許分類性能較強的特徵就能夠達到指定要求;而對於第二級強分類器,訓練數據的負樣本更新爲第一級強分類器對原始負樣本的誤檢樣本,這樣,第下一級強分類器的訓練將針對第上一級難以分開的樣本進行,通常地,會使用產生稍多的特徵及弱分類器,如此繼續,便獲得最後的由簡單到複雜排列的級聯強分類器。
特別說明:級聯分類器中的每一強分類器都包含若干個弱分類器,而每一個弱分類器都是使用前述的Adaboost算法結合Haar-like特徵訓練獲得的。
訓練過程當中,級聯強分類器中的每一級分類器採用AdaBoost算法訓練獲得,對於第一級強分類器,訓練數據爲全體訓練樣本,指定了較高的檢測率而對誤檢率只要求不小於隨機結果,因此訓練過程當中通常只需用到少許分類性能較強的特徵就能夠達到指定要求;而對於第二級強分類器,訓練數據的負樣本更新爲第一級強分類器對原始負樣本的誤檢樣本,這樣,第下一級強分類器的訓練將針對第上一級難以分開的樣本進行,通常地,會使用產生稍多的特徵及弱分類器,如此繼續,便獲得最後的由簡單到複雜排列的級聯強分類器。
在對輸入圖像進行檢測時,通常須要對圖像進行多區域、多尺度的檢測。所謂多區域,就是要對取樣子窗口進行平移操做,以檢測到每一個區域。因爲訓練時候所使用的正樣本都是歸一化到固定尺寸的圖像,因此必須使用多尺度檢測以解決比訓練樣本尺寸更大的目標的檢測。多尺度檢測通常有兩種策略,一種是使子窗口的尺寸固定,經過不斷縮放圖片來實現,顯然,這種方法須要完成圖像的縮放和特徵值的從新計算,效率不高;而另外一種方法,經過不斷擴大初始化爲訓練樣本尺寸的窗口,達到多尺度取樣檢測的目的,這樣就避免了第一種方法的弱勢。但在窗口擴大檢測的過程當中會出現同一個目標被屢次檢測的狀況,因此須要進行區域的合併處理。
不管哪種搜索方法,都會從待檢測圖像取樣大量的子窗口圖像,這些子窗口圖像會被級聯分類器一級一級不斷地篩選,只有檢出爲非負區域才能進入下一步檢測,不然做爲非目標區域丟棄,只有經過全部級聯的強分類器並判斷爲正區域纔是最後檢測獲得的目標區域。級聯分類器的檢測過程以下圖:
通過 Adaboost 算法的訓練獲得的強分類器具備最小化的錯誤率,而不是很高的檢測率。一般,高檢測率的代價是高誤識率,從而引發錯誤率增長。要提升第i層強分類器的檢測率達到di ,一個簡單而有效的方法是下降強分類器的閾值;要下降第i層強分類器的誤識率到fi ,一個簡單而有效的方法是提升強分類器的閾值,與提升第i層強分類器的檢測率相悖。經過實驗結果分析,增長弱分類器個數,在提升強分類器檢測率的同時下降了誤識率,但該方案增長了弱分類器的個數會引發計算時間的增長。因此,構造層疊分類器時要考慮兩個平衡:
構造層疊分類器的每層強分類器時就是要找到上述兩個平衡的平衡點。