使用OpenFace進行人臉識別(1)


http://www.chinacloud.cn/show.aspx?id=25992&cid=12

 

本文中,筆者將介紹OpenFace中實現人臉識別的pipeline,這個pipeline可以看做是使用深度卷積網絡處理人臉問題的一個基本框架,很有學習價值,它的結構如下圖所示:

  

圖片描述

 

  Input Image -> Detect

  輸入:原始的可能含有人臉的圖像。

  輸出:人臉位置的bounding box。

  這一步一般我們稱之為“人臉檢測”(Face Detection),在OpenFace中,使用的是dlib、OpenCV現有的人臉檢測方法。此方法與深度學習無關,使用的特征是傳統計算機視覺中的方法(一般是Hog、Haar等特征)。

  對人臉檢測這一步感興趣的可以參考下列資料:

  dlib的實現:http://blog.dlib.net/2014/02/dlib-186-released-make-your-own-object.html

  openCV的實現:Face Detection using Haar Cascades

  Detect -> Transform -> Crop

  輸入:原始圖像 + 人臉位置bounding box

  輸出:“校准”過的只含有人臉的圖像

  對於輸入的原始圖像 + bounding box,這一步要做的事情就是要檢測人臉中的關鍵點,然后根據這些關鍵點對人臉做對齊校准。所謂關鍵點,就是下圖所示的綠色的點,通常是眼角的位置、鼻子的位置、臉的輪廓點等等。有了這些關鍵點后,我們就可以把人臉“校准”,或者說是“對齊”。解釋就是原先人臉可能比較歪,這里根據關鍵點,使用仿射變換將人臉統一“擺正”,盡量去消除姿勢不同帶來的誤差。這一步我們一般叫Face Alignment。

  

圖片描述

 

  在OpenFace中,這一步同樣使用的是傳統方法,特點是比較快,對應的論文是:

  One Millisecond Face Alignment with an Ensemble of Regression Trees

  Crop -> Representation

  輸入:校准后的單張人臉圖像

  輸出:一個向量表示。

  這一步就是使用深度卷積網絡,將輸入的人臉圖像,轉換成一個向量的表示。在OpenFace中使用的向量是128x1的,也就是一個128維的向量。

  我們可以先看一下VGG16的模型:

  

圖片描述

 

  VGG16是深度學習中一個比較簡單的基本模型。輸入神經網絡的是圖像,經過一系列卷積后,全連接分類得到類別概率。

  

圖片描述

 

  在通常的圖像應用中,我們可以去掉全連接層,用計算的特征(一般就是卷積層的最后一層,e.g. 圖中的conv5_3)來當作提取的特征進行計算。但如果對人臉識別問題同樣采用這樣的方法,即,使用卷積層最后一層做為人臉的“向量表示”,效果其實是不好的。如何改進?我們之后再談,這里先談談我們希望這種人臉的“向量表示”應該具有哪些性質。

  在理想的狀況下,我們希望“向量表示”之間的距離就可以直接反映人臉的相似度:

  對於同一個人的人臉圖像,對應的向量的歐幾里得距離應該比較小。

  對於不同人的人臉圖像,對應的向量之間的歐幾里得距離應該比較大。

  這種表示實際上就可以看做某種“embedding”。在原始的VGG16模型中,我們使用的是softmax損失,沒有對每一類的向量表示之間的距離做出要求。所以不能直接用作人臉表示。

  舉個例子,使用CNN對MNIST進行分類,我們設計一個特殊的卷積網絡,讓最后一層的向量變為2維,此時可以畫出每一類對應的2維向量表示的圖(圖中一種顏色對應一種類別):

  

圖片描述

 

  上圖是我們直接使用softmax訓練得到的結果,它就不符合我們希望特征具有的特點:

  我們希望同一類對應的向量表示盡可能接近。但這里同一類(如紫色),可能具有很大的類間距離。

  我們希望不同類對應的向量應該盡可能遠。但在圖中靠中心的位置,各個類別的距離都很近。

  那么訓練人臉特征表示的正確姿勢是什么?其實有很多種方法。一種方法就是使用“center loss”。centor loss實際上是在softmax的loss上再加入一個損失,這個損失對每一類規定了一個“中心”點,每一類的特征應該離這個中心點比較近,而不同類的中心點離的比較遠。加入center loss后,訓練出的特征大致長這樣:

  

圖片描述

 

  這樣的特征表示就比較符合我們的要求了。center loss的原始論文在這里:http://ydwen.github.io/papers/WenECCV16.pdf 。上面這兩幅圖同樣是從這篇論文中截下來的。

  順帶一提,除了center loss外。學習人臉特征表示的方法還有很多,如triplet loss(論文地址:A Unified Embedding for Face Recognition and Clustering)。triplet loss直接這樣的用三元組(A的圖像1,A的圖像2,B的圖像)來訓練網絡。去掉了最后的分類層,強迫神經網絡對相同的人臉圖像(三元組中的同一人A)建立統一的表達。

  實際應用

  輸入:人臉的向量表示。

  有了人臉的向量表示后,剩下的問題就非常簡單了。因為這種表示具有相同人對應的向量的距離小,不同人對應的向量距離大的特點。接下來一般的應用有以下幾類:

  人臉驗證(Face Identification)。就是檢測A、B是否是屬於同一個人。只需要計算向量之間的距離,設定合適的報警閾值(threshold)即可。

  人臉識別(Face Recognition)。這個應用是最多的,給定一張圖片,檢測數據庫中與之最相似的人臉。顯然可以被轉換為一個求距離的最近鄰問題。

  人臉聚類(Face Clustering)。在數據庫中對人臉進行聚類,直接K-Means即可。

  后記

  以上給大家介紹了OpenFace中處理人臉問題的pipeline。需要特別指出的是,人臉相關的問題是一個比較大的方向,一篇文章顯然是說不清楚的,這里只是基於OpenFace,對比較重要的方法還有名詞做了一個解釋。在OpenFace中,為了速度的考慮,提取人臉特征之前的Face Detection和Face Alignment就是使用的傳統方法。實際上也可以換用精度更高的深度學習相關方法,比如在中科院山世光老師開源的人臉識別引擎seetaface/SeetaFaceEngine中,Face Alignment使用就是一個基於autoencoder網絡的方法。另外,學習人臉特征同樣有適合不同場景的不同方法,這些都是要進一步學習的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM