[深度應用]·基於卷積神經網絡人臉識別的原理及應用開發(轉)

[深度應用]·基於卷積神經網絡人臉識別的原理及應用開發(轉)

 

這裏簡單講下OpenFace中實現人臉識別的pipeline,這個pipeline能夠看作是使用深度卷積網絡處理人臉問題的一個基本框架,頗有學習價值,它的結構以下圖所示:html

一、Input Image -> Detect

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

輸出:人臉位置的bounding box。github

這一步通常咱們稱之爲「人臉檢測」(Face Detection),在OpenFace中,使用的是dlib、OpenCV現有的人臉檢測方法。此方法與深度學習無關,使用的特徵是傳統計算機視覺中的方法(通常是Hog、Haar等特徵)。數據庫

對人臉檢測這一步感興趣的能夠參考下列資料:網絡

二、Detect -> Transform -> Crop

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

輸出:「校準」過的只含有人臉的圖像學習

對於輸入的原始圖像 + bounding box,這一步要作的事情就是要檢測人臉中的關鍵點,而後根據這些關鍵點對人臉作對齊校準。所謂關鍵點,就是下圖所示的綠色的點,一般是眼角的位置、鼻子的位置、臉的輪廓點等等。有了這些關鍵點後,咱們就能夠把人臉「校準」,或者說是「對齊」。解釋就是原先人臉可能比較歪,這裏根據關鍵點,使用仿射變換將人臉統一「擺正」,儘可能去消除姿式不一樣帶來的偏差。這一步咱們通常叫Face Alignment。url

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

三、Crop -> Representation

輸入:校準後的單張人臉圖像.net

輸出:一個向量表示。

這一步就是使用深度卷積網絡,將輸入的人臉圖像,轉換成一個向量的表示。在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網絡的方法。另外,學習人臉特徵一樣有適合不一樣場景的不一樣方法,這些都是要進一步學習的。

 

本文同步分享在 博客「小宋是呢」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索