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

原帖地址:http://www.cnblogs.com/ello/archive/2012/04/28/2475419.htmlhtml

      因爲工做須要,我開始研究人臉檢測部分的算法,這期間斷斷續續地學習了Haar分類器的訓練以及檢測過程,在這裏根據各類論文、網絡資源的查閱以及對代碼的理解作一個簡單的總結。我試圖歸納性的給出算法的起源、全貌以及細節的前因後果,可是水平有限,只能瞭解其大概,但願對初學者起到幫助,更主要的是對我我的學習的一次提煉。node

1、Haar分類器的前世此生

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

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

      「基於知識的方法主要利用先驗知識將人臉看做器官特徵的組合,根據眼睛、眉毛、嘴巴、鼻子等器官的特徵以及相互之間的幾何位置關係來檢測人臉。基於統計的方法則將人臉看做一個總體的模式——二維像素矩陣,從統計的觀點經過大量人臉圖像樣本構造人臉模式空間,根據類似度量來判斷人臉是否存在。在這兩種框架之下,發展了許多方法。目前隨着各類方法的不斷提出和應用條件的變化,將知識模型與統計模型相結合的綜合系統將成爲將來的研究趨勢。」(來自論文《基於Adaboost的人臉檢測方法及眼睛定位算法研究》)算法

 

基於知識的人臉檢測方法編程

  1. 模板匹配
  2. 人臉特徵
  3. 形狀與邊緣
  4. 紋理特性
  5. 顏色特徵

基於統計的人臉檢測方法api

  1. 主成分分析與特徵臉
  2. 神經網絡方法
  3. 支持向量機
  4. 隱馬爾可夫模型
  5. Adaboost算法

      本文中介紹的Haar分類器方法,包含了Adaboost算法,稍後會對這一算法作詳細介紹。所謂分類器,在這裏就是指對人臉和非人臉進行分類的算法,在機器學習領域,不少算法都是對事物進行分類、聚類的過程。OpenCV中的ml模塊提供了不少分類、聚類的算法。網絡

     注:聚類和分類的區別是什麼?通常對已知物體類別總數的識別方式咱們稱之爲分類,而且訓練的數據是有標籤的,好比已經明確指定了是人臉仍是非人臉,這是一種有監督學習。也存在能夠處理類別總數不肯定的方法或者訓練的數據是沒有標籤的,這就是聚類,不須要學習階段中關於物體類別的信息,是一種無監督學習。數據結構

      其中包括Mahalanobis距離、K均值、樸素貝葉斯分類器、決策樹、Boosting、隨機森林、Haar分類器、指望最大化、K近鄰、神經網絡、支持向量機。框架

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

      雖然說haar分類器採用了Boosting的算法,但在OpenCV中,Haar分類器與Boosting沒有采用同一套底層數據結構,《Learning OpenCV》中有這樣的解釋:「Haar分類器,它創建了boost篩選式級聯分類器。它與ML庫中其餘部分相比,有不一樣的格局,由於它是在早期開發的,並徹底可用於人臉檢測。」

      在2001年,Viola和Jones兩位大牛發表了經典的《Rapid Object Detection using a Boosted Cascade of Simple Features》【1】和《Robust Real-Time Face Detection》【2】,在AdaBoost算法的基礎上,使用Haar-like小波特徵和積分圖方法進行人臉檢測,他倆不是最先使用小波特徵的,可是他們設計了針對人臉檢測更有效的特徵,並對AdaBoost訓練出的強分類器進行級聯。這能夠說是人臉檢測史上里程碑式的一筆了,也所以當時提出的這個算法被稱爲Viola-Jones檢測器。又過了一段時間,Rainer Lienhart和Jochen Maydt兩位大牛將這個檢測器進行了擴展【3】,最終造成了OpenCV如今的Haar分類器。以前我有個誤區,覺得AdaBoost算法就是Viola和Jones搞出來的,由於網上講Haar分類器的地方都在大講特講AdaBoost,因此我錯覺了,後來理清脈絡,AdaBoost是Freund 和Schapire在1995年提出的算法,是對傳統Boosting算法的一大提高。Boosting算法的核心思想,是將弱學習方法提高成強學習算法,也就是「三個臭皮匠頂一個諸葛亮」,它的理論基礎來自於Kearns 和Valiant牛的相關證實【4】,在此不深究了。反正我是能多簡略就多簡略的把Haar分類器的前世此生說完鳥,得出的結論是,大牛們都是成對兒的額,回到正題,Haar分類器 =  Haar-like特徵 + 積分圖方法 + AdaBoost + 級聯。

注:爲什麼稱其爲Haar-like?這個名字是我從網上看來的,《Learning OpenCV》中文版提到Haar分類器使用到Haar特徵,但這種說法不確切,應該稱爲類Haar特徵,Haar-like就是類Haar特徵的意思。

2、Haar分類器的淺入淺出

     之因此是淺入淺出是由於,我暫時不能深刻,只是根據其餘人的總結,我加以梳理概括,用本身的理解闡述出來,不免會有錯誤,歡迎指正。

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

① 使用Haar-like特徵作檢測。

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

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

④ 使用篩選式級聯把強分類器級聯到一塊兒,提升準確率。

2.1 Haar-like特徵你是何方神聖?

      一看到Haar-like特徵這玩意兒就頭大的人舉手。好,不少人。那麼我先說下什麼是特徵,我把它放在下面的情景中來描述,假設在人臉檢測時咱們須要有這麼一個子窗口在待檢測的圖片窗口中不斷的移位滑動,子窗口每到一個位置,就會計算出該區域的特徵,而後用咱們訓練好的級聯分類器對該特徵進行篩選,一旦該特徵經過了全部強分類器的篩選,則斷定該區域爲人臉。

那麼這個特徵如何表示呢?好了,這就是大牛們乾的好事了。後人稱他們搞出來的這些東西叫Haar-Like特徵。

下面是Viola牛們提出的Haar-like特徵。

下面是Lienhart等牛們提出的Haar-like特徵。

      這些所謂的特徵不就是一堆堆帶條紋的矩形麼,究竟是幹什麼用的?我這樣給出解釋,將上面的任意一個矩形放到人臉區域上,而後,將白色區域的像素和減去黑色區域的像素和,獲得的值咱們暫且稱之爲人臉特徵值,若是你把這個矩形放到一個非人臉區域,那麼計算出的特徵值應該和人臉特徵值是不同的,並且越不同越好,因此這些方塊的目的就是把人臉特徵量化,以區分人臉和非人臉。

      爲了增長區分度,能夠對多個矩形特徵計算獲得一個區分度更大的特徵值,那麼什麼樣的矩形特徵怎麼樣的組合到一塊能夠更好的區分出人臉和非人臉呢,這就是AdaBoost算法要作的事了。這裏咱們先放下積分圖這個概念無論,爲了讓咱們的思路連貫,我直接開始介紹AdaBoost算法。

2.2 AdaBoost你給我如實道來!

      本節旨在介紹AdaBoost在Haar分類器中的應用,因此只是描述了它在Haar分類器中的特性,而實際上AdaBoost是一種具備通常性的分類器提高算法,它使用的分類器並不侷限某一特定算法。

      上面說到利用AdaBoost算法能夠幫助咱們選擇更好的矩陣特徵組合,其實這裏提到的矩陣特徵組合就是咱們以前提到的分類器,分類器將矩陣組合以二叉決策樹的形式存儲起來。

我如今腦子裏浮現了不少問題,總結起來大概有這麼些個:

  1. 弱分類器和強分類器是什麼?
  2. 弱分類器是怎麼獲得的?
  3. 強分類器是怎麼獲得的?
  4. 二叉決策樹是什麼?

要回答這一系列問題,我得跟你羅嗦一下子了,這得從AdaBoost的身世提及。

2.2.1 AdaBoost的身世之謎

      關於AdaBoost的身世,我把相關英文文獻從上世紀80年代一直下到2001年,我發現我在短期內無法讀完,因此我只能嘗試着從別人的總結中拼湊那些離散的片斷,不免有誤。以前講Haar分類器的前世此生也簡單說過AdaBoost的身世,可是說的還不透。我比較喜歡查算法的戶口,因此新寫了一章查了下去。

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

PAC模型是計算學習理論中經常使用的模型,是Valiant牛在我還沒出生的1984年提出來的【5】,他認爲「學習"是模式明顯清晰或模式不存在時仍能獲取知識的一種「過程」,並給出了一個從計算角度來得到這種「過程"的方法,這種方法包括:

(1)適當信息收集機制的選擇;

(2)學習的協定;

(3)對能在合理步驟內完成學習的概念的分類。

      PAC學習的實質就是在樣本訓練的基礎上,使算法的輸出以機率接近未知的目標概念。PAC學習模型是考慮樣本複雜度(指學習器收斂到成功假設時至少所需的訓練樣本數)和計算複雜度(指學習器收斂到成功假設時所需的計算量)的一個基本框架,成功的學習被定義爲形式化的機率理論。(來自論文《基於Adaboost的人臉檢測方法及眼睛定位算法研究》)簡單說來,PAC學習模型不要求你每次都正確,只要能在多項式個樣本和多項式時間內獲得知足需求的正確率,就算是一個成功的學習。

      基於PAC學習模型的理論分析,Valiant牛提出了Boosting算法【5】,Boosting算法涉及到兩個重要的概念就是弱學習和強學習,所謂的弱學習,就是指一個學習算法對一組概念的識別率只比隨機識別好一點,所謂強學習,就是指一個學習算法對一組機率的識別率很高。如今咱們知道所謂的弱分類器和強分類器就是弱學習算法和強學習算法。弱學習算法是比較容易得到的,得到過程須要數量巨大的假設集合,這個假設集合是基於某些簡單規則的組合和對樣本集的性能評估而生成的,而強學習算法是不容易得到的,然而,Kearns 和Valiant 兩頭牛提出了弱學習和強學習等價的問題 【6】 並證實了只要有足夠的數據,弱學習算法就能經過集成的方式生成任意高精度的強學習方法。這一證實使得Boosting有了可靠的理論基礎,Boosting算法成爲了一個提高分類器精確性的通常性方法。【4】

      1990年,Schapire牛提出了第一個多項式時間的算法【7】,1年後Freund牛又提出了一個效率更高的Boosting算法【8】。然而,Boosting算法仍是存在着幾個主要的問題,其一Boosting算法須要預先知道弱學習算法學習正確率的下限即弱分類器的偏差,其二Boosting算法可能致使後來的訓練過度集中於少數特別難區分的樣本,致使不穩定。針對Boosting的若干缺陷,Freund和Schapire牛於1996年先後提出了一個實際可用的自適應Boosting算法AdaBoost【9】,AdaBoost目前已發展出了大概四種形式的算法,Discrete AdaBoost(AdaBoost.M1)、Real AdaBoost、LogitBoost、gentle AdaBoost,本文不作一一介紹。至此,AdaBoost的身世之謎就這樣揭開鳥。同時弱分類器和強分類器是什麼的問題也解釋清楚了。剩下3個問題,咱們先看一下,弱分類器是如何獲得的。

2.2.2 弱分類器的孵化

      最初的弱分類器可能只是一個最基本的Haar-like特徵,計算輸入圖像的Haar-like特徵值,和最初的弱分類器的特徵值比較,以此來判斷輸入圖像是否是人臉,然而這個弱分類器太簡陋了,可能並不比隨機判斷的效果好,對弱分類器的孵化就是訓練弱分類器成爲最優弱分類器,注意這裏的最優不是指強分類器,只是一個偏差相對稍低的弱分類器,訓練弱分類器其實是爲分類器進行設置的過程。至於如何設置分類器,設置什麼,咱們首先分別看下弱分類器的數學結構和代碼結構

數學結構:

      一個弱分類器由子窗口圖像x,一個特徵f,指示不等號方向的p和閾值組成。P的做用是控制不等式的方向,使得不等式都是<號,形式方便。

² 代碼結構

複製代碼

1 /*
2  * CART classifier
3 */
4 typedef struct CvCARTHaarClassifier
5 {
6     CV_INT_HAAR_CLASSIFIER_FIELDS()
7 int count;
8 int* compidx;
9     CvTHaarFeature* feature;
10     CvFastHaarFeature* fastfeature;
11 float* threshold;
12 int* left;
13 int* right;
14 float* val;
15 } CvCARTHaarClassifier;

複製代碼

代碼結構中的threshold即表明數學結構中的閾值。

      這個閾值到底是幹什麼的?咱們先了解下CvCARTHaarClassifier這個結構,注意CART這個詞,它是一種二叉決策樹,它的提出者Leo Breiman等牛稱其爲「分類和迴歸樹(CART)」。

什麼是決策樹?我若是細講起來又得另起一章,我只簡略介紹它:

      「機器學習中,決策樹是一個預測模型;他表明的是對象屬性與對象值之間的一種映射關係。樹中每一個節點表示某個對象,而每一個分叉路徑則表明的某個可能的屬性值,而每一個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有複數輸出,能夠創建獨立的決策樹以處理不一樣輸出。從數據產生決策樹的機器學習技術叫作決策樹學習, 通俗說就是決策樹。」(來自《維基百科》)

決策樹包含:分類樹,迴歸樹,分類和迴歸樹(CART),CHAID

      分類和迴歸的區別是,分類是當預計結果可能爲兩種類型(例如男女,輸贏等)使用的概念。 迴歸是當局域結果可能爲實數(例如房價,患者住院時間等)使用的概念。

      決策樹用途很廣能夠分析因素對事件結果的影響(詳見維基百科),同時也是很經常使用的分類方法,我舉個最簡單的決策樹例子,假設咱們使用三個Haar-like特徵f1,f2,f3來判斷輸入數據是否爲人臉,能夠創建以下決策樹:

     能夠看出,在分類的應用中,每一個非葉子節點都表示一種判斷,每一個路徑表明一種判斷的輸出,每一個葉子節點表明一種類別,並做爲最終判斷的結果。

     一個弱分類器就是一個基本和上圖相似的決策樹,最基本的弱分類器只包含一個Haar-like特徵,也就是它的決策樹只有一層,被稱爲樹樁(stump)。

     最重要的就是如何決定每一個結點判斷的輸出,要比較輸入圖片的特徵值和弱分類器中特徵,必定須要一個閾值,當輸入圖片的特徵值大於該閾值時才斷定其爲人臉。訓練最優弱分類器的過程實際上就是在尋找合適的分類器閾值,使該分類器對全部樣本的判讀偏差最低。

具體操做過程以下:

1)對於每一個特徵 f,計算全部訓練樣本的特徵值,並將其排序。

掃描一遍排好序的特徵值,對排好序的表中的每一個元素,計算下面四個值:

所有人臉樣本的權重的和t1;

所有非人臉樣本的權重的和t0;

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

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

2)最終求得每一個元素的分類偏差

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

在這漫長的煎熬中,咱們見證了一個弱分類器孵化成長的過程,並回答瞭如何獲得弱分類器以及二叉決策樹是什麼。最後的問題是強分類器是如何獲得的。

2.2.3 弱分類器的化蝶飛

首先看一下強分類器的代碼結構:

複製代碼

1 /* internal stage classifier */
2 typedef struct CvStageHaarClassifier
3 {
4     CV_INT_HAAR_CLASSIFIER_FIELDS()
5 int count;
6 float threshold;
7     CvIntHaarClassifier** classifier;
8 }CvStageHaarClassifier;

複製代碼

/* internal weak classifier*/
typedef struct CvIntHaarClassifier
{
    CV_INT_HAAR_CLASSIFIER_FIELDS()
} CvIntHaarClassifier;

    這裏要提到的是CvIntHaarClassifier結構: 它就至關於一個接口類,固然是用C語言模擬的面向對象思想,利用CV_INT_HAAR_CLASSIFIER_FIELDS()這個宏讓弱分類CvCARTHaarClassifier強分類器和CvStageHaarClassifier繼承於CvIntHaarClassifier。

強分類器的誕生須要T輪的迭代,具體操做以下:

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

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

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

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

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

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

7.組合T個最優弱分類器獲得強分類器,組合方式以下:

      至關於讓全部弱分類器投票,再對投票結果按照弱分類器的錯誤率加權求和,將投票加權求和的結果與平均投票結果比較得出最終的結果。

      至此,咱們看到其實個人題目起的漂亮卻並不貼切,強分類器的脫穎而出更像是民主的投票制度,衆人拾材火焰高,強分類器不是我的英雄主義的的產物,而是團結的力量。但從宏觀的局外的角度看,整個AdaBoost算法就是一個弱分類器從孵化到化蝶的過程。小人物的奮鬥永遠是理想主義者們津津樂道的話題。但暫時讓咱們放下AdaBoost繼續探討Haar分類器的其餘特性吧。

2.3 強分類器的強強聯手

      至今爲止咱們好像一直在講分類器的訓練,實際上Haar分類器是有兩個體系的,訓練的體系,和檢測的體系。訓練的部分大體都提到了,還剩下最後一部分就是對篩選式級聯分類器的訓練。咱們看到了經過AdaBoost算法辛苦的訓練出了強分類器,然而在現實的人臉檢測中,只靠一個強分類器仍是難以保證檢測的正確率,這個時候,須要一個豪華的陣容,訓練出多個強分類器將它們強強聯手,最終造成正確率很高的級聯分類器這就是咱們最終的目標Haar分類器。

      那麼訓練級聯分類器的目的就是爲了檢測的時候,更加準確,這涉及到Haar分類器的另外一個體系,檢測體系,檢測體系是以現實中的一幅大圖片做爲輸入,而後對圖片中進行多區域,多尺度的檢測,所謂多區域,是要對圖片劃分多塊,對每一個塊進行檢測,因爲訓練的時候用的照片通常都是20*20左右的小圖片,因此對於大的人臉,還須要進行多尺度的檢測,多尺度檢測機制通常有兩種策略,一種是不改變搜索窗口的大小,而不斷縮放圖片,這種方法顯然須要對每一個縮放後的圖片進行區域特徵值的運算,效率不高,而另外一種方法,是不斷初始化搜索窗口size爲訓練時的圖片大小,不斷擴大搜索窗口,進行搜索,解決了第一種方法的弱勢。在區域放大的過程當中會出現同一我的臉被屢次檢測,這須要進行區域的合併,這裏不做探討。

不管哪種搜索方法,都會爲輸入圖片輸出大量的子窗口圖像,這些子窗口圖像通過篩選式級聯分類器會不斷地被每個節點篩選,拋棄或經過。

它的結構如圖所示。

我想你必定以爲很熟悉,這個結構不是很像一個簡單的決策樹麼。

在代碼中,它的結構以下:

複製代碼

1 /* internal tree cascade classifier node */
2 typedef struct CvTreeCascadeNode
3 {
4     CvStageHaarClassifier* stage;
5 struct CvTreeCascadeNode* next;
6 struct CvTreeCascadeNode* child;
7 struct CvTreeCascadeNode* parent;
8 struct CvTreeCascadeNode* next_same_level;
9 struct CvTreeCascadeNode* child_eval;
10 int idx;
11 int leaf;
12 } CvTreeCascadeNode;
13 /* internal tree cascade classifier */
14 typedef struct CvTreeCascadeClassifier
15 {
16     CV_INT_HAAR_CLASSIFIER_FIELDS()
17     CvTreeCascadeNode* root;      /* root of the tree */
18     CvTreeCascadeNode* root_eval; /* root node for the filtering */
19 int next_idx;
20 } CvTreeCascadeClassifier
;

複製代碼

      級聯強分類器的策略是,將若干個強分類器由簡單到複雜排列,但願通過訓練使每一個強分類器都有較高檢測率,而誤識率能夠放低,好比幾乎99%的人臉能夠經過,但50%的非人臉也能夠經過,這樣若是有20個強分類器級聯,那麼他們的總識別率爲0.99^20 98%,錯誤接受率也僅爲0.5^20  0.0001%。這樣的效果就能夠知足現實的須要了,可是如何使每一個強分類器都具備較高檢測率呢,爲何單個的強分類器不能夠同時具備較高檢測率和較高誤識率呢?

下面咱們講講級聯分類器的訓練。(主要參考了論文《基於Adaboost的人臉檢測方法及眼睛定位算法研究》)

     設K是一個級聯檢測器的層數,D是該級聯分類器的檢測率,F是該級聯分類器的誤識率,di是第i層強分類器的檢測率,fi是第i層強分類器的誤識率。若是要訓練一個級聯分類器達到給定的F值和D值,只須要訓練出每層的d值和f值,這樣:

d^K = D,f^K = F

級聯分類器的要點就是如何訓練每層強分類器的d值和f值達到指定要求。

      AdaBoost訓練出來的強分類器通常具備較小的誤識率,但檢測率並不很高,通常狀況下,高檢測率會致使高誤識率,這是強分類閾值的劃分致使的,要提升強分類器的檢測率既要下降閾值,要下降強分類器的誤識率就要提升閾值,這是個矛盾的事情。據參考論文的實驗結果,增長分類器個數能夠在提升強分類器檢測率的同時下降誤識率,因此級聯分類器在訓練時要考慮以下平衡,一是弱分類器的個數和計算時間的平衡,二是強分類器檢測率和誤識率之間的平衡。具體訓練方法以下,我用僞碼的形式給出:

1)設定每層最小要達到的檢測率d,最大誤識率f,最終級聯分類器的誤識率Ft;

2)P=人臉訓練樣本,N=非人臉訓練樣本,D0=1.0,F0=1.0;

3)i=0;

4)for : Fi>Ft

    ++i;

    ni=0;Fi=Fi-1;

    for : Fi>f*Fi-1

        ++ni;

        利用AdaBoost算法在P和N上訓練具備ni個弱分類器的強分類器;

        衡量當前級聯分類器的檢測率Di和誤識率Fi;

        for : di<d*Di-1;

            下降第i層的強分類器閾值;

            衡量當前級聯分類器的檢測率Di和誤識率Fi;

        N = Φ;

        利用當前的級聯分類器檢測非人臉圖像,將誤識的圖像放入N;

2.4 積分圖是一個加速器

       之因此放到最後講積分圖(Integral image),不是由於它不重要,正相反,它是Haar分類器可以實時檢測人臉的保證。當我把Haar分類器的主脈絡都介紹完後,其實在這裏引出積分圖的概念恰到好處。

     在前面的章節中,咱們熟悉了Haar-like分類器的訓練和檢測過程,你會看到不管是訓練仍是檢測,每遇到一個圖片樣本,每遇到一個子窗口圖像,咱們都面臨着如何計算當前子圖像特徵值的問題,一個Haar-like特徵在一個窗口中怎樣排列可以更好的體現人臉的特徵,這是未知的,因此纔要訓練,而訓練以前咱們只能經過排列組合窮舉全部這樣的特徵,僅以Viola牛提出的最基本四個特徵爲例,在一個24×24size的窗口中任意排列至少能夠產生數以10萬計的特徵,對這些特徵求值的計算量是很是大的。

    而積分圖就是隻遍歷一次圖像就能夠求出圖像中全部區域像素和的快速算法,大大的提升了圖像特徵值計算的效率。

咱們來看看它是怎麼作到的:

     積分圖是一種可以描述全局信息的矩陣表示方法。積分圖的構造方式是位置(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的四個頂點分別爲α、β、γ、δ,則D的像素和能夠表示爲

Dsum = ii( α )+ii( β)-(ii( γ)+ii( δ ));

而Haar-like特徵值無非就是兩個矩陣像素和的差,一樣能夠在常數時間內完成。

3、Haar分類器你敢更快點嗎?!

這一章我簡略的探討下Haar分類器的檢測效率。

我嘗試過的幾種方法:

1)嘗試檢測算法與跟蹤算法相結合,本來覺得Camshift是個輕量級的算法,可是正如我後來看到的,創建反向投影圖的效率實在不高,在PC上效果不錯,可是在ios上速度很慢,這個我後來發現多是由於ios浮點運算效率不高的緣由。可是即使速度能上去,靠Camshift跟蹤算法太依賴膚色了,致使脖子,或是手什麼的干擾很嚴重,這個調起來很費神,也不必定能調好。

2)修改OpenCV中Haar檢測函數的參數,效果很是明顯,得出的結論是,搜索窗口的搜索區域是提升效率的關鍵。

3)根據2)的啓發,我打算利用YCbCr顏色空間,粗估膚色區域,以減小人臉的搜索面積,可是後來苦於沒能高效率的區分出膚色區域,放棄了該方法。

4)換了策略,考慮到視頻中人臉檢測的特殊性,上一幀人臉的位置信息對下一幀的檢測有很高的指導價值,因此採有幀間約束的方法,減小了人臉搜索的區域,而且動態調整Haar檢測函數的參數,獲得了較高的效率。

5)其餘關於算法以外的優化須要根據不一樣的處理器作具體的優化。

4、總結

      以前沒怎麼接觸到計算機視覺領域,此次reseach對我來講是一個不小的挑戰,發現其中涉及大量的數學知識,線代,統計學,數學分析等等,雖然感到困難重重,但我感到莫大的興趣,尤爲是機器學習領域,在我眼前展開的是一幅美妙的畫面,大牛們神乎其技各顯神通,複雜的數學公式背後蘊含着簡單的哲理和思想。

      人類的發展來源於對天然背後神祕力量的好奇和膜拜,簡單的結構每每構建出讓人不可思議的偉大,0和1構成了龐大的電子信息世界,DNA構成了本身都沒法徹底瞭解本身的生命體,夸克或是比夸克還小的粒子構成了這個使人着迷的宇宙,在這些簡單的結構背後,是什麼在注視着咱們,狹義的編程只是在計算機的硬件軀殼內構建可執行的程序,而廣義的編程在我看來是創造世界的一種手段。

    如今,我給你一個創造世界的機會,你是用Vim仍是Emacs,也許你會調侃的跟我說:「恩,我用E = mc^2」。

附錄:

論文列表:

【1】《Rapid Object Detection using a Boosted Cascade of Simple Features》

【2】《Robust Real-Time Face Detection》

【3】《An Extended Set of Haar-like Features for Rapid Object Detection》

【4】《Crytographic Limitations on Learning Boolean Formulae and Finite Automata》

【5】《A Theory of the Learnable》

【6】《The Computational Complexity of Machine Learning》

【7】《The Strength of Weak Learnability》

【8】《Boosting a weak learning algorithm》

【9】《A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting》

相關文章
相關標籤/搜索