1. 程式人生 > >第九節、人臉檢測之Haar分類器

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

白色 har cas 詳情 大小 一次 水平 分類 需求

人臉檢測屬於計算機視覺的範疇,早期人們的主要研究方向是人臉識別,即根據人臉來識別人物的身份,後來在復雜背景下的人臉檢測需求越來越大,人臉檢測也逐漸作為一個單獨的研究方向發展起來。

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

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

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

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

我們要探討的Haar分類器實際上是Boosting算法的一個應用,Haar分類器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法訓練出的強分類器進行了級聯,並且在底層的特征提取中采用了高效率的矩形特征和積分圖方法,這裏涉及到的幾個名詞接下來會具體討論。

2001年,Viola和Jones兩位大牛發表了經典的《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,在AdaBoost算法的基礎上,使用Haar-like小波特征和積分圖方法進行人臉檢測,他倆不是最早使用提出小波特征的,但是他們設計了針對人臉檢測更有效的特征,並對AdaBoost訓練出的強分類器進行級聯。這可以說是人臉檢測史上裏程碑式的一筆了,也因此當時提出的這個算法被稱為Viola-Jones檢測器。又過了一段時間,Rainer Lienhart和Jochen Maydt兩位大牛將這個檢測器進行了擴展,最終形成了OpenCV現在的Haar分類器。

AdaBoost是Freund和Schapire在1995年提出的算法,是對傳統Boosting算法的一大提升。Boosting算法的核心思想,是將弱學習方法提升成強學習算法,也就是“三個臭皮匠頂一個諸葛亮”。

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

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

  1. 使用Haar-like特征做檢測。
  2. 使用積分圖(Integral Image)對Haar-like特征求值進行加速。
  3. 使用AdaBoost算法訓練區分人臉和非人臉的強分類器。
  4. 使用篩選式級聯把強分類器級聯到一起,提高準確率。

一 Haar-like特征

Haar(哈爾)特征分為三類:邊緣特征、線性特征、中心特征和對角線特征,組合成特征模板。特征模板內有白色和黑色兩種矩形,並定義該模板的

特征值為白色矩形像素和減去黑色矩形像素和Haar特征值反映了圖像的灰度變化情況。例如:臉部的一些特征能由矩形特征簡單的描述,如:眼睛要比臉頰顏色要深,鼻梁兩側比鼻梁顏色要深,嘴巴比周圍顏色要深等。但矩形特征只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。

技術分享圖片

對於圖中的A, B和D這類特征,特征數值計算公式為:v=Σ白-Σ黑,而對於C來說,計算公式如下:v=Σ白-2*Σ黑;之所以將黑色區域像素和乘以2,是為了使兩種矩形區域中像素數目一致。我們希望當把矩形放到人臉區域計算出來的特征值和放到非人臉區域計算出來的特征值差別越大越好,這樣就可以用來區分人臉和非人臉。

通過改變特征模板的大小和位置,可在圖像子窗口中窮舉出大量的特征。上圖的特征模板稱為“特征原型”;特征原型在圖像子窗口中擴展(平移伸縮)得到的特征稱為“矩形特征”;矩形特征的值稱為“特征值”。

技術分享圖片

上圖中兩個矩形特征,表示出人臉的某些特征。比如中間一幅表示眼睛區域的顏色比臉頰區域的顏色深,右邊一幅表示鼻梁兩側比鼻梁的顏色要深。同樣,其他目標,如眼睛等,也可以用一些矩形特征來表示。使用特征比單純地使用像素點具有很大的優越性,並且速度更快。

矩形特征可位於圖像任意位置,大小也可以任意改變,所以矩形特征值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測窗口含有非常多的矩形特征,如:在24*24像素大小的檢測窗口內矩形特征數量可以達到16萬個。這樣就有兩個問題需要解決了:(1)如何快速計算那麽多的特征?---積分圖大顯神通;(2)哪些矩形特征才是對分類器分類最有效的?---如通過AdaBoost算法來訓練。詳情參考:集成學習值Adaboost算法原理和代碼小結(轉載)

二、Haar-like特征的計算—積分圖

積分圖就是只遍歷一次圖像就可以求出圖像中所有區域像素和的快速算法,大大的提高了圖像特征值計算的效率。

積分圖主要的思想是將圖像從起點開始到各個點所形成的矩形區域像素之和作為一個數組的元素保存在內存中,當要計算某個區域的像素和時可以直接索引數組的元素,不用重新計算這個區域的像素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃算法)。積分圖能夠在多種尺度下,使用相同的時間(常數時間)來計算不同的特征,因此大大提高了檢測速度。

積分圖是一種能夠描述全局信息的矩陣表示方法。積分圖的構造方式是位置$(i,j)$處的值$ii(i,j)$是原圖像$(i,j)$左上角方向所有像素$f(k,l)$的和:$$ii(i,j)=\sum\limits_{k≤i,l≤j}f(k,l)$$

積分圖構建算法:

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的四個頂點分別為α,β,γ,δ則D的像素和可以表示位$$D_{sum}=ii(α)+ii(β)-(ii(γ)+ii(δ))$$

而Haar-like特征值無非就是兩個矩陣像素和的差,同樣可以在常數時間內完成。

參考文獻:

淺析人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

OpenCV中的Haar+Adaboost(一):Haar特征詳細介紹

Haar特征與積分圖(推薦)

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