天天看點

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

一、Haar分類器的前世今生

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

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

Ø  基于知識的方法:主要利用先驗知識将人臉看作器官特征的組合,根據眼睛、眉毛、嘴巴、鼻子等器官的特征以及互相之間的幾何位置關系來檢測人臉。

Ø  基于統計的方法:将人臉看作一個整體的模式——二維像素矩陣,從統計的觀點通過大量人臉圖像樣本構造人臉模式空間,根據相似度量來判斷人臉是否存在。

基于知識的人臉檢測方法:

       模闆比對、人臉特征、形狀與邊緣、紋理特性、顔色特征

基于統計的人臉檢測方法:

       Adaboost主成分分析與特征臉、神經網絡方法、支援向量機、隐馬爾可夫模型

算法

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

注:聚類和分類的差別是什麼?

Ø  分類:一般對已知物體類别總數的識别方式我們稱之為分類,并且訓練的資料是有标簽的,比如已經明确指定了是人臉還是非人臉,這是一種有監督學習。

Ø  聚類:也存在可以處理類别總數不确定的方法或者訓練的資料是沒有标簽的,這就是聚類,不需要學習階段中關于物體類别的資訊,是一種無監督學習。

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

       我們要探讨的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兩位大牛将這個檢測器進行了擴充【3】,最終形成了OpenCV現在的Haar分類器。

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

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

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

① 使用Haar-like特征做檢測。

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

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

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

二、Haar分類器的淺入淺出

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

        什麼是特征,我把它放在下面的情景中來描述,假設在人臉檢測時我們需要有這麼一個子視窗在待檢測的圖檔視窗中不斷的移位滑動,子視窗每到一個位置,就會計算出該區域的特征,然後用我們訓練好的級聯分類器對該特征進行篩選,一旦該特征通過了所有強分類器的篩選,則判定該區域為人臉。

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

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

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

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

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

     這些所謂的特征不就是一堆堆帶條紋的矩形麼,到底是幹什麼用的?我這樣給出解釋,将上面的任意一個矩形放到人臉區域上,然後,将白色區域的像素和減去黑色區域的像素和,得到的值我們暫且稱之為人臉特征值,如果你把這個矩形放到一個非人臉區域,那麼計算出的特征值應該和人臉特征值是不一樣的,而且越不一樣越好,是以這些方塊的目的就是把人臉特征量化,以區分人臉和非人臉。

        為了增加區分度,可以對多個矩形特征計算得到一個區分度更大的特征值,那麼什麼樣的矩形特征怎麼樣的組合到一塊可以更好的區分出人臉和非人臉呢,這就是AdaBoost算法要做的事了。這裡我們先放下積分圖這個概念不管,為了讓我們的思路連貫,我直接開始介紹AdaBoost算法。

2.2、 AdaBoost你給我如實道來!

       本節旨在介紹AdaBoost在Haar分類器中的應用,是以隻是描述了它在Haar分類器中的特性,而實際上AdaBoost是一種具有一般性的分類器提升算法,它使用的分類器并不局限某一特定算法。

      上面說到利用AdaBoost算法可以幫助我們選擇更好的矩陣特征組合,其實這裡提到的矩陣特征組合就是我們之前提到的分類器,分類器将矩陣組合以二叉決策樹的形式存儲起來。

我現在腦子裡浮現了很多問題,總結起來大概有這麼些個:

(1)弱分類器和強分類器是什麼?

(2)弱分類器是怎麼得到的?

(3)強分類器是怎麼得到的?

(4)二叉決策樹是什麼?

要回答這一系列問題,我得跟你羅嗦一會兒了,這得從AdaBoost的身世說起。

2.2.1、 AdaBoost的身世之謎

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

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

(1)适當資訊收集機制的選擇;

(2)學習的協定;

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

          PAC學習的實質就是在樣本訓練的基礎上,使算法的輸出以機率接近未知的目标概念。PAC學習模型是考慮樣本複雜度(指學習器收斂到成功假設時至少所需的訓練樣本數)和計算複雜度(指學習器收斂到成功假設時所需的計算量)的一個基本架構,成功的學習被定義為形式化的機率理論。簡單說來,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特征值,和最初的弱分類器的特征值比較,以此來判斷輸入圖像是不是人臉,然而這個弱分類器太簡陋了,可能并不比随機判斷的效果好,對弱分類器的孵化就是訓練弱分類器成為最優弱分類器,注意這裡的最優不是指強分類器,隻是一個誤差相對稍低的弱分類器,訓練弱分類器實際上是為分類器進行設定的過程。至于如何設定分類器,設定什麼,我們首先分别看下弱分類器的數學結構和代碼結構。

數學結構

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

       一個弱分類器由子視窗圖像x,一個特征f,訓示不等号方向的p和門檻值Θ組成。P的作用是控制不等式的方向,使得不等式都是<< span>号,形式友善。

代碼結構

 typedef struct CvCARTHaarClassifier

 {

     CV_INT_HAAR_CLASSIFIER_FIELDS()

     int count;

     int* compidx;

     CvTHaarFeature* feature;

     CvFastHaarFeature* fastfeature;

     float* threshold;

     int* left;

     int* right;

     float* val;

 } CvCARTHaarClassifier;

代碼結構中的threshold即代表數學結構中的Θ門檻值。

      這個門檻值究竟是幹什麼的?我們先了解下CvCARTHaarClassifier這個結構,注意CART這個詞,它是一種二叉決策樹,它的提出者Leo Breiman等牛稱其為“分類和回歸樹(CART)”。什麼是決策樹?我如果細講起來又得另起一章,我隻簡略介紹它。

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

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

分類和回歸的差別是,

Ø  分類:是當預計結果可能為兩種類型(例如男女,輸赢等)使用的概念。

Ø  回歸:是當局域結果可能為實數(例如房價,患者住院時間等)使用的概念。

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

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

        可以看出,在分類的應用中,每個非葉子節點都表示一種判斷,每個路徑代表一種判斷的輸出,每個葉子節點代表一種類别,并作為最終判斷的結果。

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

        最重要的就是如何決定每個結點判斷的輸出,要比較輸入圖檔的特征值和弱分類器中特征,一定需要一個門檻值,當輸入圖檔的特征值大于該門檻值時才判定其為人臉。訓練最優弱分類器的過程實際上就是在尋找合适的分類器門檻值,使該分類器對所有樣本的判讀誤差最低。

具體操作過程如下:

1)對于每個特征 f,計算所有訓練樣本的特征值,并将其排序。

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

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

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

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

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

2)最終求得每個元素的分類誤差 r = min((s1 + (t0 - s0)), (s0 + (t1 - s1)))

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

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

2.2.3、弱分類器的化蝶飛

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

 typedef struct CvStageHaarClassifier

 {

     CV_INT_HAAR_CLASSIFIER_FIELDS()

     int count;

     float threshold;

     CvIntHaarClassifier** classifier;

 }CvStageHaarClassifier;

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個最優弱分類器得到強分類器,組合方式如下:

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

相當于讓所有弱分類器投票,再對投票結果按照弱分類器的錯誤率權重求和,将投票權重求和的結果與平均投票結果比較得出最終的結果。

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

2.3、強分類器的強強聯手

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

         那麼訓練級聯分類器的目的就是為了檢測的時候,更加準确,這涉及到Haar分類器的另一個體系,檢測體系,檢測體系是以現實中的一幅大圖檔作為輸入,然後對圖檔中進行多區域,多尺度的檢測,所謂多區域,是要對圖檔劃分多塊,對每個塊進行檢測,由于訓練的時候用的照片一般都是20*20左右的小圖檔,是以對于大的人臉,還需要進行多尺度的檢測,多尺度檢測機制一般有兩種政策,一種是不改變搜尋視窗的大小,而不斷縮放圖檔,這種方法顯然需要對每個縮放後的圖檔進行區域特征值的運算,效率不高,而另一種方法,是不斷初始化搜尋視窗size為訓練時的圖檔大小,不斷擴大搜尋視窗,進行搜尋,解決了第一種方法的弱勢。在區域放大的過程中會出現同一個人臉被多次檢測,這需要進行區域的合并,這裡不作探讨。

         無論哪一種搜尋方法,都會為輸入圖檔輸出大量的子視窗圖像,這些子視窗圖像經過篩選式級聯分類器會不斷地被每一個節點篩選,抛棄或通過。

它的結構如圖所示。

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

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

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

 typedef struct CvTreeCascadeNode

 {

     CvStageHaarClassifier* stage;

     struct CvTreeCascadeNode* next;

     struct CvTreeCascadeNode* child;

     struct CvTreeCascadeNode* parent;

     struct CvTreeCascadeNode* next_same_level;

     struct CvTreeCascadeNode* child_eval;

     int idx;

     int leaf;

 } CvTreeCascadeNode;

 typedef struct CvTreeCascadeClassifier

 {

     CV_INT_HAAR_CLASSIFIER_FIELDS()

     CvTreeCascadeNode* root;     

     CvTreeCascadeNode* root_eval;

     int next_idx;

 } 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 i-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)左上角方向所有像素的和:

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

積分圖建構算法:

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就構造好了。

積分圖構造好之後,圖像中任何矩陣區域的像素累加和都可以通過簡單運算得到如圖所示。

程式員的機器學習入門筆記(九):人臉檢測之Haar分類器方法:Haar特征、積分圖、 AdaBoost 、級聯

設D的四個頂點分别為α、β、γ、δ,則D的像素和可以表示為

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

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

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

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

我嘗試過的幾種方法:

1)嘗試檢測算法與跟蹤算法相結合,原本以為Camshift是個輕量級的算法,但是正如我後來看到的,建立反向投影圖的效率實在不高,在PC上效果不錯,但是在iOS上速度很慢,這個我後來發現可能是因為ios浮點運算效率不高的原因。但是即便速度能上去,靠Camshift跟蹤算法太依賴膚色了,導緻脖子,或是手什麼的幹擾很嚴重,這個調起來很費神,也不一定能調好。

2)修改OpenCV中Haar檢測函數的參數,效果非常明顯,得出的結論是,搜尋視窗的搜尋區域是提高效率的關鍵。

3)根據2)的啟發,我打算利用YCbCr顔色空間,粗估膚色區域,以減少人臉的搜尋面積,但是後來苦于沒能高效率的區分出膚色區域,放棄了該方法。

4)換了政策,考慮到視訊中人臉檢測的特殊性,上一幀人臉的位置資訊對下一幀的檢測有很高的指導價值,是以采有幀間限制的方法,減少了人臉搜尋的區域,并且動态調整Haar檢測函數的參數,得到了較高的效率。

5)其他關于算法之外的優化需要根據不同的處理器做具體的優化。

四、總結

       之前沒怎麼接觸到計算機視覺領域,這次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》

轉自:http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html

繼續閱讀