專欄地址:『youcans 的圖像處理學習課』
文章目錄:『youcans 的圖像處理學習課 - 總目錄』
3. Haar 特征及其加速計算
Haar 特征分類器是基于 Haar-like 特征提取的監(jiān)督學習分類器。我們首先討論 Haar 特征及其加速計算。
3.1 Haar 特征
Haar 特征用黑白兩種矩形框組合成特征模板,在特征模板內用黑色矩形像素和減去白色矩形像素和來表示這個模版的特征值。
矩形特征只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述在特定方向(水平、垂直、對角)上有明顯像素模塊梯度變化的圖像結構。
Haar 特征分為三類:邊緣特征、線性特征、中心特征和對角線特征。Haar 特征因為類似于 Haar 小波而得名,Haar-like 特征提取過程可以看作是對圖像局部進行 Haar 小波變換。
Lienhart R.等對 Haar-like 矩形特征庫作了進一步擴展,加入了旋轉 45度的對角線特征、中心環(huán)繞特征。擴展后的 Haar-like 特征大致分為 4 種類型:邊緣特征、線性特征、中心環(huán)繞特征和對角線特征。
Haar 特征值反映了圖像的灰度變化情況。例如:臉部的一些特征能由矩形特征簡單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等。
3.2 Haar 特征值的計算
特征模板在圖像子窗口中擴展(平移伸縮)得到的特征稱為“矩形特征”;矩形特征的值稱為“特征值”。
f = w w h i t e ? ∑ p i ∈ w h i t e p i ? w b l a c k ? ∑ p i ∈ b l a c k p i f = w_{white}*\sum_{p_i \in white}{p_i} - w_{black}*\sum_{p_i \in black}{p_i} f=wwhite??pi?∈white∑?pi??wblack??pi?∈black∑?pi?
其中,w 是權重,用于調節(jié)黑白區(qū)域面積平衡。當特征模板中黑白區(qū)域面積相等時 w=1,則特征值的計算簡化為:
f = ∑ 白色區(qū)域像素值 ? ∑ 黑色區(qū)域像素值 f = \sum{白色區(qū)域像素值} - \sum{黑色區(qū)域像素值} f=∑白色區(qū)域像素值?∑黑色區(qū)域像素值
矩形特征值是矩形位置、矩形大小和模板類型這三個變量的函數。
- 矩形位置:矩形模板框滑動遍歷圖像的每個位置,類似于卷積核;
- 矩形大小:矩形大小可以根據需要來定義。
- 模板類型:包括垂直、水平、對角等不同類型。
通過改變類別、大小和位置,就可以使很小的檢測窗口含有非常多的矩形特征,如:在24*24像素大小的檢測窗口內矩形特征數量可以達到16萬個。隨著圖像尺寸的擴大, 特征總量近似指數增長 ,這對于特征值的計算帶來了很大的挑戰(zhàn)。
積分圖就是只遍歷一次圖像就可以求出圖像中所有區(qū)域像素和的快速算法,大大的提高了圖像特征值計算的效率。
3.3 積分圖像
Crow 提出的積分圖像是一種快速計算圖像矩形區(qū)域和的算法。積分圖像是指對于圖像中的每一個像素,取其左上側區(qū)域的全部像素的累加值作為該像素的像素值。積分圖相當于建立了二維查找表,極大地降低了計算量、提高了計算速度。
利用積分圖像,使用 3次加減法就可以計算出圖像中任意矩形區(qū)域內像素值的和,由此可以快速實現圖像的均值濾波。
L ( x , y ) = ∑ i ≤ x ∑ j ≤ y I ( x , y ) s u m a b c d = L a ? L b ? L c + L d L(x,y) = \sum_{i \le x} \sum_{j \le y} I(x,y) \\ sum_{abcd} = L_a - L_b - L_c + L_d L(x,y)=i≤x∑?j≤y∑?I(x,y)sumabcd?=La??Lb??Lc?+Ld?
式中,L 表示積分圖像的像素值,I 表示輸入圖像的像素值,abcd表示矩形 S 的頂點。
通過積分圖像可以快速地計算出圖像中任意矩形區(qū)域內像素值的和、均值和均方差,計算復雜度僅為O(1),這對于像素的鄰域處理非常有效。
OpenCV 提供了函數 cv.integral 計算積分圖像。
函數說明:
cv.integral(src[, sum=None, sdepth=-1]) → sum
cv.integral2(src[, sum=None, sqsum=None, sdepth=-1, sqdepth=-1]) → sum, sqsum
cv.integral3(src[, sum=None, sqsum=None, tilted=None, sdepth=-1, sqdepth=-1]) → sum, sqsum, titled
函數 cv.integral 計算像素值的積分圖像,函數 cv.integral2 計算像素值的積分圖像和像素值的平方積分圖像,函數 cv.integral3 計算旋轉 45度的像素值的積分圖像。
s u m ( X , Y ) = ∑ x < X , y < y i m a g e ( x , y ) s q s u m ( X , Y ) = ∑ x < X , y < y i m a g e ( x , y ) 2 t i t l e d ( X , Y ) = ∑ y < y , a b s ( x ? X + 1 ) ≤ Y ? y ? 1 i m a g e ( x , y ) sum(X,Y) = \sum_{x<X,y<y} image(x,y) \\ sqsum(X,Y) = \sum_{x<X,y<y} image(x,y)^2 \\ titled(X,Y) = \sum_{y<y,abs(x-X+1) \le Y-y-1} image(x,y) \\ sum(X,Y)=x<X,y<y∑?image(x,y)sqsum(X,Y)=x<X,y<y∑?image(x,y)2titled(X,Y)=y<y,abs(x?X+1)≤Y?y?1∑?image(x,y)
參數說明:
- scr:輸入圖像,形狀 (H,W) 的 Numpy 數組,8位整型或浮點類型
- sum:積分圖像,形狀 (H+1,W+1) 的 Numpy 數組,32位整型或浮點類型
- sqsum:平方積分圖像,形狀 (H+1,W+1) 的 Numpy 數組,雙精度浮點類型
- titled:旋轉 45度的像素值積分圖像,形狀 (H+1,W+1) 的 Numpy 數組,類型與 sum 相同
- sdepth:積分圖像和旋轉積分圖像的深度,CV_32S/CV_32F/CV64F,可選項,默認值 -1
- sqdepth:平方積分圖像的深度,CV_32F/CV64F,可選項,默認值 -1
注意事項:
- 允許單通道輸入;對于多通道圖像,獨立地處理各通道的數據。
- 可以用可變窗口大小進行快速模糊或快速塊相關。
3.4 基于積分圖像加速計算 Haar 特征值
Haar 特征值是白色區(qū)域像素和與黑色區(qū)域像素和之差。使用積分圖像可以快速直接地計算白色區(qū)域或黑色區(qū)域的的像素和,而不需要遍歷像素累加計算,因此可以實現 Haar 特征值的加速計算。
如上圖所示,
f = ∑ 白色區(qū)域像素值 ? ∑ 黑色區(qū)域像素值 = I n t e g r a l ( A r e a w h i t e ) ? I n t e g r a l ( A r e a b l a c k ) = s u m a b d e ? s u m b c e f = ( L a ? L b ? L d + L e ) ? ( L b ? L c ? L e + L f ) = ( L a ? L b ) ? ( L b ? L c ) ? ( L d ? L e ) + ( L e ? L f ) \begin{aligned} f &= \sum{白色區(qū)域像素值} - \sum{黑色區(qū)域像素值} \\ &= Integral(Area_{white}) - Integral(Area_{black}) \\ &= sum_{abde} - sum_{bcef} \\ &= (L_a - L_b - L_d + L_e) - (L_b - L_c - L_e + L_f) \\ &= (L_a - L_b) - (L_b - L_c) - (L_d - L_e) + (L_e - L_f) \end{aligned} f?=∑白色區(qū)域像素值?∑黑色區(qū)域像素值=Integral(Areawhite?)?Integral(Areablack?)=sumabde??sumbcef?=(La??Lb??Ld?+Le?)?(Lb??Lc??Le?+Lf?)=(La??Lb?)?(Lb??Lc?)?(Ld??Le?)+(Le??Lf?)?
提取圖像的 Haar 特征需要大量重復計算多個尺度矩形的和,反復遍歷每個像素,基于積分圖像的方法是使用動態(tài)規(guī)劃思想,極大地降低了計算時間。
4. Haar 特征級聯(lián)分類器
Haar 特征分類器是基于 Haar-like 特征,使用積分圖像加速計算,并用 Adaboost 訓練的強分類器級聯(lián)方法來進行特征檢測的監(jiān)督學習分類器。
4.1 Adaboost 算法
Adaboost 算法( Adaptive Boosting )是一種通用的分類器性能提升算法,其核心思想是針對同一個訓練集訓練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構成一個更強的最終分類器(強分類器)。
Boosting 是一種重要的集成學習技術,主要思想是通過一些簡單的規(guī)則整合,將預測精度較低的弱學習器增強為預測精度較高的強學習器,為學習算法的設計提供了一種有效的新思路和新方法。作為一種元算法框架,Boosting 幾乎可以應用于所有目前流行的機器學習算法,以加強原算法的預測精度。
Adaboost 算法是一種有效而實用的 Boosting 算法,算法的原理是通過調整樣本權重和弱分類器權值,從訓練出的弱分類器中篩選出權值系數最小的弱分類器組合成一個最終強分類器。
Adaboost 算法是一種迭代訓練算法,對樣本訓練集中的關鍵分類特征集進行多次挑選,逐步訓練分量弱分類器。使用適當的閾值選擇最佳弱分類器,最后將每次迭代訓練選出的最佳弱分類器構建為強分類器。
Adaboost 算法的訓練過程是:
- 先通過對 N 個訓練樣本集的學習得到第 1 個弱分類器;
- 將分錯的樣本和其他的新樣本一起構成一個新的 N 個樣本的訓練集,通過對這個訓練集的學習得到第 2 個弱分類器 ;
- 將 1 和 2 都分錯了的樣本和其他的新樣本構成另一個新的 N 個樣本的訓練集,通過對這個訓練集的學習得到第 3 個弱分類器;
- 依次類推,直到獲得最終的強分類器。
Adaboost 算法的基本步驟如下:
- 構建第一個弱學習器,找到性能最好的“樹樁”(stump)。
- 計算“樹樁”的分類誤差:
e t = ∑ i = 1 n w i ? ∣ h j ( x i ) ? y i ∣ e_t = \sum^n_{i=1} w_i * |h_j(x_i) - y_i| et?=i=1∑n?wi??∣hj?(xi?)?yi?∣
- 調整“樹樁”的權重:
α = 1 2 l n ( 1 ? e t e t ) \alpha = \frac{1}{2} ln(\frac{1-e_t}{e_t}) α=21?ln(et?1?et??)
- 調整樣本權重:
w t + 1 , i ← w t , i β t 1 ? e t w i ← w i ∑ j = 1 n w j w_{t+1, i} \leftarrow w_{t,i} \beta_t^{1-e_t}\\ w_i \leftarrow \frac{w_i}{\sum^n_{j=1} w_j} wt+1,i?←wt,i?βt1?et??wi?←∑j=1n?wj?wi??
- 再次運行,構造一個新的自舉數據集。
- 重復以上過程,直到達到終止條件。
- 將弱學習器組合成一個集成模型。
Adaboost 算法廣泛應用于二分類問題、多類單標簽問題、多類多標簽問題、大類單標簽問題和回歸問題。使用 Adaboost 算法構造 Haar 特征分類器,可以更好地選擇矩形特征的組合,這些矩形特征的組合就構成了分類器,分類器以決策樹的方式存儲這些矩形特征組合。
4.2 級聯(lián)分類器
級聯(lián)分類器(Cascade Classifier)是多個 AdaBoost 強分類器的級聯(lián)組合,可以使用較少的特征和簡單的分類器更快更好的實現分類。檢測圖像中的被檢窗口依次通過每一級分類器,通過全部各級分類器的檢測區(qū)域就是目標區(qū)域。由于大部分候選區(qū)域在前幾層的檢測中就被排除了,因此算法的效率很高。
建立弱分類器
一個完整的弱分類器包含:Haar 特征 + leftValue + rightValue + 弱分類器閾值(threshold)。建立弱分類器的步驟如下:
-
對于每個特征 f,計算所有訓練樣本的特征值,并將其排序。
-
掃描一遍排好序的特征值,對排好序的表中的每個元素,計算下面四個值:
- 全部人臉樣本的權重的和 t1;
- 全部非人臉樣本的權重的和 t0;
- 在此元素之前的人臉樣本的權重的和 s1;
- 在此元素之前的非人臉樣本的權重的和s0;
選取當前元素特征值fi(x),和它前面的一個特征值fi-1(x)之間的值作為閾值,該閾值的分類誤差為:
e = m i n [ ( S 1 + ( T 0 ? S 0 ) ) , [ ( S 0 + ( T 1 ? S 1 ) ) ] e = min{[(S_1 + (T_0 - S_0)), [(S_0 + (T_1 - S_1))]} e=min[(S1?+(T0??S0?)),[(S0?+(T1??S1?))]
通過把這個排序的表從頭到尾掃描一遍可以為弱分類器選擇使分類誤差最小的閾值(即最優(yōu)閾值)。
建立強分類器
強分類器是由多個弱分類器并聯(lián)構成的。迭代建立強分類器的步驟如下如下:
-
給定訓練樣本集 S,共 N 個樣本,其中 X 和 Y 分別對應于正樣本和負樣本,T 為訓練的最大循環(huán)次數。
-
初始化樣本權重為 1/N,即為訓練樣本的初始概率分布。
-
第一次迭代訓練 N 個樣本,得到第一個最優(yōu)弱分類器。
-
提高上一輪中被誤判的樣本的權重。
-
將新的樣本和上次本分錯的樣本放在一起進行新一輪的訓練。
-
循環(huán)執(zhí)行步驟 4-5,T 輪后得到 T 個最優(yōu)弱分類器。
-
組合 T 個最優(yōu)弱分類器得到強分類器,組合方式如下:
C ( x ) = { 1 , ∑ t = 1 T a t h t ( x ) ≥ 1 2 ∑ t = 1 T a t 0 , e l s e C(x) = \begin{cases} 1 &, \sum_{t=1}^T {a_th_t(x)} \ge \frac{1}{2} \sum_{t=1}^T {a_t}\\ 0 &, else\\ \end{cases} C(x)={10?,∑t=1T?at?ht?(x)≥21?∑t=1T?at?,else?
這相當于讓所有弱分類器投票,對投票結果按照弱分類器的錯誤率加權求和,再進行閾值比較得到最終的結果。
級聯(lián)強分類器
級聯(lián)分類器相當于一個決策樹,通過各級檢測器逐級排除,得到最終結果 。
將多個強分類器組織為篩選式的級聯(lián)分類器,每級分類器排除一部分非人臉樣本,只有通過所有各級分類器的檢測窗口才是人臉區(qū)域。
篩選式級聯(lián)分類器的策略是,將若干個強分類器由簡單到復雜排列,通過訓練使每個強分類器都有較高檢測率,而對誤識率的要求相對較低。部分被檢測的區(qū)域可以很早被篩選掉,迅速判斷該區(qū)域沒有要求被檢測的物體,可以顯著地降低計算量。
4.3 Haar 級聯(lián)分類器
基于 Haar 特征的級聯(lián)分類器是 Paul Viola 在論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種目標檢測方法。
Haar 級聯(lián)分類器在每一級的節(jié)點中,使用 AdaBoost 算法學習一個高檢測率低拒絕率的多層分類器。其特點是:
-
使用 Haar-like 輸入特征,對矩形圖像區(qū)域的和或者差進行閾值化。
-
使用積分圖像計算 45°旋轉區(qū)域的像素和,加速 Haar-like 輸入特征的計算。
-
使用統(tǒng)計 Boosting 來創(chuàng)建二分類(人臉/非人臉)的分類器節(jié)點(高通過率,低拒絕率)。
-
將弱分類器并聯(lián)組合起來,構成篩選式級聯(lián)分類器。
各級的 Boosting 分類器對于有人臉的檢測窗口都能通過,同時拒絕一小部分非人臉的檢測窗口,并將通過的檢測窗口傳給下一個分類器。依次類推,最后一個分類器將幾乎所有非人臉的檢測窗口都拒絕掉,只剩下有人臉的檢測窗口。因此,只要檢測窗口區(qū)域通過了所有各級 Boosting 分類器,則認為檢測窗口中有人臉。
在實際應用中輸入圖片的尺寸較大,需要進行多區(qū)域、多尺度的檢測。多區(qū)域是要遍歷圖片的不同位置,多尺度是為了檢測圖片中不同大小的人臉。
在 Haar 級聯(lián)分類人臉檢測器中,主要利用了人臉的結構化特征:
-
眼睛區(qū)域比臉部區(qū)域暗;
-
鼻子區(qū)域比眼睛區(qū)域亮。
通過這 5 個矩形區(qū)域的明暗關系,就可以形成對人臉的各個部分的判別特征。Haar 人臉檢測訓練很高,但對側臉的檢測性能較差。
版權聲明:文章來源:http://www.zghlxwxcb.cn/news/detail-426004.html
youcans@xupt 原創(chuàng)作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/130373695)
Copyright 2022 youcans, XUPT
歡迎關注 『youcans 的 OpenCV 學習課』 系列,持續(xù)更新文章來源地址http://www.zghlxwxcb.cn/news/detail-426004.html
到了這里,關于【youcans 的 OpenCV 學習課】22. Haar 級聯(lián)分類器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!