雷鋒網按:本文作者VIPL_Face
區分不同的人是很多智能系統的必備能力。為實現此目的,一種可能的技術手段是通過對人臉的光學成像來感知人、識別人,即所謂的人臉識別技術。經過幾十年的研發積累,特別是近年來深度學習技術的湧現,人臉識別取得了長足的進步,在安防、金融、教育、社保等領域得到了越來越多的應用,成為計算機視覺領域最為成功的分支領域之一。
然而,人臉識別並非完全成熟的技術,離公眾期望的全面應用尚有距離,還需要學術界、工業界的共同努力。為此,整個人臉識別社區需要有基準(Baseline)系統,而且基準系統的水平顯然會極大影響著該領域的發展水平。可是令人尷尬的是,這個領域迄今尚無一套包括所有技術模塊的、完全開源的基準人臉識別系統!我們希望改變現狀,因此開源了SeetaFace人臉識別引擎。該引擎由中科院計算所山世光研究員帶領的人臉識別研究組研發。代碼基於C++實現,且不依賴於任何第三方的庫函數,開源協議為BSD-2,可供學術界和工業界免費使用。
SeetaFace人臉識別引擎包括了搭建一套全自動人臉識別系統所需的三個核心模塊,即:人臉檢測模塊(SeetaFace Detection)、面部特徵點定位模塊(SeetaFace Alignment)以及人臉特徵提取與比對模塊 (SeetaFace Identification)。
人臉檢測模塊SeetaFace Detection採用了一種結合傳統人造特徵與多層感知機(MLP)的級聯結構,在FDDB上達到了84.4%的召回率(100個誤檢時),並可在單個i7 CPU上實時處理VGA解析度的圖像。面部特徵點定位模塊SeetaFace Alignment通過級聯多個深度模型(棧式自編碼網絡)來回歸5個關鍵特徵點(兩眼中心、鼻尖和兩個嘴角)的位置,在AFLW資料庫上達到state-of-the-art的精度,定位速度在單個i7 CPU上超過200fps。人臉識別模塊SeetaFace Identification採用一個9層的卷積神經網絡(CNN)來提取人臉特徵,在LFW資料庫上達到97.1%的精度(註:採用SeetaFace人臉檢測和SeetaFace面部特徵點定位作為前端進行全自動識別的情況下),特徵提取速度為每圖120ms(在單個i7 CPU上)。
下面對上述三個模塊的情況做簡要介紹,更詳細的介紹請參考我們相應的學術論文。
人臉檢測模塊SeetaFace Detection
該模塊基於我們提出的一種結合經典級聯結構和多層神經網絡的人臉檢測方法實現,其所採用的漏鬥型級聯結構(Funnel-Structured Cascade,FuSt)專門針對多姿態人臉檢測而設計,其中引入了由粗到精的設計理念,兼顧了速度和精度的平衡。
如圖1所示,FuSt級聯結構在頂部由多個針對不同姿態的快速LAB級聯分類器構成,緊接著是若干個基於SURF特徵的多層感知機(MLP)級聯結構,最後由一個統一的MLP級聯結構(同樣基於SURF特徵)來處理所有姿態的候選窗口,整體上呈現出上寬下窄的漏鬥形狀。從上往下,各個層次上的分類器及其所採用的特徵逐步變得複雜,從而可以保留人臉窗口並排除越來越難與人臉區分的非人臉候選窗口。
圖1. SeetaFace人臉檢測模塊所採用的FuSt漏鬥型級聯結構
與SeetaFace Detection開原始碼配套開放的是一個準正面人臉檢測模型(使用了約20萬人臉圖像訓練而來),可以實現準正面人臉的準確檢測(旋轉角度約45度以內,但對於姿態偏轉較大的人臉也具備一定的檢測能力)。圖2給出了一些檢測結果的示例(註:測試時圖像金字塔下採樣比例設置為0.8,滑動步長設置為4和2,最小人臉設置為20x20)。在人臉檢測領域最重要的評測集FDDB上對SeetaFace Detector進行評測,在輸出100個誤檢時(FPPI=0.035)召回率達到84.4%,輸出1000個誤檢時召回率達到88.0%。
圖2. SeetaFace Detection人臉檢測結果的示例
圖3則給出了SeetaFace Detector在FDDB上的離散型得分ROC曲線,並與其它已發表的學術界公開結果(從FDDB官網獲得)進行了對比。不難看出,儘管SeetaFace人臉檢測器並非目前精度最高的,但在學術界公開的結果中仍然具有很強的競爭力,而且可以完全滿足多數人臉識別系統的需求。
圖3. SeetaFace Detector在FDDB上的ROC曲線
此外,與其他算法相比,SeetaFace Detector在速度上有一定優勢。對於640x480大小的VGA圖像,檢測速度的對比情況如表1所示。其中,SeetaFace的速度在單個3.40GHz的i7-3770 CPU上測得,Cascade CNN在CPU上的速度在2.0GHz的CPU上測得(引自原文)。而各方法在GPU上的速度在NVIDIA Titan Black GPU上測得。
特徵點定位模塊SeetaFace Alignment
面部特徵點定位(人臉對齊)在人臉識別、表情識別、人臉動畫合成等諸多人臉分析任務中扮演著非常重要的角色。由於姿態、表情、光照和遮擋等因素的影響,真實場景下的人臉對齊任務是一個非常困難的問題。形式上,該問題可以看作是從人臉表觀到人臉形狀的複雜非線性映射。為此,SeetaFace Alignment採用的是我們提出的一種由粗到精的自編碼器網絡(Coarse-to-Fine Auto-encoder Networks, CFAN)來求解這個複雜的非線性映射過程。
如圖 4所示,CFAN級聯了多級棧式自編碼器網絡,其中的每一級都刻畫從人臉表觀到人臉形狀的部分非線性映射。具體來說,輸入一個人臉區域(由人臉檢測模塊得到),第一級自編碼器網絡直接從該人臉的低解析度版本中快速估計大致的人臉形狀S0。然後,提高輸入人臉圖像的解析度,並抽取當前人臉形狀S0(相應提升解析度)各特徵點位置的局部特徵,輸入到下一級自編碼器網絡來進一步優化人臉對齊結果。以此類推,通過級聯多個棧式自編碼器網絡,在越來越高解析度的人臉圖像上逐步優化人臉對齊結果。
圖4. 基於由粗到精自編碼器網絡(CFAN)的實時人臉對齊方法
此次開源的SeetaFace Alignment基於上述CFAN方法實現了5個面部關鍵特徵點(兩眼中心,鼻尖和兩個嘴角)的精確定位,訓練集包括23,000餘幅人臉圖像(標註了5點)。需要注意的是,為加速之目的,在基本不損失精度的情況下,開源實現中將CFAN級聯的數目減少到了2級,從而可在單顆Intel i7-3770 (3.4 GHz CPU)上達到每個人臉5ms的處理速度(不包括人臉檢測時間)。
圖5給出了一些用SeetaFace Alignment開源引擎定位面部5點的效果示例,可見其對表情、姿態、膚色等均具有較好的魯棒性。在AFLW數據集上的量化評價和對比情況如圖6所示,其中平均定位誤差根據兩眼中心距離做了歸一化。不難看出,SeetaFace Alignment取得了state-of-the-art的定位結果。
圖5. SeetaFace Alignment定位結果示例
圖6. SeetaFace Alignment在AFLW數據集上的定位誤差及對比情況其中LE:左眼,RE:右眼,N:鼻尖,LM:左嘴角,RM:右嘴角
人臉特徵提取與比對模塊SeetaFace Identification
人臉識別本質上是要計算兩幅圖像中人臉的相似程度,其一為註冊階段(類比人的相識過程)輸入系統的,另一幅為識別階段(即再見時的辨認過程)的輸入。為此,如圖7所示,一套全自動的人臉識別系統在完成前述的人臉檢測與人臉對齊兩個步驟之後,即進入第三個核心步驟:人臉特徵提取和比對。這個階段也是深度學習風起雲湧之後進步最大的模塊,目前大多數優秀的人臉識別算法均採用卷積神經網絡(CNN)來學習特徵提取器(即圖7中的函數F)。
圖7.人臉識別系統的核心流程
SeetaFace開源的人臉特徵提取模塊也是基於卷積神經網絡的。具體地說,其實現的是深度卷積神經網絡VIPLFaceNet:一個包含7個卷積層與2個全連接層的DCNN。其直接修改自Hinton教授的學生Alex Krizhevsky等於2012年設計的AlexNet(即引爆CNN在視覺中廣泛應用的網絡)。
如表2對比所示,與AlexNet相比,VIPLFaceNet將5x5的卷積核拆分為兩層3x3的卷積核,從而增加了網絡深度,而並沒有增加計算量;VIPLFaceNet還減少了每個卷積層的kernel數目以及FC2層的節點數。同時,通過引入Fast Normalization Layer(FNL),加速了VIPLFaceNet的收斂速度,並在一定程度上提升了模型的泛化能力。測試表明,在相同訓練集情況下,VIPLFaceNet在LFW測試集上識別錯誤率比AlexNet降低了40%,而訓練和測試時間分別為AlexNet的20%和60%。
與開源的SeetaFace Identification代碼一起發布的人臉識別模型是使用140萬人臉圖像訓練出來的,這些訓練圖像來自於約1.6萬人,其中既有東方人也有西方人。人臉特徵直接採用VIPLFaceNet FC2層的2048個結點的輸出,特徵比對可簡單採用Cosine計算相似度,然後進行閾值比較(驗證應用)或排序(識別應用)即可。
該引擎在多數人臉識別場景下均具有良好的性能,例如,在LFW standard Image-Restricted測試協議下,使用SeetaFace Detector與SeetaFace Alignment檢測並對齊人臉,採用SeetaFace Identification進行特徵提取和比對,可以達到97.1%的識別正確率(請注意:這是系統全自動運行的結果,對少量不能檢到人臉的圖像,截取中間區域輸入人臉對齊模塊即可)。速度方面,在單顆Intel i7-3770 CPU上,開原始碼提取一張人臉之特徵的時間約為120ms(不含人臉檢測和特徵點定位時間)。
開源網址
目前,SeetaFace開源人臉識別引擎已全部發布在Github上供國內外同行和工業界使用,項目網址為:https://github.com/seetaface/SeetaFaceEngine
雷鋒網註:本文由深度學習大講堂授權雷鋒網發布,如需轉載請註明作者和出處,不得刪減內容。