1. 程式人生 > >目標檢測演算法-特徵提取之(一)Haar特徵

目標檢測演算法-特徵提取之(一)Haar特徵

1、Haar-like特徵
Haar特徵最先由Paul Viola等人提出,後經過Rainer Lienhart等擴充套件引入45°傾斜特徵。Haar特徵分為三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。OpenCV(2.4.11版本)所使用的共計14種Haar特徵,包括5種Basic特徵、3種Core特徵和6種Titled(即45°旋轉)特徵。
這裡寫圖片描述
在使用opencv自帶的訓練工具進行訓練時,haarFeatureParams引數中的mode引數正對應了訓練過程中所使用的特徵集合。
1. 如果mode為BASIC,則只使用BASIC的5種Haar特徵進行訓練,訓練出的分類器也只包含這5種特徵。
2. 如果mode為CORE,則使用BASIC的5種+CORE的3種Haar特徵進行訓練。
3. 如果mode為ALL,則使用BASICA的5種+CORE的3種+ALL的6種Titled共14種特徵進行訓練。
預設使用BASIC模式,實際中訓練和檢測效果已經足夠好。不建議使用ALL引數,引入Titled傾斜特徵需要多計算一張傾斜積分圖,會極大的降低訓練和檢測速度。

2、矩形特徵模板的計算
haar特徵模板內有白色和黑色兩種矩形,Haar特徵值=整個Haar區域內畫素和×權重 + 黑色區域內畫素和×權重:
這裡寫圖片描述

  1. 對於圖2中的x3和y3特徵,weightall = 1,weightblack = -3;
  2. 對於point特徵,weightall = 1,weightblack = -9;
  3. 其餘11種特徵均為weightall =1, weightblack = -2。
    即“白色區域畫素和減去黑色區域畫素和”,只不過是加權相加而已。
    例如以x2特徵為例,(黑 + 白) * 1 + 黑 * (-2) = 白 - 黑;
    對於Point特徵,(黑 + 白) * 1 + 黑 * (-9) = 白 - 8 * 黑。

設定權值就是為了抵消面積不等帶來的影響,保證所有Haar特徵的特徵值在灰度分佈絕對均勻的圖中為0。
Haar特徵值反映了影象的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。

3、haar特徵的子特徵生成
Haar特徵矩形特徵可位於影象任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函式。故類別、大小和位置的變化,使得很小的檢測視窗含有非常多的矩形特徵,如:在24*24畫素大小的檢測視窗內矩形特徵數量可以達到16萬個。白:黑區域面積比始終保持不變


以x3特徵為例,在放大+平移過程中白:黑:白麵積比始終是1:1:1。首先在紅框所示的檢測視窗中生成大小為3個畫素的最小x3特徵;之後分別沿著x和y平移產生了在檢測視窗中不同位置的大量最小3畫素x3特徵;然後把最小x3特徵分別沿著x和y放大,再平移,又產生了一系列大一點x3特徵;然後繼續放大+平移,重複此過程,直到放大後的x3和檢測視窗一樣大。這樣x3就產生了完整的x3系列特徵。
這裡寫圖片描述
那麼這些通過放大+平移的獲得的子特徵到底總共有多少個?
假設檢測視窗大小為W*H,矩形特徵大小為w*h,X和Y為表示矩形特徵在水平和垂直方向的能放大的最大比例係數:
這裡寫圖片描述
則總共可以獲得的子特徵數目為:
這裡寫圖片描述
公式解釋:
1. 特徵框豎直放大1倍,即無放大,豎直方向有(H-h+1)個特徵
2. 特徵框豎直放大2倍,豎直方向有(H-2h+1)個特徵
3. 特徵框豎直放大3倍,豎直方向有(H-3h+1)個特徵
4.如此到豎直放大Y=floor(H/h)倍,豎直方向有1個特徵,即(H-Y*h+1)
那麼豎直方向總共有(H-h+1)+(H-2h+1)+(H-3h+1)+……+(H-Y*h+1)=Y[H+1-h(1+Y)/2]個特徵。
5.同理,在水平方向共有(W-w+1)+(W-2w+1)+(W-3w+1)+……+(W-X*w+1)=X[W+1-w(1+X)/2]。
6.由於水平方向和垂直方向相互獨立,所以子特徵數目為:子特徵數目 = 水平方向數目X垂直方向數目
一般而言,haar特徵值計算出來的值跨度很大,所以在實際的特徵提取中時,一般會對haar特徵再進行標準化,壓縮特徵值範圍。

4、Haar-like特徵的計算-積分圖
目標:如何快速計算Haar特徵值
手段:積分圖。積分圖就是隻遍歷一次影象就可以求出影象中所有區域畫素和的快速演算法,大大的提高了影象特徵值計算的效率。
積分圖主要的思想:將影象從起點開始到各個點所形成的矩形區域畫素之和作為一個數組的元素儲存在記憶體中,當要計算某個區域的畫素和時可以直接索引陣列的元素,不用重新計算這個區域的畫素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃演算法)。積分圖能夠在多種尺度下,使用相同的時間(常數時間)來計算不同的特徵,因此大大提高了檢測速度。
我們來看看它是怎麼做到的。
積分圖是一種能夠描述全域性資訊的矩陣表示方法。積分圖的構造方式是位置(i,j)處的值ii(i,j)是原影象(i,j)左上角方向所有畫素的和:

積分圖構建演算法:
1)用s(i,j)表示行方向的累加和,初始化s(i,-1)=0;
2)用ii(i,j)表示一個積分影象,初始化ii(-1,i)=0;
3)逐行掃描影象,遞迴計算每個畫素(i,j)行方向的累加和s(i,j)和積分影象ii(i,j)的值
s(i,j)=s(i,j-1)+f(i,j)
ii(i,j)=ii(i-1,j)+s(i,j)
4)掃描影象一遍,當到達影象右下角畫素時,積分影象ii就構造好了。
積分圖構造好之後,影象中任何矩陣區域的畫素累加和都可以通過簡單運算得到如圖所示。
這裡寫圖片描述
設D的四個頂點分別為1、2、3、4,則D的畫素和可以表示為
Dsum = ii( 1 )+ii( 4)-(ii(2)+ii(3 ));
而Haar-like特徵值無非就是兩個矩陣畫素和的差,同樣可以在常數時間內完成。所以矩形特徵的特徵值計算,只與此特徵矩形的端點的積分圖有關,所以不管此特徵矩形的尺度變換如何,特徵值的計算所消耗的時間都是常量。這樣只要遍歷影象一次,就可以求得所有子視窗的特徵值。
在實際中,如果使用旋轉特徵,則需要多計算一張積分圖。但是旋轉特徵的效果往往不理想,得不償失,不建議使用。