特徵提取之Haar特徵

xizero00發表於2015-08-06

特徵提取之Haar特徵

一、前言(廢話)

很久沒有寫部落格了,一晃幾年就過去了,為了總結一下自己看的一些論文,以後打算寫一些自己讀完論文的總結。那麼,今天就談一談人臉檢測最為經典的演算法Haar-like特徵+Adaboost。這是最為常用的物體檢測的方法(最初用於人臉檢測),也是用的最多的方法,而且OpenCV也實現了這一演算法,可謂路人皆知。另外網上寫這個演算法的人也不在少數。

二、概述

首先說明,我主要看了《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》這兩篇論文。

2.1為什麼需要Haar特徵,為什麼要結合Adaboost演算法

我們知道人臉檢測是很不容易的,我們在實際進行人臉檢測的時候,需要考慮演算法的執行速度,以及演算法的準確度,單單實現這兩個指標就已經很不容易了。傳統的人臉檢測方法(指的是在Haar-like特徵出來之前的方法,也就是2001年之前了)一般都是基於畫素級別進行的,常見的方法有基於皮膚顏色的方法,這些方法的缺點就是速度慢,幾乎不能實現實時性。

2.2演算法的大體流程

首先給出訓練過程
輸入影像->影像預處理->提取特徵->訓練分類器(二分類)->得到訓練好的模型
接著給出測試過程
輸入影像->影像預處理->提取特徵->匯入模型->二分類(是不是所要檢測的物體)。

接下來就對演算法的關鍵的步驟進行介紹。

3具體介紹

3.1影像預處理(歸一化或者稱為光照修正)

我們知道不同的光照對於所處理的影像有影響,為了減低這種影響我們需要首先對影像進行歸一化(在《Rapid Object Detection using a Boosted Cascade of Simple Features》中稱之為歸一化,而在《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》中稱之為Lighting Correction,即光照修正)。

那麼如何進行光照修正:

i¯(x,y)=i(x,y)μcσ
\begin{equation} \overline{i}(x,y) = \frac{i(x,y)-\mu}{c\sigma} \end{equation}

上述公式中i¯(x,y)
\overline{i}(x,y)
表示歸一化之後的影像,而i(x,y)
i(x,y)
表示原始的影像,其中μ
\mu
表示影像的均值,而σ
\sigma
表示影像的標準差。計算方法很簡單,均值就是影像中的所有畫素值相加,然後除以畫素的個數,而方差假定每個畫素的概率相等如果一幅影像中有N個畫素,那麼每個畫素的概率為1N
\frac{1}{N}
σ2=1Nxx2μ2
\sigma^2=\frac{1}{N}\sum_xx^2 - \mu^2
,注意這裡的x是指的每個畫素值,x
\sum_x
表示對所有的畫素值求和。

其實這裡我看到《Rapid Object Detection using a Boosted Cascade of Simple Features》中第六頁它寫成了σ2=μ21Nxx2

\sigma^2=\mu^2 - \frac{1}{N}\sum_xx^2

3.2提取特徵

首先介紹一下Haar-like特徵。如下圖所示,Haar-like特徵是很簡單的,無非就是那麼幾種,首先介紹論文《Rapid Object Detection using a Boosted Cascade of Simple Features》中提到的三種特徵,分為兩矩形特徵、三矩形特徵、對角特徵。當然還有很多分類方法,這裡先不介紹,下面在繼續講。先介紹如何計算特徵。
圖1.三種型別的Haar-like特徵
圖1 三種型別的Haar-like特徵

計算特徵很簡單,就是拿黑色部分的所有的畫素值的和減去白色部分所有畫素值的和。得到的就是一個特徵值。

說的很簡單,但是在工程中需要進行快速計算某個矩形內的畫素值的和,這就需要引入積分圖的概念。

(1)使用積分圖加速計算特徵

需要注意的是這裡的積分圖輸入的影像是經過歸一化的影像哈。與上面用到的符號不一樣了。

首先給出積分圖的定義:

ii(x,y)=xx,yyi(x,y)
\begin{equation} ii(x,y) = \sum_{x'\leq x,y'\leq y} i(x',y') \end{equation}

上述含義是指在位置(x,y)
(x,y)
上,對應的積分圖中的畫素為該位置的左上角所有的畫素的之和。

那麼我們實現的時候是如何進行計算積分圖的呢?

s(x,y)=s(x,y1)+i(x,y)ii(x,y)=ii(x1,y)+s(x,y)
\begin{align} s(x,y) = s(x,y-1) +i(x,y) \\ ii(x,y) = ii(x-1,y) +s(x,y) \end{align}

初始值s(x,1)=0,ii(1,y)=0
s(x,-1)=0,ii(-1,y)=0
.

上面這兩個遞迴公式是什麼意思呢?就是首先每一行都遞迴計算s(x,y)(公式中也可以看出是按行計算的),每一行首先都是計算s,計算完畢之後在每一列都計算ii(x,y)。這樣掃描下去就可以計算好了積分圖了。這種方法跟動態規劃的思想有點類似。

好了計算好了積分圖,我們接下來就可以利用積分圖來加速計算某個方塊內部的畫素的和了。

(2)計算方塊內的畫素和

計算某個方塊內的畫素和
圖2 計算某個方塊內的畫素和

圖中的大框是積分圖,為了講解如何計算任意矩形內的畫素值,我們畫出四個區域A、B、C、D,並且圖中有四個位置分別為1、2、3、4。我們要計算D區域內部的畫素和該怎麼計算?

我們記位置4的左上的所有畫素為rectsum(4)

rectsum(4)
,那麼
D位置的畫素之和就是rectsum(1)+rectsum(4)rectsum(2)rectsum(3)
rectsum(1)+rectsum(4) - rectsum(2) - rectsum(3)

是不是有了積分圖,就可以很快地計算出了任意矩形內的畫素之和了?

我們前面提到有三種型別的Haar-like特徵。
其中二矩形特徵需要6次查詢積分圖中的值,而三矩形特徵需要8次查詢積分圖中的值,而對角的特徵需要9次。

(3)提取的特徵的個數有多少?

那麼,如果給定一個視窗,視窗的大小為24*24畫素,那麼我們得到的特徵有多少個呢?
計算公式如下:
可以參考本文的第一幅圖中的ABCD個特徵那幅圖。

AB:2w=112h=124(242w+1)(24h+1)+C:2w=18h=124(243w+1)(24h+1)D:w=112h=112(242w+1)(242h+1)
\begin{align} \text{A和B特徵:} 2\sum_{w=1}^12 \sum_{h=1}^24 (24-2w+1)(24-h+1) + \\ \text{C特徵:} 2\sum_{w=1}^8 \sum_{h=1}^24 (24-3w+1)(24-h+1) \\ \text{D特徵:} \sum_{w=1}^12 \sum_{h=1}^12 (24-2w+1)(24-2h+1) \end{align}

加起來一共有大約16000多個(不止16000哈)。可以自己算一下。

3.3使用Adaboost進行訓練

在輸入影像之後首先計算積分圖,然後通過積分圖在計算上述三種特徵,如果視窗的大小為24*24畫素,那麼生成的特徵數目有16000之多。

(1)弱分類器的定義

Adaboost演算法中需要定義弱分類器,該弱分類器的定義如下:

hj(x)={10ifpjfj(x)<pjθjotherwise
\begin{equation} h_j(x) = \left\{ \begin{aligned} 1 & \quad if \quad p_jf_j(x) < p_j \theta_j \\ 0 & \quad otherwise \\ \end{aligned} \right. \end{equation}

上述公式中的pj
p_j
是為了控制不等式的方向而設定的引數。
fj(x)
f_j(x)
表示輸入一個視窗x
x
,比如24*24畫素的視窗,通過fj
f_j
提取特徵,得到若干特徵。通過一個閾值θ
\theta
判定該視窗是不是所要檢測的物體。

(2)adaboost演算法

假設訓練樣本影像為(x1,y1),,(xn,yn)

(x_1,y_1),\dots,(x_n,y_n)
,其中yi=0,1
y_i=0,1
,0表示負樣本,1表示正樣本。

首先初始化權重w1,i=12m

w_{1,i} = \frac{1}{2m}
,初始化yi22l
y_i為\frac{2}{2l}
,其中m表示負樣本的個數,l表示正樣本的個數。


For t=1,,T

t=1,\dots,T
:
(1).首先歸一化權重: wt,i=wt,inj=1wt,j
w_{t,i} = \frac{w_{t,i}}{\sum_{j=1}^n w_{t,j}}

(2)對於每一個特徵,我們都訓練一個分類器(記為hj
h_j
),每個分類器都只使用一種特徵進行訓練。
那麼對於該特徵的誤差ϵj
\epsilon_j
可以這麼衡量:ϵj=iwi|hj(xi)yi|
\epsilon_j=\sum_i w_i | h_j(x_i) - y_i|
(j
j
表示的是某個特徵的索引,而i
i
表示的是所有的所有的視窗。)
(3)選擇擁有最低誤差的那個分類器記為ht
h_t

(4)更新權重wt+1,i=wt,iβ1eit
w_{t+1,i} = w_{t,i}\beta_t^{1-e_i}
(如果分類正確則ei=1
e_i=1
,錯誤ei=0
e_i=0
)。
End For


那麼最終的強分類器為

h(x)=10t=1Tαtht12t=1Tαtotherwise
\begin{equation} h(x) = \left\{ \begin{aligned} 1 & \quad \sum_{t=1}^T \alpha_th_t \geq \frac{1}{2} \sum_{t=1}^T \alpha_t\\ 0 & \quad otherwise \\ \end{aligned} \right. \end{equation}

其中αt=log1βt
\alpha_t = log \frac{1}{\beta_t}

上述的訓練過程是遠遠不夠的,還需要對若干個分類器進行級聯,這樣才能夠取得更高的檢出率,並且取得較高的false positive rates。
級聯
圖3 多個分類器的級聯

如圖3所示,首先第一個分類器的輸入是所有的子視窗,然後通過級聯的分類器去除掉一些子視窗,這樣能夠有效地降低視窗的數目,具體的去除方法就是如果任何一個級聯分類器提出拒絕,那麼後續的分類器就不需要處理之前分類器的子視窗。
通過這樣的一種機制能夠有效地去掉較多的子視窗,因為較大部分的子視窗中都沒有所要檢測的物體。

4其他一些引數的確定

4.1如何確定有多少個級聯的分類器,有多少個特徵,閾值如何確定的。

如圖3可以看出在訓練過程當中需要確定究竟有多少個分離器級聯才是最佳的,以及使用多少個特徵,每個弱分類器的閾值如何確定,這些引數的確定基本不可能實現。

這裡介紹一種比較簡單粗暴的方法:
我們首先指定一個檢出率和false positive rates。
每一個級聯的分類器都是通過加入不同的特徵,直到達到指定的檢出率和false positive rates才停止加入,並且有多少階段才結束是根據是否能夠達到特定的檢出率和false postive rate 來決定的。同樣,閾值也是這麼確定的。

4.2 掃描視窗的時候的縮放如何確定

假設掃描的時候的步長為Δ

\Delta
,尺度為s
s

那麼當前的步長= [s
s
Δ
\Delta
]。一般Δ=1.5
\Delta=1.5
,尺度需要根據影像大小以及視窗大小來確定。

4.3 合併檢測出的多個視窗

檢測到的子視窗的集合分成若干不相交的子集(每個子集中的子視窗都是相互重疊的),這些子集中的子視窗進行合併,集合中所有子視窗的左上角的座標的平均即為該集合所確定的視窗的左上角的座標。

5 補充說明

5.1 Haar-like特徵的分類(Haar-like特徵的變種)

如圖4所示為改進的特徵。
這裡寫圖片描述
圖4 haar-like特徵

圖4中給出了四種分類分為將邊緣特徵、線特徵、中心環繞特徵以及對角線特徵。

這些特徵中的旋轉的特徵主要在《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》中得到了介紹。
特徵個數的確定通過如下公式確定

X=W/wY=H/h
\begin{align} X = \lfloor W/w \rfloor \\ Y = \lfloor H/h \rfloor \end{align}

X
X
Y
Y
稱之為最大縮放因子。
計算公式如下
XY(W+1wX+12)(H+1hY+12)
\begin{equation} XY(W+1-w\frac{X+1}{2})(H+1-h\frac{Y+1}{2}) \end{equation}

對於旋轉45 °的特徵其計算公式如下:
XY(W+1zX+12)(H+1zY+12)
\begin{equation} XY(W+1-z\frac{X+1}{2})(H+1-z\frac{Y+1}{2}) \end{equation}

其中z=w+h
z = w+h

至於怎麼計算旋轉45°的特徵值,這裡先挖個坑。過一段時間在補充上來。

5.2 Adaboost的變種

《Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection》中介紹了三種變種分為Real Adaboost ,Discrete Adaboost以及Gentle Adaboost。差別不是很大。具體參考該論文。

6 參考文獻

[1] Viola P, Jones M J. Robust real-time face detection[J]. International journal of computer vision, 2004, 57(2): 137-154.
[2] Jones M. Rapid Object Detection using a Boosted Cascade of Simple[J].
[3] Lienhart R, Kuranov A, Pisarevsky V. Empirical analysis of detection cascades of boosted classifiers for rapid object detection[M]//Pattern Recognition. Springer Berlin Heidelberg, 2003: 297-304.

7 想要說的話

後期會分析一下Haar進行人臉檢測的程式碼(matlab和OpenCV的實現),看時間允許不允許了。

http://www.mathworks.com/matlabcentral/fileexchange/29437-viola-jones-object-detection

其實想詳細介紹Adaboost的證明的,考慮到是Haar是主角,這裡沒有詳細介紹Adaboost。此外Haar 特徵的變種也是個坑,還需要詳細介紹。
基本就這麼多,有講的不明白的地方歡迎留言反饋。

相關文章