Haar特徵計算過程【DataWhale學習記錄】

0 前言

本文重點在於對4 haar特徵值的一般性計算過程5 Haar的分類過程 7 積分圖優化Haar特徵計算效率進行了詳細的介紹,也是比較有意思的部分。

但是由於本人水平有限,關於“利用並查集 合併 檢測結果窗口”並沒有得到介紹。

1 人臉檢測的方法分類

目前人臉檢測的方法主要有兩大類:基於知識和基於統計。

基於知識的方法:主要利用先驗知識將人臉看作器官特徵的組合,根據眼睛、眉毛、嘴巴、鼻子等器官的特徵以及相互之間的幾何位置關係來檢測人臉。主要包括模板匹配、人臉特徵、形狀與邊緣、紋理特性、顏色特徵等方法。

基於統計的方法:將人臉看作一個整體的模式——二維像素矩陣,從統計的觀點通過大量人臉圖像樣本構造人臉模式空間,根據相似度量來判斷人臉是否存在。主要包括主成分分析與特徵臉、神經網絡方法、支持向量機、隱馬爾可夫模型、Adaboost算法等。

本文中介紹的Haar分類器方法,包含了Adaboost算法,稍候會對這一算法做詳細介紹。所謂分類器,在這裏就是指對人臉和非人臉進行分類的算法,在機器學習領域,很多算法都是對事物進行分類、聚類的過程。

2 Haar特徵

目前最常用的還是Haar-like特徵,描述圖像的特徵,多用於人臉檢測、行人檢測,等目標檢測;Haar-like特徵可以理解爲卷積模板(如同prewitt、sobel算子,當然不完全一樣),Haar-like特徵模板內只有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形像素和減去黑色矩形像素和。Haar特徵值反映了圖像的灰度變化情況

Haar-like特徵可以分爲四類:線性特徵、邊緣特徵、點特徵(中心特徵)、對角線特徵;
也可以分成三類:邊緣特徵、線性特徵(包含對角線特徵)、點特徵(中心特徵)

特徵分類圖示
在這裏插入圖片描述

3 Haar分類器算法的步驟

Haar分類器 = Haar-like特徵 + 積分圖方法 + AdaBoost +級聯;

Haar分類器算法的要點如下:

  • 使用Haar-like特徵做計算做檢測。

  • 使用積分圖(Integral Image)對Haar-like特徵求值進行加速。

  • 使用AdaBoost算法訓練區分人臉和非人臉的強分類器。

  • 使用篩選式級聯把強分類器級聯到一起,提高準確率。

4 一般的Haar特徵求值過程

特徵計算的流程示意圖

從圖像的左上角開始,設定固定大小的窗口從左至右,從上至下進行滑動覆蓋相應像素點區域。
同時對於每一個窗口覆蓋的像素點區域,設定固定大小的特徵模板從左到右,從上至下進行滑動覆蓋像素點區域。

其中

  • 特徵模板也叫特徵原型,它的稱謂是相較於以它爲基礎,模板發生大小改變後的特徵矩形而言的。

  • 特徵原型在圖像子窗口中擴展(平移伸縮)得到的特徵稱爲“矩形特徵”;矩形特徵的值稱爲“特徵值”。

假設一個特徵大小爲2×1的特徵模板,和24×24的圖像窗口
該特徵模板可以水平滑動23步,垂直滑動24步,所以共有23×24個特徵值。

而事實上,矩形特徵值是由矩形模版類別、矩形位置和矩形大小這三個因素的函數。

因此當特徵模板的大小和類別也發生變化的時候,一個圖像得到的特徵值的數量要暴增。
比如,在24*24像素大小的檢測窗口內矩形特徵數量可以達到16萬個。如果還有新的模板加入,窗口的大小發生變動,這個特徵數量還會增加。

至此,一般的Haar特徵計算過程即是如此,一張圖像,經過不同的模板滑動,不同模板的不同大小的矩形的滑動,可以得到N個特徵值。

但是對於一般的Haar分類器來講,特徵計算只是一個小步驟,最終要經過某種算法比如AdaBoost算法來進行訓練,以判別哪些矩形的特徵是對分類器分類最有效的。

至此可以觀察到:
(1)在檢測窗口通過平移+縮放可以產生一系列Haar特徵,這些特徵由於位置和大小不同,分類效果也不同;

(2)通過計算Haar特徵的特徵值,可以有將圖像矩陣映射爲1維特徵值,有效實現了降維。

5 Haar分類過程

5.1 AdaBoost的簡介

AdaBoost的老祖宗可以說是機器學習的一個模型,它的名字叫PAC(Probably Approximately Correct)。

簡單說來,PAC學習模型不要求你每次都正確,只要能在多項式個樣本和多項式時間內得到滿足需求的正確率,就算是一個成功的學習。

基於PAC學習模型的理論分析,Valiant牛提出了Boosting算法Boosting算法涉及到兩個重要的概念就是弱學習和強學習

所謂的弱學習,就是指一個學習算法對一組概念的識別率只比隨機識別好一點,所謂強學習,就是指一個學習算法對一組概率的識別率很高。

現在我們知道所謂的弱分類器和強分類器就是弱學習算法和強學習算法。弱學習算法是比較容易獲得的,獲得過程需要數量巨大的假設集合,這個假設集合是基於某些簡單規則的組合和對樣本集的性能評估而生成的,而強學習算法是不容易獲得的

然而,Kearns 和Valiant 兩頭牛提出了弱學習和強學習等價的問題, 並證明了只要有足夠的數據,弱學習算法就能通過集成的方式生成任意高精度的強學習方法。這一證明使得Boosting有了可靠的理論基礎,Boosting算法成爲了一個提升分類器精確性的一般性方法。

Boosting算法還是存在着幾個主要的問題,其一Boosting算法需要預先知道弱學習算法學習正確率的下限即弱分類器的誤差,其二Boosting算法可能導致後來的訓練過分集中於少數特別難區分的樣本,導致不穩定。針對Boosting的若干缺陷,Freund和Schapire牛於1996年前後提出了一個實際可用的自適應Boosting算法AdaBoost。

AdaBoost目前已發展出了大概四種形式的算法,Discrete AdaBoost(AdaBoost.M1)、Real AdaBoost、LogitBoost、gentle AdaBoost

5.2 最優弱分類器的孵化

5.2.1 弱分類器的簡介

最初的弱分類器可能只是一個最基本的Haar-like特徵,計算輸入圖像的Haar-like特徵值,和最初的弱分類器的特徵值比較,以此來判斷輸入圖像是不是人臉,然而這個弱分類器太簡陋了,可能並不比隨機判斷的效果好。

對弱分類器的孵化就是訓練弱分類器成爲最優弱分類器,注意這裏的最優不是指強分類器,只是一個誤差相對稍低的弱分類器,訓練弱分類器實際上是爲分類器進行設置的過程
在這裏插入圖片描述
一個弱分類器由子窗口圖像x,一個特徵f,指示不等號方向的p和閾值θ\theta組成。P的作用是控制不等式的方向,使得不等式都是<號,形式方便。

5.2.2 弱分類器與決策樹的聯繫

而閾值與決策樹相關。
舉個最簡單的決策樹例子,假設我們使用三個Haar-like特徵f1,f2,f3來判斷輸入數據是否爲人臉,可以建立如下決策樹:
在這裏插入圖片描述
一個弱分類器就是一個基本和上圖類似的決策樹最基本的弱分類器只包含一個Haar-like特徵,也就是它的決策樹只有一層,被稱爲樹樁(stump)。

其中,最重要的就是如何決定每個結點判斷的輸出,要比較輸入圖片的特徵值和弱分類器中特徵,一定需要一個閾值,當輸入圖片的特徵值大於該閾值時才判定其爲人臉。

訓練最優弱分類器的過程實際上就是在尋找合適的分類器閾值,使該分類器對所有樣本的判讀誤差最低。

5.2.3 最優弱分類器的計算過程

(以下內容有的內容簡化了,沒有具體解釋,但是我想大家應該從中能夠較爲具象地明白最優弱分類器的計算過程。)

  1. 對於每個特徵 f,計算所有訓練樣本的特徵值,並將其排序。
  • 掃描一遍排好序的特徵值,對排好序的表中的每個元素,計算下面四個值:

  • 全部人臉樣本的權重的和t1;

  • 全部非人臉樣本的權重的和t0;

  • 在此元素之前的人臉樣本的權重的和s1;

  • 在此元素之前的非人臉樣本的權重的和s0;

  1. 最終求得每個元素的分類誤差
    在這裏插入圖片描述

在表中尋找r值最小的元素,則該元素作爲最優閾值有了該閾值,我們的第一個最優弱分類器就誕生了。

5.2.4 強分類器的產生

強分類器的誕生需要T輪的迭代,具體操作如下:

  1. 給定訓練樣本集S,共N個樣本,其中X和Y分別對應於正樣本和負樣本; T爲訓練的最大循環次數;

  2. 初始化樣本權重爲1/N ,即爲訓練樣本的初始概率分佈;

  3. 第一次迭代訓練N個樣本,得到第一個最優弱分類器,步驟見2.2.2節

  4. 提高上一輪中被誤判的樣本的權重;

  5. 將新的樣本和上次本分錯的樣本放在一起進行新一輪的訓練。

  6. 循環執行4-5步驟,T輪後得到T個最優弱分類器

  7. 組合T個最優弱分類器得到強分類器,組合方式如下:
    在這裏插入圖片描述
    在這裏插入圖片描述

對於該公式的理解,用文字描述即是:相當於讓所有弱分類器投票,再對投票結果按照弱分類器的錯誤率加權求和,將投票加權求和的結果與平均投票結果比較得出最終的結果

5.2.5 級聯分類器的產生

我們看到了通過AdaBoost算法辛苦的訓練出了強分類器然而在現實的人臉檢測中只靠一個強分類器還是難以保證檢測的正確率,這個時候,需要一個豪華的陣容,訓練出多個強分類器將它們強強聯手,最終形成正確率很高的級聯分類器這就是我們最終的目標Haar分類器。

圖片輸出大量的子窗口圖像,這些子窗口圖像經過篩選式級聯分類器會不斷地被每一個節點篩選,拋棄或通過,結構如下圖示:
在這裏插入圖片描述
級聯強分類器的策略是,將若干個強分類器由簡單到複雜排列,希望經過訓練使每個強分類器都有較高檢測率,而誤識率可以放低,比如幾乎99%的人臉可以通過,但50%的非人臉也可以通過,**這樣如果有20個強分類器級聯,那麼他們的總識別率爲0.99^20 98%,錯誤接受率也僅爲0.5^20 0.0001%。**這樣的效果就可以滿足現實的需要了。

但是如何使每個強分類器都具有較高檢測率呢,爲什麼單個的強分類器不可以同時具有較高檢測率和較高誤識率呢?

一般的來說,AdaBoost訓練出來的強分類器一般具有較小的誤識率,但檢測率並不很高,一般情況下,高檢測率會導致高誤識率,這是強分類閾值的劃分導致的。

要提高強分類器的檢測率既要降低閾值,要降低強分類器的誤識率就要提高閾值,這是個矛盾的事情

據參考論文的實驗結果,增加分類器個數可以在提高強分類器檢測率的同時降低誤識率,所以級聯分類器在訓練時要考慮如下平衡,一是弱分類器的個數和計算時間的平衡,二是強分類器檢測率和誤識率之間的平衡。

5.2.6 Haar分類器的檢測體系

至今爲止我們好像一直在講分類器的訓練,實際上Haar分類器是有兩個體系的,訓練的體系,和檢測的體系。

那麼訓練級聯分類器的目的就是爲了檢測的時候,更加準確,這涉及到Haar分類器的另一個體系,檢測體系。

經過上面的介紹我們通過最優弱分類器並聯成爲強分類器,強分類器串聯成爲級聯分類器,得到比較好的分類器。接下來是檢測分類器性能的過程

檢測體系是以現實中的一幅大圖片作爲輸入,然後對圖片中進行多區域,多尺度的檢測,所謂多區域,是要對圖片劃分多塊,對每個塊進行檢測

由於訓練的時候用的照片一般都是20*20左右的小圖片,所以對於大的人臉,還需要進行多尺度的檢測,多尺度檢測機制一般有兩種策略

  • 一種是不改變搜索窗口的大小,而不斷縮放圖片,這種方法顯然需要對每個縮放後的圖片進行區域特徵值的運算,效率不高。
  • 另一種方法,是不斷初始化搜索窗口size爲訓練時的圖片大小,不斷擴大搜索窗口,進行搜索,解決了第一種方法的弱勢

如此:
首先,通過滑動窗口,得到一個圖像的一維N個特徵值的特徵向量。
然後,通過級聯分類器中並聯的最優弱分類器的的閾值,選擇性拋棄部分的特徵,而後通過級聯分類器的多個強分類器的串聯,使得分類準確率得到提升。

其中,在區域放大的過程中會出現同一個人臉被多次檢測,這需要進行區域的合併,這裏不作探討,可以參考文章haar+adaboost結合講解(偏重實際)

如果這個地方,讀者並沒有得到整體的大概的瞭解,那一定是我的原因,請詳細看文章:淺析人臉檢測之Haar分類器方法

6 Haar特徵值歸一化處理

6.1 特徵值的含義

首先,需要設定一個場景感受一下特徵值的含義
我們選取MIT人臉庫中2706個大小爲20*20的人臉正樣本圖像,計算如下圖所示的Haar特徵:
在這裏插入圖片描述
其中,左邊對應的人眼區域,右邊無具體意義。
在這裏插入圖片描述
可以看到,圖中2個不同Haar特徵在同一組樣本中具有不同的特徵值分佈,左邊特徵計算出的特徵值基本都大於0(對樣本的區分度大),而右邊特徵的特徵值基本均勻分佈於0兩側(對樣本的區分度小)。所以,正是由於樣本中Haar特徵值分佈不均勻,導致了不同Haar特徵分類效果不同。顯而易見,對正負樣本區分度越大的特徵分類效果越好,即紅色曲線對應圖中的的左邊Haar特徵分類效果好於右邊Haar特徵。

從上圖我們可以發現,僅僅一個12*8大小的Haar特徵計算出的特徵值變化範圍從-2000~+6000,跨度非常大。這種跨度大的特性不利於量化評定特徵值,所以需要進行“歸一化”,壓縮特徵值範圍。

6.2 特徵值歸一化處理

假設當前檢測窗口中的圖像像素爲i(x,y),當前檢測窗口爲w∗h大小(例如上圖中爲20*20大小),OpenCV採用如下方式“歸一化”
(方便起見,直接copy了。)
在這裏插入圖片描述

7 積分圖優化Haar特徵計算效率

上文解釋到經過Haar計算會得到超級多的特徵值,那麼如何快速的計算這些值,就成了優化工作的一部分。

答案是積分圖

積分圖並不像我們想象的難,恰恰相反,非常簡單。

對於一個灰度圖像I而言,其積分圖也是一張與I尺寸相同的圖,只不過該圖上任意一點(x,y)的值是指從灰度圖像I的左上角與當前點所圍成的舉行區域內所有像素點灰度值之和,有點耳熟吧。類似於圖像直方圖與圖像累積直方圖的關係,這裏只不過是二維的圖像。

構造過程如下圖所示:
積分圖的構造過程
積分圖能夠加速計算的原因就在於,它只需要知道此特徵矩形的四個端點,通過固定的加減法公式就可以得到特徵值

具體的計算過程示例如下:

上面已經知道,一個區域的像素值的和,可以由該區域的端點的積分圖來計算。由前面特徵模板的特徵值的定義可以推出,矩形特徵的特徵值可以由特徵端點的積分圖計算出來。以A矩形特徵爲例,如下圖,使用積分圖計算其特徵值:
在這裏插入圖片描述
該矩形特徵的特徵值,由定義,爲區域A的像素值減去區域B的像素值。
區域A的像素值:
ii(5)+ii(1)ii(2)ii(4) ii(5) + ii(1) - ii(2) - ii(4)
區域B的像素值:
ii(6)+ii(2)ii(5)ii(3) ii(6) + ii(2) - ii(5) - ii(3)
所以:該矩形特徵的特徵值
ii(5)+ii(1)ii(2)ii(4)[ii(6)+ii(2)ii(5)ii(3)]ii(5) + ii(1) - ii(2) - ii(4) - [ii(6) + ii(2) - ii(5) - ii(3)]

所以,矩形特徵的特徵值,只與特徵矩形的端點的積分圖有關,而與圖像的座標無關。通過計算特徵矩形的端點的積分圖,再進行簡單的加減運算,就可以得到特徵值,正因爲如此,特徵的計算速度大大提高,也提高了目標的檢測速度。

參考文章
【圖像處理】計算Haar特徵個數

第九節、人臉檢測之Haar分類器

haar+adaboost結合講解(偏重實際)

淺析人臉檢測之Haar分類器方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章