Haar特征


特征提取之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σ
i¯(x,y)=i(x,y)−μcσ

上述公式中i¯(x,y)i¯(x,y)表示歸一化之后的圖像,而i(x,y)i(x,y)表示原始的圖像,其中μμ表示圖像的均值,而σσ表示圖像的標准差。計算方法很簡單,均值就是圖像中的所有像素值相加,然后除以像素的個數,而方差假定每個像素的概率相等如果一幅圖像中有N個像素,那么每個像素的概率為1N1N,σ2=1N∑xx2−μ2σ2=1N∑xx2−μ2,注意這里的x是指的每個像素值,∑x∑x表示對所有的像素值求和。
其實這里我看到《Rapid Object Detection using a Boosted Cascade of Simple Features》中第六頁它寫成了σ2=μ2−1N∑xx2σ2=μ2−1N∑xx2。

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

圖1 三種類型的Haar-like特征

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

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

(1)使用積分圖加速計算特征
需要注意的是這里的積分圖輸入的圖像是經過歸一化的圖像哈。與上面用到的符號不一樣了。

首先給出積分圖的定義:
ii(x,y)=∑x′≤x,y′≤yi(x′,y′)
ii(x,y)=∑x′≤x,y′≤yi(x′,y′)

上述含義是指在位置(x,y)(x,y)上,對應的積分圖中的像素為該位置的左上角所有的像素的之和。
那么我們實現的時候是如何進行計算積分圖的呢?
s(x,y)=s(x,y−1)+i(x,y)ii(x,y)=ii(x−1,y)+s(x,y)
s(x,y)=s(x,y−1)+i(x,y)ii(x,y)=ii(x−1,y)+s(x,y)

初始值s(x,−1)=0,ii(−1,y)=0s(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個特征那幅圖。
A和B特征:2∑w=112∑h=124(24−2w+1)(24−h+1)+C特征:2∑w=18∑h=124(24−3w+1)(24−h+1)D特征:∑w=112∑h=112(24−2w+1)(24−2h+1)
A和B特征:2∑w=112∑h=124(24−2w+1)(24−h+1)+C特征:2∑w=18∑h=124(24−3w+1)(24−h+1)D特征:∑w=112∑h=112(24−2w+1)(24−2h+1)

加起來一共有大約16000多個(不止16000哈)。可以自己算一下。
3.3使用Adaboost進行訓練
在輸入圖像之后首先計算積分圖,然后通過積分圖在計算上述三種特征,如果窗口的大小為24*24像素,那么生成的特征數目有16000之多。

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

hj(x)={10ifpjfj(x)<pjθjotherwise
hj(x)={1ifpjfj(x)<pjθj0otherwise

上述公式中的pjpj是為了控制不等式的方向而設置的參數。
fj(x)fj(x)表示輸入一個窗口xx,比如24*24像素的窗口,通過fjfj提取特征,得到若干特征。通過一個閾值θθ判定該窗口是不是所要檢測的物體。
(2)adaboost算法
假設訓練樣本圖像為(x1,y1),…,(xn,yn)(x1,y1),…,(xn,yn),其中yi=0,1yi=0,1,0表示負樣本,1表示正樣本。

首先初始化權重w1,i=12mw1,i=12m,初始化yi為22lyi為22l,其中m表示負樣本的個數,l表示正樣本的個數。

For t=1,…,Tt=1,…,T:
(1).首先歸一化權重: wt,i=wt,i∑nj=1wt,jwt,i=wt,i∑j=1nwt,j 。
(2)對於每一個特征,我們都訓練一個分類器(記為hjhj),每個分類器都只使用一種特征進行訓練。
那么對於該特征的誤差ϵjϵj可以這么衡量:ϵj=∑iwi|hj(xi)−yi|ϵj=∑iwi|hj(xi)−yi| (jj表示的是某個特征的索引,而ii表示的是所有的所有的窗口。)
(3)選擇擁有最低誤差的那個分類器記為htht 。
(4)更新權重wt+1,i=wt,iβ1−eitwt+1,i=wt,iβt1−ei (如果分類正確則ei=1ei=1,錯誤ei=0ei=0)。
End For

那么最終的強分類器為
h(x)=⎧⎩⎨⎪⎪⎪⎪10∑t=1Tαtht≥12∑t=1Tαtotherwise
h(x)={1∑t=1Tαtht≥12∑t=1Tαt0otherwise

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

圖3 多個分類器的級聯

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

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

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

4.2 掃描窗口的時候的縮放如何確定
假設掃描的時候的步長為ΔΔ,尺度為ss
那么當前的步長= [ssΔΔ]。一般Δ=1.5Δ=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/w⌋Y=⌊H/h⌋
X=⌊W/w⌋Y=⌊H/h⌋

XX和YY稱之為最大縮放因子。
計算公式如下
XY(W+1−wX+12)(H+1−hY+12)
XY(W+1−wX+12)(H+1−hY+12)

對於旋轉45 °的特征其計算公式如下:
XY(W+1−zX+12)(H+1−zY+12)
XY(W+1−zX+12)(H+1−zY+12)

其中z=w+hz=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 特征的變種也是個坑,還需要詳細介紹。
基本就這么多,有講的不明白的地方歡迎留言反饋。

一.Haar特征

特征是計算機視覺領域一種常用的特征描述算子,特征,描述圖像的特征,多用於人臉檢測、行人檢測,等目標檢測,Haar-like特征模板內只有白色和黑色兩種矩形,並定義該模板的特征值為白色矩形像素和減去黑色矩形像素和。Haar特征值反映了圖像的灰度變化情況。例如:臉部的一些特征能由矩形特征簡單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等。

二.特征計算

計算特征很簡單,就是拿黑色部分的所有的像素值的和減去白色部分所有像素值的和。得到的就是一個特征值。說的很簡單,但是在工程中需要進行快速計算某個矩形內的像素值的和,這就需要引入積分圖的概念。對於一個灰度圖像I而言,其積分圖也是一張與I尺寸相同的圖,只不過該圖上任意一點(x,y)的值是指從灰度圖像I的左上角與當前點所圍成的矩形區域內所有像素點灰度值之和如下圖所示:

 

 當把掃描圖像一遍,到達圖像右下角像素時,積分圖像就構造好了。積分圖構造好之后,圖像中任何矩陣區域的像素累加和都可以通過簡單運算得到

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM