天天看點

人臉檢測發展:從VJ到深度學習(上)

雷鋒網(公衆号:雷鋒網)按:本文作者邬書哲, 中科院計算所智能資訊處理重點實驗室vipl課題組博士生,研究方向:目标檢測,尤其關注基于深度學習的目标檢測方法。

本文分上下兩篇,上篇主要介紹人臉檢測的基本流程,以及傳統的vj人臉檢測器及其改進,下篇介紹基于深度網絡的檢測器,以及對目前人臉檢測技術發展的思考與讨論。為了讓本文更适合非計算機視覺和機器學習背景的讀者,文中對所涉及到的專業術語盡量以通俗的語言和用舉例的方式來進行解釋,同時力求嚴謹,以展現實事求是和一絲不苟的科學研究精神。   

這是一個看臉的世界!自拍,我們要藝術美顔;出門,我麼要靓麗美妝。上班,我們要刷臉簽到;回家,我們要看臉相親。 當手機把你的臉變得美若天仙,當考勤機認出你的臉對你表示歡迎,你知道是什麼魔力讓冷冰冰的機器也變得溫情脈脈,讓呆呆的裝置也變得善解人意嗎?今天就讓我們走近它們的内心,了解這些故事背後的一項關鍵技術:人臉檢測。    

看人先看臉,走在大街上,我們可以毫不費勁地看到所有人的臉:棱角分明的國字臉,嬌小可人的瓜子臉,擦肩而過路人甲的臉,迎面走來明星乙的臉,戴着口罩被遮住的臉,斜向上45度仰角自拍的臉。可是,對于我們的計算機和各種終端裝置而言,從眼前的畫面中把人臉給找出來,并不是一件容易的事情,原因就在于,一千個讀者就有一千個哈姆雷特,在你的眼裡,人臉是這樣的:   

人臉檢測發展:從VJ到深度學習(上)

而在機器的眼裡,人臉是這樣的:   

人臉檢測發展:從VJ到深度學習(上)

你沒看錯,圖像存儲在機器中不過就是一個由0和1組成的二進制串!更确切地說,機器看到的是圖像上每一個點的顔色值,是以對于機器來說,一張圖像就是一個由數排成的陣列。試想一下,如果我把每個點的顔色值都念給你聽,你能告訴我對應的這張圖像上有沒有人臉和人臉在哪裡嗎?很顯然,這并不是一個容易解決的問題。    

如果手機沒法在自拍照中找到我們臉,那它就像一個失明的化妝師,沒法展現出我們最好的一面;如果考勤機沒法通過攝像頭看到我們的臉,那我們的笑就隻是自作多情,它也根本不可能識别出我們到底是誰。人臉檢測架起了機器和我們之間溝通的橋梁,使得它能夠知道我們的身份(人臉識别),讀懂我們的表情(表情識别),和我們一起歡笑(人臉動畫),與我們一起互動(人機互動)。

人臉檢測的開始和基本流程    

具體來說,人臉檢測的任務就是判斷給定的圖像上是否存在人臉,如果人臉存在,就給出全部人臉所處的位置及其大小。由于人臉檢測在實際應用中的重要意義,早在上世紀70年代就已經有人開始研究,然而受當時落後的技術條件和有限的需求所影響,直到上世紀90年代,人臉檢測技術才開始加快向前發展的腳步,在新世紀到來前的最後十年間,湧現出了大量關于人臉檢測的研究工作,這時期設計的很多人臉檢測器已經有了現代人臉檢測技術的影子,例如可變形模闆的設計(将人臉按照五官和輪廓劃分成多個互相連接配接的局部塊)、神經網絡的引入(作為判斷輸入是否為人臉的分類模型)等。這些早期的工作主要關注于檢測正面的人臉,基于簡單的底層特征如物體邊緣、圖像灰階值等來對圖像進行分析,結合關于人臉的先驗知識來設計模型和算法(如五官、膚色),并開始引入一些當時已有的的模式識别方法。    

雖然早期關于人臉檢測的研究工作離實際應用的要求還有很遠,但其中進行檢測的流程已經和現代的人臉檢測方法沒有本質差別。給定一張輸入圖像,要完成人臉檢測這個任務,我們通常分成三步來進行:  

  1.選擇圖像上的某個(矩形)區域作為一個觀察視窗;   

 2.在標明的視窗中提取一些特征對其包含的圖像區域進行描述;   

 3.根據特征描述來判斷這個視窗是不是正好框住了一張人臉。   

檢測人臉的過程就是不斷地執行上面三步,直到周遊所有需要觀察的視窗。如果所有的視窗都被判斷為不包含人臉,那麼就認為所給的圖像上不存在人臉,否則就根據判斷為包含人臉的視窗來給出人臉所在的位置及其大小。    

那麼,如何來選擇我們要觀察的視窗呢?所謂眼見為實,要判斷圖像上的某個位置是不是一張人臉,必須要觀察了這個位置之後才知道,是以,選擇的視窗應該覆寫圖像上的所有位置。顯然,最直接的方式就是讓觀察的視窗在圖像上從左至右、從上往下一步一步地滑動,從圖像的左上角滑動到右下角——這就是所謂的滑動視窗範式,你可以将它想象成是福爾摩斯(檢測器)在拿着放大鏡(觀察視窗)仔細觀察案發現場(輸入圖像)每一個角落(滑動)的過程。 

人臉檢測發展:從VJ到深度學習(上)

别看這種用視窗在圖像上進行掃描的方式非常簡單粗暴,它的确是一種有效而可靠的視窗選擇方法,以至于直到今天,滑動視窗範式仍然被很多人臉檢測方法所采用,而非滑動視窗式的檢測方法本質上仍然沒有擺脫對圖像進行密集掃描的過程。    

對于觀察視窗,還有一個重要的問題就是:視窗應該多大?我們認為一個視窗是一個人臉視窗當且僅當其恰好框住了一張人臉,即視窗的大小和人臉的大小是一緻的,視窗基本貼合人臉的外輪廓。    

人臉檢測發展:從VJ到深度學習(上)

那麼問題來了,即使是同一張圖像上,人臉的大小不僅不固定,而且可以是任意的,這樣怎麼才能讓觀察視窗适應不同大小的人臉呢?一種做法當然是采用多種不同大小的視窗,分别去掃描圖像,但是這種做法并不高效。換一個角度來看,其實也可以将圖像縮放到不同的大小,然後用相同大小的視窗去掃描——這就是所謂的構造圖像金字塔的方式。圖像金字塔這一名字非常生動形象,将縮放成不同大小的圖像按照從大到小的順序依次往上堆疊,正好就組成了一個金字塔的形狀。

人臉檢測發展:從VJ到深度學習(上)

通過建構圖像金字塔,同時允許視窗和人臉的貼合程度在小範圍内變動,我們就能夠檢測到不同位置、不同大小的人臉了。另外需要一提的是,對于人臉而言,我們通常隻用正方形的觀察視窗,是以就不需要考慮視窗的長寬比問題了。    

選好了視窗,我們開始對視窗中的圖像區域進行觀察,目的是收集證據——真相隻有一個,我們要依靠證據來挖掘真相!在處理圖像的過程中,這個收集證據的環節我們稱之為特征提取,特征就是我們對圖像内容的描述。由于機器看到的隻是一堆數值,能夠處理的也隻有數值,是以對于圖像所提取的特征具體表示出來就是一個向量,稱之為特征向量,其每一維是一個數值,這個數值是根據輸入(圖像區域)經由某些計算(觀察)得到的,例如進行求和、相減、比較大小等。總而言之,特征提取過程就是從原始的輸入資料(圖像區域顔色值排列組成的矩陣)變換到對應的特征向量的過程,特征向量就是我們後續用來分析和尋找真相的證據。   

特征提取之後,就到了決斷的時刻:判别目前的視窗是否恰好包含一張人臉。我們将所有的視窗劃分為兩類,一類是恰好包含人臉的視窗,稱之為人臉視窗,剩下的都歸為第二類,稱之為非人臉視窗,而最終判别的過程就是一個對目前觀察視窗進行分類的過程。因為我們的證據是由數值組成的特征向量,是以我們是通過可計算的數學模型來尋找真相的,用來處理分類問題的數學模型我們通常稱之為分類器,分類器以特征向量作為輸入,通過一系列數學計算,以類别作為輸出——每個類别會對應到一個數值編碼,稱之為這個類别對應的标簽,如将人臉視窗這一類編碼為1,而非人臉視窗這一類編碼為-1;分類器就是一個将特征向量變換到類别标簽的函數。    

考慮一個最簡單的分類器:将特征向量每一維上的數值相加,如果得到的和超過某個數值,就輸出人臉視窗的類别标簽1,否則輸出非人臉視窗的類别标簽-1。記特征向量為,

人臉檢測發展:從VJ到深度學習(上)

分類器為函數f(x),那麼有:    

人臉檢測發展:從VJ到深度學習(上)

這裡的t就是前面所說的“某個數值”,其決定了分類器在給定特征向量下的輸出結果,我們稱其為分類器的參數。不同形式和類型的分類器會有不同的參數,一個分類器可以有一個或者多個參數,參數或者其取值不同則對應到不同的分類器。標明了一個分類器之後,緊接着的一個問題就是:參數該怎麼設定?具體到我們正在考慮的情況,就是:t的值該如何選取?   

要做出選擇,就要有一個目标,在分類問題中,目标當然就是盡可能正确地進行分類,即分類的準确率盡可能高。然而,盡管我們對目标非常明确,我們也仍然沒法給出一個最優的參數取值,因為我們并不使用機器所采用的二進制語言系統,我們并不懂什麼才是對機器最好的。于是我們隻有一種選擇:把我們的目标告訴機器,舉一些例子向其進行解釋,然後讓機器自己去學習這個參數,最後我們給機器設計一場考試,測試其是否滿足了我們的要求。我們從一些圖像上選出一部分人臉和非人臉視窗的樣例,用對應的類别标簽對其進行标注,然後将這些樣例劃分成兩個集合,一個集合作為分類器學習所使用的訓練集,另一個集合作為最終考查分類器能力的測試集,同時我們設定一個目标:希望分類的準确率能夠在80%以上。    

學習過程開始時,我們先給分類器的參數設定一個初始值,然後讓分類器通過訓練集中帶有“答案”(類别标簽)的樣例,不斷去調整自己參數的取值,以縮小其實際的分類準确率和目标準确率之間的差距。當分類器已經達到了預先設定的目标或者其它停止學習的條件——期末考試的時間是不會因為你沒有學好而推遲的,或者分類器覺得自己已經沒有辦法再調整了,學習過程就停止了,這之後我們可以考查分類器在測試集上的準确率,以此作為我們評判分類器的依據。這一過程中,分類器調整自己參數的方式和分類器的類型、設定的目标等都有關,由于這部分内容超出了本文所讨論的範疇,也并不影響讀者對人臉檢測方法的了解,是以不再展開進行講述。    

在确定了選擇視窗的政策,設計好了提取特征的方式,并學習了一個針對人臉和非人臉視窗的分類器之後,我們就獲得了建構一個人臉檢測系統所需要的全部關鍵要素——還有一些小的環節相比之下沒有那麼重要,這裡暫且略去。    

由于采用滑動視窗的方式需要在不同大小的圖像上的每一個位置進行人臉和非人臉視窗的判别,而對于一張大小僅為480*320的輸入圖像,視窗總數就已經高達數十萬,面對如此龐大的輸入規模,如果對單個視窗進行特征提取和分類的速度不夠快,就很容易使得整個檢測過程産生巨大的時間開銷,也确實就因為如此,早期所設計的人臉檢測器處理速度都非常慢,一張圖像甚至需要耗費數秒才能處理完成——視訊的播放速度通常為每秒25幀圖像,這給人臉檢測投入現實應用帶來了嚴重的障礙。

人臉檢測技術的突破:vj人臉檢測器及其發展    

人臉檢測技術的突破發生在2001年,兩位傑出的科研工作者paul viola和michael jones設計了出了一個快速而準确的人臉檢測器:在獲得相同甚至更好準确度的同時,速度提升了幾十上百倍——在當時的硬體條件下達到了每秒處理15張圖像的速度,已經接近實時速度25fps(即25幀每秒)。這不僅是人臉檢測技術發展的一個裡程碑,也标志着計算機視覺領域的研究成果開始具備投入實際應用的能力。為了紀念這一工作,人們将這個人臉檢測器用兩位科研工作者的名字命名,稱之為viola-jones人臉檢測器,或者簡稱為vj人臉檢測器。    

vj人臉檢測之是以器能夠獲得成功,極大地提高人臉檢測速度,其中有三個關鍵要素:特征的快速計算方法——積分圖,有效的分類器學習方法——adaboost,以及高效的分類政策——級聯結構的設計。vj人臉檢測器采用haar特征來描述每個視窗,所謂haar特征,其實就是在視窗的某個位置取一個矩形的小塊,然後将這個矩形小塊劃分為黑色和白色兩部分,并分别對兩部分所覆寫的像素點(圖像上的每個點稱為一個像素)的灰階值求和,最後用白色部分像素點灰階值的和減去黑色部分像素點灰階值的和,得到一個haar特征的值。    

人臉檢測發展:從VJ到深度學習(上)

haar特征反映了局部區域之間的相對明暗關系,能夠為人臉和非人臉的區分提供有效的資訊,例如眼睛區域比周圍的皮膚區域要暗,通過haar特征就可以将這一特點表示出來。但是由于提取haar特征時每次都需要計算局部區域内多個像素點灰階值之和,是以在速度上其并不快,為此vj人臉檢測器引入了積分圖來加速haar特征的提取。    

積分圖是一張和輸入圖像一樣大的圖,但其每個點上不再是存放這個點的灰階值,而是存放從圖像左上角到該點所确定的矩形區域内全部點的灰階值之和。    

人臉檢測發展:從VJ到深度學習(上)

積分圖所帶來的好處是兩方面的,一方面它使得每次計算局部區域像素點的灰階值之和僅需要做4次加減法,與局部區域的大小無關;另一方面它避免了在相同像素點上重複求和,隻在最開始計算一次——相鄰的視窗有很大的重疊部分,對應的haar特征也會重疊,如果每次都重新計算像素點的灰階值之和,則重疊部分的計算是重複的。積分圖極大地加速了haar特征的提取,向快速的檢測器邁出了第一步。   

除了特征提取,分類過程的速度對于檢測的速度也至關重要。分類的速度取決于分類器的複雜程度,也即從特征向量變換到類别标簽的計算過程的複雜程度。複雜的分類器往往具有更強的分類能力,能夠獲得更好的分類準确度,但是分類時的計算代價比較高,而簡單的分類器雖然計算代價小,但是分類準确度也較低。那麼有沒有兼顧計算代價和分類準确度兩方面的辦法呢?當然有,這就是adaboost方法。希望計算代價小,是以隻用簡單的分類器,但是又希望分類準确度高,于是把多個簡單的分類器組合起來——聚弱為強,将多個弱分類器組合成一個強分類器,這就是adaboost方法的核心理念。通過adaboost方法來學習分類器,達到了以更小的計算代價換取同樣的分類準确度的目的。    

造成人臉檢測速度慢的根本原因還在于輸入規模過大,動辄需要處理幾十上百萬的視窗,如果這樣的輸入規模是不可避免的,那麼有沒有可能在處理的過程中盡快降低輸入規模呢?如果能夠通過粗略地觀察快速排除掉大部分視窗,隻剩下少部分視窗需要進行仔細的判别,則總體的時間開銷也會極大地降低。從這樣的想法出發,vj人臉檢測器采用了一種級聯結構來達到逐漸降低輸入規模的目的。   

人臉檢測發展:從VJ到深度學習(上)

具體說來,vj人臉檢測器将多個分類器級聯在一起,從前往後,分類器的複雜程度和計算代價逐漸增大,對于給定的一個視窗,先由排在最前面也最簡單的分類器對其進行分類,如果這個視窗被分為非人臉視窗,那麼就不再送到後面的分類器進行分類,直接排除,否則就送到下一級分類器繼續進行判别,直到其被排除,或者被所有的分類器都分為人臉視窗。這樣設計的好處是顯而易見的,每經過一級分類器,下一級分類器所需要判别的視窗就會減少,使得隻需要付出非常少的計算代價就能夠排除大部分非人臉視窗。從另一個角度來看,這實際上也是根據一個視窗分類的難度動态地調整了分類器的複雜程度,這顯然比所有的視窗都用一樣的分類器要更加高效。    

vj人臉檢測器通過積分圖、adaboost方法和級聯結構取得的巨大成功對後續的人臉檢測技術研究産生了深遠的影響,大量的科研工作者開始基于vj人臉檢測器進行改進,這些改進也分别覆寫了vj人臉檢測器的三個關鍵要素。

特征的改進和變遷    

雖然haar特征已經能夠刻畫人臉的一些特點,但是相比于人臉複雜的變化模式,vj人臉檢測器所采用的5種haar特征還是過于簡單。光考慮姿态上的變化,人臉可能是斜着的(平面内旋轉),也可能是仰着的或者側着的(平面外旋轉),同一個haar特征在不同姿态的人臉上差異可能非常大,而同時又可能和非人臉區域上的特征更相近,這就很容易在分類的時候引起誤判。于是人們開始對haar特征進行擴充,使得其能夠刻畫更加豐富的變化模式:   

1. 環形的黑白區域劃分模式,而不僅僅是上下或者左右型;

2. 旋轉的haar的特征,即将原來提取haar特征的局部小塊順時針或逆時針旋轉45度;   

3. 分離的haar特征,即允許一個haar特征由多個互相分離的黑白區域來計算,而不要求黑白區域必須處于一個矩形小塊中;   

4. 對角型haar特征;    

5. 組合haar特征,即對多個不同的haar特征進行組合和二值編碼;    

6. 局部組合二值特征,即在局部對特定的haar特征按照一定的結構進行組合和二值編碼;    

7. 帶權多通道haar特征,即一個haar特征不再隻包含黑白兩種塊,而允許有多種不同形狀和不同顔色的塊,其中不同的顔色對應着不同的權值,表示像素點上求和之後所占的比重——原來隻有1和-1兩種,多通道指的是在像素點上求和不僅僅是在灰階這一個通道上計算,而是同時在其它通道上計算(如rgb三個顔色通道;事實上,基于原圖計算而來和原圖同樣大小的任何一張圖都可以是圖像的一個通道)。    

這些擴充極大地增強了haar特征的表達能力,使得人臉視窗和非人臉視窗之間具有更好的區分性,進而提高了分類的準确度。    

人臉檢測發展:從VJ到深度學習(上)

除了直接對haar特征進行改進,人們也同時在設計和嘗試其它特征。haar特征本質上是局部區域像素值的一種線性組合,其相對應的更一般的形式則是不指定線性組合的系數,允許系數為任意實數,這被稱之為線性特征——這裡的組合系數可以基于訓練樣例來進行學習,類似于學習分類器參數的過程。稀疏粒度特征也是一種基于線性組合來構造的特征,與線性特征所不同的是,稀疏粒度特征是将不同尺度(将100*100的圖像放大到200*200,它和原本大小就為200*200的圖像是處于不同的尺度上)、位置和大小的局部區域進行組合,而線性特征隻是組合同一個局部區域内的像素值。    

lbp特征是一種二值編碼特征,其直接基于像素灰階值進行計算,特點是在編碼時考慮的是兩個值的相對大小,并且按照一定的空間結構來進行編碼,局部組合二值特征就是在lbp特征的啟發下設計的;從計算上來看,提取lbp特征比提取haar特征要快,但是haar特征對于人臉和非人臉視窗的區分能力更勝一籌。簡化的surf特征是一種和haar特征相類似的特征,但是其計算的是局部區域中像素點的梯度和,并在求和的過程中考慮了梯度方向(所謂梯度,最簡單的一種情形就是指同一行上兩個不同位置像素值的差比上它們水準坐标的差);surf特征比haar特征更為複雜,是以計算代價更高,但是由于其表達能力更強,是以能夠以更少數目的特征來達到相同的區分度,在一定程度上彌補了其在速度上的不足。hog特征也是一種基于梯度的特征,其對一個局部區域内不同方向的梯度進行統計,計算梯度直方圖來表示這個區域。積分通道特征和多通道的haar特征有些類似,但是其使用的通道更加多樣化,将通道的概念推廣為由原圖像變換而來并且空間結構和原圖像對應的任何圖像。聚合通道特征則在積分通道特征的基礎上進一步加入了對每個通道進行下采樣的操作,實作局部區域資訊的聚合。    

在過去十幾年的探索過程中,湧現出的特征不勝枚舉,這裡隻選取了部分比較有代表性和反映了人們探索思路的特征進行舉例。這裡所有列舉的特征都有一個共同的特點:都由科研工作者根據自己的經驗手工設計,這些特征的設計反映了人們對問題的了解和思考。雖然随着不斷的改進,設計出的特征已經日臻完善,但直到現在,人們在特征上的探索還遠沒有結束。

分類器及其學習方法的改進    

分類器能力的強弱直接決定了分類準确度的高低,而分類的計算代價是影響檢測速度的一個關鍵因素,是以,人們探索的另一個方向就是對分類器及其學習方法的改進。    

采用adaboost方法由弱分類器建構強分類器,這是一個順序執行的過程,換言之,一旦一個弱分類器被選中,其就必定會成為強分類器的組成部分,不允許反悔,這其實是假設增加弱分類器一定會使得強分類器的分類準确度更高,但是,這個假設并不總是成立。事實上,每次對弱分類器的選擇隻是依照當時的情況決定,而随着新的弱分類器被增加進來,從整體上來看,之前的選擇未必最優。基于這樣的想法,出現了允許回溯的floatboost方法。floatboost方法在選擇新的弱分類器的同時,也會重新考查原有的弱分類器,如果去掉某個弱分類器之後強分類器的分類準确度得到了提升,那說明這個弱分類器帶來了負面影響,應該被剔除。    

vj人臉檢測器中,相級聯的多個分類器在學習的過程中并不會産生直接的聯系,其關聯僅展現在訓練樣例上:後一級分類器的訓練樣例一定要先通過前一級分類器。不同分類器在學習時的獨立性會帶來兩方面的壞處:一是在每個分類器都是從頭開始學習,不能借鑒之前已經學習好的分類器的經驗;二是每個分類器在分類時都隻能依靠自己,不能利用其它分類器已經獲得的資訊。為此,出現了兩種改進的方案:鍊式boosting方法和嵌套式boosting方法。兩種方案都在學習新一級的分類器時,都考慮之前已經學好的分類器,差別在于鍊式boosting方法直接将前面各級分類器的輸出進行累加,作為基礎得分,新分類器的輸出則作為附加得分,換言之,前面各級分類器實際上是新分類器的一個“字首”,所有的分類器通過這種方式鍊在了一起;嵌套式boosting方法則直接将前一級分類器的輸出作為新分類器第一個弱分類器的特征,形成一種嵌套的關系,其特點是隻有相鄰的分類器才會互相影響。還有一種和嵌套式boosting方法相類似的方案:特征繼承,即從特征而不是分類器的角度來關聯不同的分類器,具體而言,新的分類器在學習時會先繼承前一級分類器的所有特征,基于這些特征學習弱分類器,再此基礎上再考慮增加新的弱分類器,這一方案的特點在于其隻引入了分類器學習時的互相影響,而在分類時分類器之間仍然是互相獨立的。    

相關的任務之間往往會互相産生促進作用,相輔相成,而和人臉檢測密切相關的一個任務就是特征點定位:預測臉部關鍵點的位置,這些關鍵點可以是雙眼中心、鼻尖、嘴角等。基于這樣一種想法,在2014年出現了joint cascade,即把檢測人臉所需要的分類器和預測特征點位置的回歸器交替級聯,同時進行人臉檢測和特征點定位兩個任務。用特征點定位輔助人臉檢測的關鍵在于形狀索引特征的引入,即特征不再是在整個視窗中提取,而是在以各個特征點為中心的局部區域進行提取,這樣的好處就在于提高了特征的語義一緻性。不同的人臉其對應的特征點位置是不同的,反過來看,也就是說相同的位置實際上對應于臉部的不同區域,那麼在相同區域提取的特征實際上表示的是不同的語義,簡單地說,就是在拿鼻子去和嘴巴比對。采用形狀索引特征可以很好地避免這個問題,進而增大人臉和非人臉視窗之間的區分性。對于一個給定的視窗,我們并不知道特征點的位置,是以采用一個“平均位置”作為初始位置,即基于标注有特征點坐标的人臉樣例集,計算出的每個點坐标的平均值;在平均位置的基礎上,我們提取特征預測各個特征點真實的位置,不過一次預測往往是不準确的,就好像跑步的時候我們沒法直接從起點跳到終點一樣,是以需要不斷基于目前确定的特征點位置來預測新的位置,逐漸向其真實的位置靠近。這個過程很自然地形成了一種級聯結構,進而能夠和人臉檢測器耦合在一起,形成一種不同模型交替級聯的形式。

針對分類器學習過程中的每一個環節,人們都進行了細緻而充分的探索,除了上面提到的幾個方向,在分類器分類門檻值的學習、提升分類器學習的速度等問題上,也出現了很多出色的研究工作。大部分在分類器及其學習方法上進行改進的工作關注的還是boosting方法(adaboost方法是boosting方法的一個傑出代表)和相對簡單的分類器形式,如果能夠引入具有更強分類能力的分類器,相信能給檢測器帶來進一步的性能提升,這一點在後文會有所涉及。

級聯結構的演化    

分類器的組織結構也是人們關心的一個重要問題,尤其是在面臨多姿态人臉檢測任務的時候。人臉的姿态是指人臉在三維空間中繞三個坐标軸旋轉的角度,而多姿态人臉檢測就是要将帶旋轉的人臉給檢測出來,不管是斜着的(繞x軸旋轉)、仰着的(繞y軸旋轉)還是側着的(繞z軸旋轉)。不同姿态的人臉在表觀特征上存在很大的差異,這給檢測器帶來了非常大的挑戰,為了解決這一問題,通常采用分治的政策,即分别針對不同姿态的人臉單獨訓練分類器,然後組合起來建構成多姿态人臉檢測器。    

最簡單的多姿态人臉檢測器就是将針對不同姿态人臉的分類器采用并列式的結構進行組織,其中并列的每一個分類器仍然采用原來的級聯結構(我們稱這種分類器為級聯分類器);在檢測人臉的過程中,一個視窗如果被其中一個級聯分類器分為人臉視窗,則認為其确實是一個人臉視窗,而隻有當每一個級聯分類器都将其判别為非人臉視窗時,才将其排除掉。這種并列式的組織架構存在兩方面的缺陷:一是造成了檢測時間的成倍增長,因為絕大部分視窗是非人臉視窗,這些視窗需要經過每一個級聯分類器的排除;二是容易造成整體分類準确度的降低,因為整個檢測器分錯的視窗包含的是所有級聯分類器分錯的視窗。    

有人設計了一種金字塔式的級聯結構,金字塔的每一層對應于對人臉姿态(旋轉角度)的一個劃分,從頂層到底層劃分越來越細,級聯的每個分類器隻負責區分非人臉和某個角度範圍内的人臉。對于一個待分類的視窗,從最頂層的分類器開始對其進行分類,如果其被分為人臉視窗,則送入到下一層的第一個分類器繼續進行分類,如果其被分為非人臉視窗,則送入到同一層的下一個分類器繼續進行分類,當在某一層上所有的分類器都将其分為非人臉視窗時,就确認其為非人臉視窗,将其排除。金字塔式的級聯結構也可以看成是一種特殊的并列式結構,隻不過每個級聯分類器互相之間有共享的部分,這樣最直接的好處就在于減少了計算量,共享的部分隻需要計算一次,同時在底層又保留了分治政策所帶來的好處——子問題比原問題更加容易,是以更容易學習到分類準确度更高的分類器。    

人臉檢測發展:從VJ到深度學習(上)

還有一種比較典型的結構是樹形的級聯結構,從形狀上來看其和金字塔式的級聯結構是一樣的,也是從上往下分類器的數目逐層增多,差別就在于樹形的級聯結構中沒有同一層分類器之間的橫向連接配接,隻有相鄰層分類器之間的縱向連接配接,即一個視窗在同一層上不會由多個分類器進行分類,而會直接被送往下一層或者被排除。樹形級聯結構通過引入分支跳轉機制,進一步減少了對一個視窗進行分類所需要的計算量,不過同時也帶來了新的問題,分支跳轉通常根據姿态估計(估計旋轉角度的範圍)的結果來進行,而如果姿态估計出現錯誤,就會出現某個姿态的人臉視窗被送給另一個姿态人臉對應的分類器進行分類的情況,容易導緻錯誤的分類。為了緩解這一問題,出現了允許多個分支同時跳轉的設計,進而降低了由于跳轉錯誤而引起分類錯誤的風險。    

分治政策是處理多姿态人臉檢測任務最基本的政策,但要同時兼顧速度和分類準确度并不是一件容易的事情,分類能力的增強不可避免地會帶來計算代價的增大,如何用更小的計算代價來換取更高的分類準确度,這仍然是一個需要去思考和探索的問題。

人臉檢測器的比拼    

在不斷對人臉檢測器進行改進的過程中,有一個問題是不容忽視的:如何科學地比較兩個人臉檢測器的優劣?簡單地說,出一套考題讓所有的檢測器進行一場考試,誰得分高誰就更好。對于人臉檢測器而言,所謂考題(測試集)就是一個圖像集合,通常其中每張圖像上都包含至少一張人臉,并且這些人臉的位置和大小都已經标注好。關于得分,需要考慮檢測器兩方面的表現,一是檢測率,也即對人臉的召回率,檢測出來的人臉占總人臉的比例——測試集中一共标注了100張人臉,檢測器檢測出其中70張人臉,則檢測率為70%;二是誤檢(也稱為虛警)數目,即檢測器檢測出來的人臉中出現錯誤(實際上不是人臉)的數目——檢測器一共檢測出80張人臉,然而其中有10個錯誤,隻有70個是真正的人臉,那麼誤檢數目就是10。在這兩個名額上,我們所希望的總是檢測率盡可能高,而誤檢數目盡可能少,但這兩個目标之間一般是存在沖突的;在極端的情況下,如果一張臉也沒有檢測出來,那麼誤檢數目為0,但是檢測率也為0,而如果把所有的視窗都判别為人臉視窗,那麼檢測率為100%,而誤檢數目也達到了最大。在比較兩個檢測器的時候,我們通常固定一個名額,然後對比另一個名額,要麼看相同誤檢數目時誰的檢測率高,要麼看相同檢測率時誰的誤檢少。    

對于每一個檢測出的人臉,檢測器都會給出這個檢測結果的得分(或者說信度),那麼如果人為地引入一個門檻值來對檢測結果進行篩選(隻保留得分大于門檻值得檢測結果),那麼随着這個門檻值的變化,最終得檢測結果也會不同,因而其對應得檢測率和誤檢數目通常也會不同。通過變換門檻值,我們就能夠得到多組檢測率和誤檢數目的值,由此我們可以在平面直角坐标系中畫出一條曲線來:以x坐标表示誤檢數目,以y坐标表示檢測率,這樣畫出來的曲線稱之為roc曲線(不同地方中文譯法不一,如接收機曲線、接收者操作特征曲線等,這裡直接采用英文簡寫)。roc曲線提供了一種非常直覺的比較不同人臉檢測器的方式,得到了廣泛的使用。    

評測人臉檢測器時還有一個重要的問題:怎麼根據對人臉的标注和檢測結果來判斷某張人臉是否被檢測到了?一般來說,檢測器給出的檢測框(即人臉視窗)不會和标注的人臉邊框完全一緻,而且對人臉的标注也不一定是矩形,例如還可能是橢圓形;是以當給定了一個檢測框和一個标注框時,我們還需要一個名額來界定檢測框是否和标注框相比對,這個名額就是交并比:兩者交集(重疊部分)所覆寫的面積占兩者并集所覆寫面積的比例,一般情況下,當檢測框和标注框的交并比大于0.5時,我們認為這個檢測框是一個正确檢測的人臉。    

在早期的人臉檢測工作中,一般采用mit-cmu人臉檢測資料集作為人臉檢測器的測試集,來比較不同的檢測器。這個測試集隻包含幾百張帶有人臉的圖像,并且人臉主要是清晰且不帶遮擋的正面人臉,因而是一個相對簡單的測試集,現在幾乎已經不再使用。在2010年,美國麻省大學的一個實驗室推出了一個新的人臉檢測評測資料集:fddb,這個集合共包含2845張帶有人臉的網際網路新聞圖像,一共标注了5171張人臉,其中的人臉在姿态、表情、光照、清晰度、分辨率、遮擋程度等各個方面都存在非常大的多樣性,貼近真實的應用場景,因而是一個非常具有挑戰性的測試集。fddb的推出激發人們在人臉檢測任務上的研究熱情,極大地促進了人臉檢測技術的發展,在此後的幾年間,新的人臉檢測方法不斷湧現,檢測器在fddb上的表現穩步提高。從100個誤檢時的檢測率來看,從最初vj人臉檢測器的30%,發展到現在已經超過了90%——這意味着檢測器每檢測出50張人臉才會産生一個誤檢,這其中的進步是非常驚人的,而檢測器之間的比拼還在繼續。

本文作者:深度學習大講堂

繼續閱讀