1. 程式人生 > >機器學習:人臉識別概述

機器學習:人臉識別概述

https://mp.weixin.qq.com/s/a4aPycxfIe_qNIP_vrIZ5w

一、人臉檢測演算法要解決以下幾個核心問題:

  • 人臉可能出現在影象中的任何一個位置

  •  人臉可能有不同的大小

  •  人臉在影象中可能有不同的視角和姿態

  • 人臉可能部分被遮擋

評價一個人臉檢測演算法好壞的指標是檢測率和誤報率。我們將檢測率定義為:

演算法要在檢測率和誤報率之間做平衡,理想的情況是有高檢測率,低誤報率。

經典的人臉檢測演算法流程是這樣的:用大量的人臉和非人臉樣本影象進行訓練,得到一個解決2類分類問題的分類器,也稱為人臉檢測模板。這個分類器接受固定大小的輸入圖片,判斷這個輸入圖片是否為人臉,即解決是和否的問題。人臉二分類器的原理如下圖所示:

由於人臉可能出現在影象的任何位置,在檢測時用固定大小的視窗對影象從上到下、從左到右掃描,判斷窗口裡的子影象是否為人臉,這稱為滑動視窗技術(sliding window)。為了檢測不同大小的人臉,還需要對影象進行放大或者縮小構造影象金字塔,對每張縮放後的影象都用上面的方法進行掃描。由於採用了滑動視窗掃描技術,並且要對影象進行反覆縮放然後掃描,因此整個檢測過程會非常耗時。

由於一個人臉附件可能會檢測出多個候選位置框,還需要將檢測結果進行合併去重,這稱為非極大值抑制(NMS)。多尺度滑動視窗技術的原理如下圖所示:

典型應用


人臉檢測是機器視覺領域被深入研究的經典問題,在安防監控、人證比對、人機互動、社交等領域都有重要的應用價值。數碼相機、智慧手機等端上的裝置已經大量使用人臉檢測技術實現成像時對人臉的對焦、圖集整理分類等功能,各種虛擬美顏相機也需要人臉檢測技術定位人臉,然後才能根據人臉對齊的技術確定人臉面板、五官的範圍然後進行美顏。在

人臉識別的流程中,人臉檢測是整個人臉識別演算法的第一步。

早期演算法


我們將整個人臉檢測演算法分為3個階段,分別是早期演算法AdaBoost框架,以及深度學習時代,在接下來將分這幾部分進行介紹。

早期的人臉檢測演算法使用了模板匹配技術,即用一個人臉模板影象與被檢測影象中的各個位置進行匹配,確定這個位置處是否有人臉;此後機器學習演算法被用於該問題,包括神經網路,支援向量機等。以上都是針對影象中某個區域進行人臉-非人臉二分類的判別。

早期有代表性的成果是Rowley等人提出的方法[1][2]。他們用神經網路進行人臉檢測,用20x20的人臉和非人臉影象訓練了一個多層感知器模型。文獻[1]的方法用於解決近似正面的人臉檢測問題,原理如下圖所示:

文獻[2]的方法解決多角度人臉檢測問題,整個系統由兩個神經網路構成,第一個網路用於估計人臉的角度,第二個用於判斷是否為人臉。角度估計器輸出一個旋轉角度,然後用整個角度對檢測窗進行旋轉,然後用第二個網路對旋轉後的影象進行判斷,確定是否為人臉。系統結構如下圖所示:

 

Rowley的方法有不錯的精度,由於分類器的設計相對複雜而且採用的是密集滑動視窗進行取樣分類導致其速度太慢。

AdaBoost框架


接下來介紹AdaBoost框架之後的方法,boost演算法是基於PAC學習理論(probably approximately correct)而建立的一套整合學習演算法(ensemble learning)。其根本思想在於通過多個簡單的弱分類器,構建出準確率很高的強分類器,PAC學習理論證實了這一方法的可行性,感謝大神Leslie-Valiant!!我們首先來看FDDB上各種檢測演算法的ROC曲線,接下來的介紹將按照這些ROC曲線上的演算法進行展開。

在2001年Viola和Jones設計了一種人臉檢測演算法[10]。它使用簡單的Haar-like特徵級聯的AdaBoost分類器構造檢測器,檢測速度較之前的方法有2個數量級的提高,並且保持了很好的精度,我們稱這種方法為VJ框架。VJ框架是人臉檢測歷史上第一個最具有里程碑意義的一個成果,奠定了基於AdaBoost目標檢測框架的基礎,所以作為重點和大家嘮嘮。

用級聯AdaBoost分類器進行目標檢測的思想是:用多個AdaBoost分類器合作完成對候選框的分類,這些分類器組成一個流水線,對滑動視窗中的候選框影象進行判定,確定它是人臉還是非人臉。

在這一系列AdaBoost分類器中,前面的強分類器設計很簡單,包含的弱分類器很少,可以快速排除掉大量的不是人臉的視窗,但也可能會把一些不是人臉的影象判定為人臉。如果一個候選框通過了第一級分類器的篩選即被判定為人臉,則送入下一級分類器中進行判定,以此類推。如果一個待檢測視窗通過了所有的強分類器,則認為是人臉,否則是非人臉。下圖是分類器級聯進行判斷的示意圖:

出於效能考慮,弱分類器使用了簡單的Haar-like特徵,這種特徵源自於小波分析中的Haar小波變換,Haar小波是最簡單的小波函式,用於對訊號進行均值、細節分解。這裡的Haar-like特徵定義為影象中相鄰矩形區域畫素之和的差值。下圖是基本Haar-like特徵的示意圖:

Haar-like特徵是白色矩形框內的畫素值之和,減去黑色區域內的畫素值之和。以影象中第一個特徵為例,它的計算方法如下:首先計算左邊白色矩形區域裡所有畫素值的和,接下來計算右邊黑色矩形區域內所有畫素的和,最後得到的Haar-like特徵值為左邊的和減右邊的和。

這種特徵捕捉影象的邊緣、變化等資訊,各種特徵描述在各個方向上的影象變化資訊人臉的五官有各自的亮度資訊,很符合Haar-like特徵的特點。

為了實現快速計算,使用了一種稱為積分圖(Integral Image)的機制。通過積分圖可以快速計算出影象中任何一個矩形區域的畫素之和,從而計算出各種型別的Haar-like特徵。假設有一張影象,其第i行第j列處的畫素值為,積分圖定義為:

即原始影象在任何一點處的左上角元素之和。在構造出積分圖之後,藉助於它可以快速計算出任何一個矩形區域內的畫素之和,以下圖中的矩形框為例:

在上圖中,要計算黑色矩形框內的畫素值之和。假設上面四個矩形的右下角的座標分別為

之所以這樣,是因為黑色區域內的畫素值之和等於這4個矩形框內的畫素值之和,減去上面兩個矩形框的畫素值之和,再減去左邊兩個矩形框的畫素值之和,這樣做的話,左上角的矩形框被減了兩遍,因此要加一遍回來。在計算出任何一個矩形區域的畫素值之和後,可以方便的計算出上面任何一種Haar-like特徵。下圖是通過AdaBoost演算法自動篩選出來的對區分人臉和非人臉有用的Haar-like特徵,基本符合人類的直觀感受:

弱分類器採用最簡單的深度很小的決策樹,甚至只有一個內部節點。決策樹的訓練演算法此處不做詳細的闡述,需要注意的是這裡的特徵向量是稀疏的,即每一棵決策樹只接受少量特徵分量的輸入,根據它們來做決策。

強分類器和前面講述的是一樣的,不同的是這裡的強分類器加上了一個調節閾值:

其中為閾值,它通過訓練得到。每一級強分類器在訓練時使用所有的人臉樣本作為正樣本,並用上一級強分類器對負樣本影象進行掃描,把找到的虛警中被判定為人臉的區域截取出來作為下一級強分類器的負樣本。

假設第i級強分類器的檢測率和誤報率分別為di 和fi,由於要通過了所有強分類器才被判定為正樣本,因此級聯分類器的誤報率為:

這個式子表明增加分類器的級數會降低檢測率。對於前者,可以理解為一個負樣本被每一級分類器都判定為正樣本的概率;對於後者,可以理解為一個正樣本被所有分類器都判定為正樣本的概率

在VJ演算法問世之後,較好的解決了近似正面人臉的檢測問題。此後出現了大量改進方案,在深度學習技術出現之前,一直是人臉檢測演算法的主流框架。這些方案的改進主要在以下幾個方面:

新的特徵,包括擴充套件的Haar特徵[4],ACF特徵[15]等,它們比標準的Haar-like特徵有更強的描述能力,同時計算成本也很低。

使用其他型別的AdaBoost分類器。VJ框架中採用的是離散型的AdaBoost演算法,除此之外,還有實數型,Logit型,Gentle型等各種方案。實數型、Logit型和Gentle型AdaBoost演算法不僅能輸出分類標籤值,還能給出置信度,有更高的精度。

分類器級聯結構,如Soft Cascade,將VJ方法的多個強分類器改成一個強分類器(該演算法後面會有介紹)。另外,檢測處於各種角度和姿態的人臉是研究另一個重點,VJ方法的分類器級聯只有一條路徑,是瀑布模型,改進的方案有樹狀級聯,金字塔級聯等,篇幅所限這裡不做過多解釋,各種級聯方案如下圖所示:

在深度學習出現以前工業界的方案都是基於VJ演算法。但VJ演算法仍存在一些問題:

  • Haar-like特徵是一種相對簡單的特徵,其穩定性較低;

  • 弱分類器採用簡單的決策樹,容易過擬合。因此,該演算法對於解決正面的 人臉效果好,對於人臉的遮擋,姿態,表情等特殊且複雜的情況,處理效果不理想(雖然有了一些改進方案,但還是不夠徹底!!)。

  • 基於VJ-cascade的分類器設計,進入下一個stage後,之前的資訊都丟棄了,分類器評價一個樣本不會基於它在之前stage的表現----這樣的分類器魯棒性差。

ACF[15](Aggregate Channel Features for Multi-view Face Detection)是一種為分類提供足夠多的特徵選擇的方法。在對原圖進行處理後,得到多通道的影象,這些通道可以是RGB的通道,可以是平滑濾波得到的,可以是x方向y方向的梯度圖等等。將這些通道合起來,在此基礎上提取特徵向量後續採用Soft-Cascade分類器進行分類。

相較於VJ-cascade的設計,Soft-Cascade採用幾個改進的方案:

  • 每個stage的決策函式不是二值而是標量值(scalar-valued) ,且與該樣本有多"容易"通過這個stage以及在這個stage的相對重要性成比例。

  • 生成的決策函式是需要通過之前每個階段的值而不單單是本階段來判定。

  • 文中把檢測器的執行時間-準確率權衡通過一個叫ROC surface的3維曲面清楚的展示出來,方便調節引數,可以明確的知道動了哪個引數會對這個檢測器的效能會有些什麼影響。

DMP模型


DPM(Deformable Part Model),正如其名稱所述,可變形的元件模型,是一種基於元件的檢測演算法,其所見即其意。該模型由Felzenszwalb在2008年提出,並發表了一系列的CVPR,NIPS會議。並且還拿下了2010年,PASCAL VOC的“終身成就獎”。

由於DPM演算法[16]本身是一種基於元件的檢測演算法,所以對扭曲,性別,多姿態,多角度等的人臉都具有非常好的檢測效果(人臉通常不會有大的形變,可以近似為剛體,基於DMP的方法可以很好地處理人臉檢測問題)。

DPM的方法採用的是FHOG進行特徵的提取,作者對HOG進行了很大的改動,沒有直接採用4*9=36維向量,而是對每個8x8的cell提取18+9+4=31維特徵向量。作者還討論了依據PCA(Principle Component Analysis)視覺化的結果選9+4維特徵,能達到HOG 4*9維特徵的效果。基於DPM的方法在戶外人臉集上都取得了比Viola-Jones更好的效果,但是由於該模型過於複雜,判斷時計算複雜,很難滿足實時性的要求。後續有了一些列改進的流程,比如加入級聯分類器,針對特徵計算採用了積分圖的方法等,但都還沒有達到VJ方法的效率。

DPM模型一個大的問題是速度太慢,因此在工程中很少使用,一般採用的是AdaBoost框架的演算法。

基於經典的人工設計特徵本身穩定性並不穩定,容易受外界環境的影響(光照、角度、遮擋等),所以在複雜場景下的人臉檢測效能很難的到保證,只能應用到受限的場景中。深度學習出現以後,DCNN(深度卷積神經網路)能很好的學習到影象中目標物各個層級的特徵,對外界的抗干擾能力更強,後序的人臉檢測方法基本都基於DCNN的特徵來優化了。

基於深度學習的方法在FDDB上基本飽和了,是時候丟擲一個新的benchmark了!!!WIDERFace測試集上各種演算法的效能:

深度學習框架


卷積神經網路在影象分類問題上取得成功之後很快被用於人臉檢測問題,在精度上大幅度超越之前的AdaBoost框架,當前已經有一些高精度、高效的演算法。直接用滑動視窗加捲積網路對視窗影象進行分類的方案計算量太大很難達到實時,使用卷積網路進行人臉檢測的方法採用各種手段解決或者避免這個問題。

  • Cascade CNN

Cascade CNN[17]可以認為是傳統技術和深度網路相結合的一個代表,和VJ人臉檢測器一樣,其包含了多個分類器,這些分類器採用級聯結構進行組織,然而不同的地方在於,Cascade CNN採用卷積網路作為每一級的分類器。

構建多尺度的人臉影象金字塔,12-net將密集的掃描這整幅影象(不同的尺寸),快速的剔除掉超過90%的檢測視窗,剩下來的檢測視窗送入12-calibration-net調整它的尺寸和位置,讓它更接近潛在的人臉影象的附近。

採用非極大值抑制(NMS)合併高度重疊的檢測視窗,保留下來的候選檢測視窗將會被歸一化到24x24作為24-net的輸入,這將進一步剔除掉剩下來的將近90%的檢測視窗。和之前的過程一樣,通過24-calibration-net矯正檢測視窗,並應用NMS進一步合併減少檢測視窗的數量。

將通過之前所有層級的檢測視窗對應的影象區域歸一化到48x48送入48-net進行分類得到進一步過濾的人臉候選視窗。然後利用NMS進行視窗合併,送入48-calibration-net矯正檢測視窗作為最後的輸出。

網路設計要點:

1.第一級12-net要儘量快,保證召回率的同時,過濾大量非人臉,在每一個尺度,使用NMS,recall達到99% 
2.第二級24-net的輸入為第一級檢測的樣本,首先與gt匹配,標定出正負樣本,然後分類,另外,第二級使用了多尺度,即將兩個stage的fc進行concate。同樣,在每一個尺度,使用NMS,recall達到97% 
3.第三級48-net網格稍微加深,過程同stage2,本次所有的尺度一塊使用NMS 
4.迴歸網路使用bounding box的方式 

 

12x12,24x24,48x48尺寸作為輸入的分類CNN網路結構,其中輸出為2類-人臉和非人臉。

Cascade CNN一定程度上解決了傳統方法在開放場景中對光照、角度等敏感的問題,但是該框架的第一級還是基於密集滑動視窗的方式進行視窗過濾,在高解析度存在大量小人臉(tiny face)的圖片上限制了演算法的效能上限。