如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

PaperWeekly發表於2018-04-04

作者丨葛政

學校丨早稻田大學碩士生

研究方向丨深度學習計算機視覺

個人部落格丨Xraft.Lab

相信做機器學習深度學習的同學們回家總會有這樣一個煩惱:親朋好友詢問你從事什麼工作的時候,如何通俗地解釋能避免尷尬?

我嘗試過很多名詞來形容自己的工作:機器學習深度學習,演算法工程師/研究員,搞計算機的,程式設計師…這些詞要麼自己覺得不滿意,要麼對方聽不懂。經歷無數次失敗溝通,最後總結了一個簡單實用的答案:“做人臉識別的”

為什麼這個答案管用,因為人臉識別深度學習相關領域的課題中屬於商業落地情景多,被普及率廣的一項技術,以至於誰說不出幾個人臉識別應用,都有那麼點落後於時代的意思。

今天出這篇人臉識別,是基於我過去三個月在人臉識別方向小小的探索,希望能為非技術從業者提供人臉識別的基本概念(第一部分),以及人臉識別愛好者和入門人員提供儲備知識和實驗資料參考(第二、第三部分),也歡迎專業人士提供寶貴的交流意見。 

本文將從接下來三個方面介紹人臉識別,讀者可根據自身需求選擇性閱讀:

  • Chapter 1:人臉識別是什麼?怎麼識別? 

  • Chapter 2:科研領域近期進展 

  • Chapter 3:實驗及細節

Chapter 1

人臉識別是什麼

人臉識別問題巨集觀上分為兩類:1. 人臉驗證(又叫人臉比對)2. 人臉識別

人臉驗證做的是 1 比 1 的比對,即判斷兩張圖片裡的人是否為同一人。最常見的應用場景便是人臉解鎖,終端裝置(如手機)只需將使用者事先註冊的照片與臨場採集的照片做對比,判斷是否為同一人,即可完成身份驗證。

人臉識別做的是 1 比 N 的比對,即判斷系統當前見到的人,為事先見過的眾多人中的哪一個。比如疑犯追蹤,小區門禁,會場簽到,以及新零售概念裡的客戶識別

這些應用場景的共同特點是:人臉識別系統都事先儲存了大量的不同人臉和身份資訊,系統執行時需要將見到的人臉與之前儲存的大量人臉做比對,找出匹配的人臉。

兩者在早期(2012年~2015年)是通過不同的演算法框架來實現的,想同時擁有人臉驗證和人臉識別系統,需要分開訓練兩個神經網路。而 2015 年 Google 的 FaceNet [1] 論文的發表改變了這一現狀,將兩者統一到一個框架裡。

人臉識別,怎麼識別

這部分只想闡明一個核心思想:不同人臉由不同特徵組成

理解這個思想,首先需要引入的的是“特徵”的概念。先看下面這個例子:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

假設這 5 個特徵足夠形容一張人臉,那每張人臉都可表示為這 5 個特徵的組合:

 (特徵1,特徵2,特徵3,特徵4,特徵5)

一位雙眼皮,挺鼻樑,藍眼睛,白皮膚,瓜子臉的歐美系小鮮肉即可用特徵表示為(見表格加粗項): 

(1,1,0,1,0)

那麼遍歷上面這張特徵表格一共可以代表如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼張不同的臉。32 張臉可遠遠不夠覆蓋 70 多億的人口。為了讓不同特徵組成的人臉能覆蓋足夠多人臉,我們需要擴充上面那張特徵表。擴張特徵表可以從行、列兩個角度展開。 

列的角度很簡單,只需要增加特徵數量:(特徵6.臉型,特徵7.兩眼之間距離,特徵8.嘴脣厚薄…)實際應用中通常應用 128,256,512 或者 1024 個不同特徵,這麼多特徵從哪來,該不會人為一個一個去設計吧?這個問題在後面會解答。 

從行的角度擴充也很好理解,比如“特徵3”,除了值 0 代表藍色,值 1 代表灰色,是不是可以增加一個值 2 代表黑色,值 3 代表沒有頭髮呢?此外,除了這些離散的整數,我們也可以取連續的小數,比如特徵 3 的值 0.1,代表“藍中略微帶黑”,值 0.9 代表“灰中帶藍”……

經過這樣的擴充,特徵空間便會變得無限大。擴充後特徵空間裡的一張臉可能表示為: 

(0, 1, 0.3, 0.5, 0.1, 2, 2.3, 1.75,…)

之前提出的問題:用於表示人臉的大量特徵從哪來?這便是深度學習(深度神經網路)發揮作用的地方。它通過在千萬甚至億級別的人臉資料庫上學習訓練後,會自動總結出最適合於計算機理解和區分的人臉特徵。

演算法工程師通常需要一定的視覺化手段才能知道機器到底學習到了哪些利於區分不同人的特徵,當然這部分不是本節重點。 

闡明瞭不同人臉由不同特徵組成後,我們便有了足夠的知識來分析人臉識別,到底怎麼識別。 

現在考慮最簡單最理想的情況,用於區分不同人的特徵只有兩個:特徵1和特徵2。那麼每一張臉都可以表示為一個座標(特徵1,特徵2),即特徵空間(這個例子裡是二維空間)內的一個點。

人臉識別基於一個預設成立的假設:同一個人在不同照片裡的臉,在特徵空間裡非常接近

為什麼這個假設預設成立,設想一下,一個棕色頭髮的人,在不同光照,遮擋,角度條件下,髮色看起來雖然有輕微的區別,但依然與真實顏色非常接近,反應在髮色的特徵值上,可能是 0 到 0.1 之間的浮動。

深度學習的另一任務和挑戰便是在各種極端複雜的環境條件下,精確的識別各個特徵。

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

上圖是在熊本做大規模人臉資料集去噪演講時用的 PPT,三張山下智久的照片經過神經網路提取出 128 維的特徵後,變成了 3 個在 128 維空間中的點(紅色),石原里美的特徵點為綠色。

這張 PPT 想表達同樣的意思:同一人的不通照片提取出的特徵,在特徵空間裡距離很近,不同人的臉在特徵空間裡相距較遠

再來考慮人臉識別領域的兩個問題:人臉驗證人臉識別

人臉驗證

比如 FaceID 人臉解鎖,iPhone 事先存了一張使用者的照片(需要使用者註冊),這張照片變成了轉換成了一連串特徵數值(即特徵空間裡的一個點),使用者解鎖時,手機只需要對比當前採集到的臉和事先註冊的臉在特徵空間裡的幾何距離,如果距離足夠近,則判斷為同一人,如果距離不夠近,則解鎖失敗。距離閾值的設定,則是演算法工程師通過大量實驗得到的。

人臉識別

同樣考慮一個場景,人臉考勤。公司 X 有員工 A,B,C,公司會要求三名員工在入職的時候各提供一張個人照片用於註冊在公司系統裡,靜靜地躺在特徵空間中。

第二天早上員工 A 上班打卡時,將臉對準考勤機器,系統會把當前員工 A 的臉放到特徵空間裡,與之前特徵空間裡註冊好的臉一一對比,發現註冊的臉中距離當前採集到的臉最近的特徵臉是員工 A,打卡完畢。

知道了人臉識別的基本原理,便能看清它的技術侷限。下圖展示了一些容易識別失敗的案例:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

在光照較差,遮擋,形變(大笑),側臉等諸多條件下,神經網路很難提取出與“標準臉”相似的特徵,異常臉在特徵空間裡落到錯誤的位置,導致識別和驗證失敗。這是現代人臉識別系統的侷限,一定程度上也是深度學習(深度神經網路)的侷限。

面對這種侷限,通常採取三種應對措施,使人臉識別系統能正常運作

1. 工程角度:研發質量模型,對檢測到人臉質量進行評價,質量較差則不識別/檢驗。

2. 應用角度:施加場景限制,比如刷臉解鎖,人臉閘機,會場簽到時,都要求使用者在良好的光照條件下正對攝像頭,以避免採集到質量差的圖片。

3. 演算法角度:提升人臉識別模型效能,在訓練資料裡新增更多複雜場景和質量的照片,以增強模型的抗干擾能力。

總而言之,人臉識別/深度學習還遠未達到人們想象的那般智慧。希望各位讀者看完第一節後,有能力分辨社交網路,自媒體上的資訊真偽,更理性的看待人工智慧,給它時間和包容,慢慢成長。

Chapter 2

這部分將從兩個思路跟進現代人臉識別演算法: 

思路1:Metric Learning: Contrastive Loss, Triplet loss 及相關 sampling method。 

思路2:Margin Based Classification: 包含 Softmax with Center loss, Sphereface, NormFace, AM-softmax (CosFace) 和 ArcFace. 

關鍵字:DeepID2, Facenet, Center loss, Triplet loss, Contrastive Loss, Sampling method, Sphereface, Additive Margin Softmax (CosFace), ArcFace. 

思路1:Metric Learning 

Contrastive Loss 

基於深度學習人臉識別領域最先應用 Metric Learning 思想之一的便是 DeepID2 [2] 了,同 Chapter 1 的思想,“特徵”在這篇文章中被稱為“DeepID Vector”。

DeepID2 在同一個網路同時訓練 Verification 和 Classification(即有兩個監督訊號)。其中 Verification Loss 便在特徵層引入了 Contrastive Loss。

Contrastive Loss 本質上是使同一個人的照片在特徵空間距離足夠近,不同人在特徵空間裡相距足夠遠直到超過某個閾值 m(聽起來和 Triplet Loss 很像)。

基於這樣的 insight,DeepID2 在訓練的時候不是以一張圖片為單位了,而是以 Image Pair 為單位,每次輸入兩張圖片,為同一人則 Verification Label 為 1,不是同一人則 Label 為 -1,引數更新思路見下面公式(截自 DeepID2 論文):

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

DeepID2 在 14 年是人臉領域非常有影響力的工作,也掀起了在人臉領域引進 Metric Learning 的浪潮。 

Triplet Loss from FaceNet 

這篇 15 年來自 Google 的 FaceNet 同樣是人臉識別領域的分水嶺性工作。不僅僅因為他們成功應用了 Triplet Loss 在 benchmark 上取得 state-of-art 的結果,更因為他們提出了一個絕大部分人臉問題的統一解決框架,即:識別、驗證、搜尋等問題都可以放到特徵空間裡做,需要專注解決的僅僅是如何將人臉更好的對映到特徵空間。

為此,Google 在 DeepID2 的基礎上,拋棄了分類層即 Classification Loss,將 Contrastive Loss 改進為 Triplet Loss,只為了一個目的:學到更好的 feature。 

Triplet Loss 的思想也很簡單,輸入不再是 Image Pair,而是三張圖片(Triplet),分別為 Anchor Face,Negative Face 和 Positive Face。Anchor 與 Positive Face 為同一人,與 Negative Face 為不同人。那麼 Triplet Loss 的損失即可表示為:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

直觀解釋為:在特徵空間裡 Anchor 與 Positive 的距離要小於 Anchor 與 Negative 的距離超過一個 Margin Alpha。

有了良好的人臉特徵空間,人臉問題便轉換成了 Chapter 1 末尾形容的那樣簡單直觀。附上一張我製作的 Contrastive Loss 和 Triplet Loss 的 PPT:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

Metric Learning 的問題 

基於 Contrastive Loss 和 Triplet Loss 的 Metric Learning 符合人的認知規律,在實際應用中也取得了不錯的效果,但是它有非常致命的兩個問題,使應用它們的時候猶如 pain in the ass。

1. 模型需要很很很很很很很很很很很很很很長時間才能擬合(months mentioned in FaceNet paper),Contrastive Loss 和 Triplet Loss 的訓練樣本都基於 pair 或者 triplet 的,可能的樣本數是 O (N2) 或者 O (N3) 的。

當訓練集很大時,基本不可能遍歷到所有可能的樣本(或能提供足夠梯度額的樣本),所以一般來說需要很長時間擬合。我在 10000 人,500,000 張左右的亞洲資料集上花了近一個月才擬合。 

2. 模型好壞很依賴訓練資料的 Sample 方式,理想的 Sample 方式不僅能提升演算法最後的效能,更能略微加快訓練速度。 

關於這兩個問題也有很多學者進行了後續研究,下面的內容作為 Metric Learning 的延伸閱讀,不會很詳細。 

Metric Learning 延伸閱讀 

1. Deep Face Recognition [3]

為了加速 Triplet Loss 的訓練,這篇文章先用傳統的 softmax 訓練人臉識別模型,因為 Classficiation 訊號的強監督特性,模型會很快擬合(通常小於 2 天,快的話幾個小時)。

之後移除頂層的 Classificiation Layer,用 Triplet Loss 對模型進行特徵層 finetune,取得了不錯的效果。此外這篇論文還發布了人臉資料集 VGG-Face。 

2. In Defense of the Triplet Loss for Person Re-Identification [4]

這篇文章提出了三個非常有意思的觀點:

  • 作者說實驗中,平方後的歐幾里得距離(Squared Euclidean Distance)表現不如開方後的真實歐幾里得距離(Non-squared Euclidean Distance),直白來說就是把下圖公式中的平方摘掉。

  • 提出了 Soft-Margin 損失公式替代原始的 Triplet Loss 表示式。

  • 引進了 Batch Hard Sampling。

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

3. Sampling Matters in Deep Embedding Learning [5]

這篇文章提出了兩個有價值的點:

  • 從導函式角度解釋了為什麼第 2 點中提到的 Non-squared Distance 比 Squared-distance 好,並在這個 insight 基礎上提出了 Margin Based Loss(本質還是 Triplet Loss 的 variant,見下圖,圖片取自原文)。

  • 提出了 Distance Weighted Sampling。文章說 FaceNet 中的 Semi-hard Sampling,Deep Face Recognition [3] 中的 Random Hard 和 [4] 中提到的 Batch Hard 都不能輕易取到會產生大梯度(大 loss,即對模型訓練有幫助的 triplets),然後從統計學的視角使用了 Distance Weighted Sampling Method。

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

4. 我的實驗感想

  • 2、3 點中提到的方式在試驗中都應用過,直觀感受是 Soft-Margin 和Margin Based Loss 都比原始的 Triplet Loss 好用,但是 Margin Based Loss 實驗中更優越。

  • Distance Weighted Sampling Method 沒有明顯提升。

延伸閱讀中有提到大家感興趣的論文,可參考 reference 檢視原文。最後,值得注意的是,Triplet Loss 在行人重識別領域也取得了不錯的效果,雖然很可能未來會被 Margin Based Classfication 打敗。

思路2:Margin Based Classification

顧名思義,Margin Based Classficiation 不像在 feature 層直接計算損失的 Metric Learning 那樣,對 feature 加直觀的強限制,而是依然把人臉識別當 classification 任務進行訓練,通過對 softmax 公式的改造,間接實現了對 feature 層施加 margin 的限制,使網路最後得到的 feature 更 discriminative。

這部分先從 Sphereface [6] 說起。 

Sphereface 

先跟隨作者的 insight 理下思路(圖截自原文):

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

圖 (a) 是用原始 softmax 損失函式訓練出來的特徵,圖 (b) 是歸一化的特徵。不難發現在 softmax 的特徵從角度上來看有 latent 分佈。

那麼為何不直接去優化角度呢?如果把分類層的權重歸一化,並且不考慮偏置的話,就得到了改進後的損失函式:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

不難看出,對於特徵 x_i,該損失函式優化的方向是使得其向該類別 y_i 中心靠近,並且遠離其他的類別中心。這個目標跟人臉識別目標是一致的,最小化類內距離並且最大化類間距離。

然而為了保證人臉比對的正確性,還要保證最大類內距離還要小於最小類間距離。上面的損失函式並不能保證這一點。所以作者引入了 margin 的思想,這跟 Triples Loss 裡面引入 Margin Alpha 的思想是一致的。

那麼作者是如何進一步改進上式,引入 margin 的呢?

上式紅框中是樣本特徵與類中心的餘弦值,我們的目標是縮小樣本特徵與類中心的角度,即增大這個值。換句話說,如果這個值越小,損失函式值越大,即我們對偏離優化目標的懲罰越大。

也就是說,這樣就能進一步的縮小類內距離和增大類間距離,達到我們的目標。基於這樣的思想最終的損失函式為如下:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

原始的 cos(θ) 被換成了 phi(θ),phi(θ) 的最簡單形式其實是 cos(mθ),之所以在原文中變得複雜,只是為了將定義域擴充套件到 [0,2π] 上,並保證在定義域內單調遞減。

而這個 m 便是增加的 margin 係數。當 m=1 時,phi(θ) 等於 cos(θ),當 m>1 時,phi 變小,損失變大。超參 m 控制著懲罰力度,m 越大,懲罰力度越大。

為計算方便,m 一般設為整數。作者從數學上證明了,m>=3 就能保證最大類內距離小於最小類間距離。實現的時候使用倍角公式。

另外:Sphereface 的訓練很 tricky,關於其訓練細節,這篇文章並沒有提到,而是參考了作者前一篇文章 [10]。有關訓練細節讀者也可以去作者 Github 上去尋找,issues 裡面有很多討論。

Normface

Sphereface 效果很好,但是它不優美。在測試階段,Sphereface 通過特徵間的餘弦值來衡量相似性,即以角度為相似性的度量。

但在訓練階段,不知道讀者有沒有注意到,其實 Sphereface 的損失函式並不是在直接優化特徵與類中心的角度,而是優化特徵與類中心的角度在乘上一個特徵的長度。

也就是說,我在上文中關於 Sphereface 損失函式優化方向的表述是不嚴謹的,其實優化的方向還有一部分是去增大特徵的長度去了。

我在 MNIST 資料集上做過實驗,以下圖片分別為 m=1 和 m=4 時的特徵視覺化,注意座標的尺度,就能驗證上述觀點。

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

然而特徵的長度在我們使用模型的時候是沒有幫助的。這就造成了 training 跟 test 之間目標不一致,按照 Normface 作者原話說就是存在一個 gap。

於是 Normface 的核心思想就出來了:為何在訓練的時候不把特徵也做歸一化處理?相應的損失函式如下:

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

其中 W 是歸一化的權重,f_i 是歸一化的特徵,兩個點積就是角度餘弦值。引數 s 的引入是因為數學上的性質,保證了梯度大小的合理性,原文中有比較直觀的解釋,這裡不是重點。

如果沒有 s 訓練將無法收斂。關於 s 的設定,可以把它設為可學習的引數。但是作者更推薦把它當做超引數,其值根據分類類別多少有相應的推薦值,這部分原文 appendix 裡有公式。

文章中還有指出一點,FaceNet 中歸一化特徵的歐式距離,和餘弦距離其實是統一的。還有關於權重與特徵的歸一化,這篇文章有很多有意思的探討,有興趣的讀者建議閱讀原文。

AM-softmax [11] / CosFace [12]

這兩篇文章是同一個東西。Normface 用特徵歸一化解決了 Sphereface 訓練和測試不一致的問題。但是卻沒有了 margin 的意味。AM-softmax 可以說是在 Normface 的基礎上引入了 margin。直接上損失函式

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

其中這裡的權重和特徵都是歸一化的。

直觀上來看,cos(θ)-m 比 cos(θ) 更小,所以損失函式值比 Normface 裡的更大,因此有了 margin 的感覺。

m 是一個超引數,控制懲罰的力度,m 越大,懲罰越強。作者推薦 m=0.35。這裡引入 margin 的方式比 Sphereface 中的‘溫柔’,不僅容易復現,沒有很多調參的 tricks,效果也很好。

ArcFace [13] 

與 AM-softmax 相比,區別在於 Arcface 引入 margin 的方式不同,損失函式

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

乍一看是不是和 AM-softmax一樣?注意 m 是在餘弦裡面。文章指出基於上式優化得到的特徵間的 boundary 更為優越,具有更強的幾何解釋。 

然而這樣引入 margin 是否會有問題?仔細想 cos(θ+m) 是否一定比 cos(θ) 小?

最後我們用文章中的圖來解釋這個問題,並且也由此做一個本章 Margin-based Classification 部分的總結。

小結

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

這幅圖出自於 Arcface,橫座標為 θ 為特徵與類中心的角度,縱座標為損失函式分子指數部分的值(不考慮 s),其值越小損失函式越大。 

看了這麼多基於分類的人臉識別論文,相信你也有種感覺,大家似乎都在損失函式上做文章,或者更具體一點,大家都是在討論如何設計上圖的 Target logit-θ 曲線。

這個曲線意味著你要如何優化偏離目標的樣本,或者說,根據偏離目標的程度,要給予多大的懲罰。兩點總結: 

1. 太強的約束不容易泛化。例如 Sphereface 的損失函式在 m=3 或 4 的時候能滿足類內最大距離小於類間最小距離的要求。此時損失函式值很大,即 target logits 很小。但並不意味著能泛化到訓練集以外的樣本。施加太強的約束反而會降低模型效能,且訓練不易收斂。 

2. 選擇優化什麼樣的樣本很重要。Arcface 文章中指出,給予 θ∈[60° , 90°] 的樣本過多懲罰可能會導致訓練不收斂。優化 θ ∈ [30° , 60°] 的樣本可能會提高模型準確率,而過分優化 θ∈[0° , 30°] 的樣本則不會帶來明顯提升。至於更大角度的樣本,偏離目標太遠,強行優化很有可能會降低模型效能。

這也回答了上一節留下的疑問,上圖曲線 Arcface 後面是上升的,這無關緊要甚至還有好處。因為優化大角度的 hard sample 可能沒有好處。這和 FaceNet 中對於樣本選擇的 semi-hard 策略是一個道理。 

Margin based classification 延伸閱讀 

1. A discriminative feature learning approach for deep face recognition [14]

提出了 center loss,加權整合進原始的 softmax loss。通過維護一個歐式空間類中心,縮小類內距離,增強特徵的 discriminative power。 

2. Large-margin softmax loss for convolutional neural networks [10]

Sphereface 作者的前一篇文章,未歸一化權重,在 softmax loss 中引入了 margin。裡面也涉及到 Sphereface 的訓練細節。 

注:思路二由陳超撰寫

Chapter 3

基於前兩章的知識,我在 lfw 上取得了 99.47% 的結果,這個結果訓練在 Vggface2 上,未與 lfw 去重,也沒經歷很痛苦的調參過程,算是 AM-softmax 損失函式直接帶來的收益吧。

過程中踩了很多坑,這一章將把前段時間的實驗結果和心得做一個整理,此外也將回答絕大部分工程師在做人臉識別時最關心的一些問題。やりましょう! 

專案地址:


https://github.com/Joker316701882/Additive-Margin-Softmax 


包含程式碼可以復現所有實驗結果 

一個標準的人臉識別系統包含這幾個環節:人臉檢測及特徵點檢測->人臉對齊->人臉識別

人臉檢測 & Landmark檢測

目前最流行的人臉及 Landmark 檢測是 MTCNN [7],但是 MTCNN 一方面偶爾檢測不到 face,一方面 Landmark 檢測不夠精準。這兩點都會給後續的對齊和識別帶來不利影響。

另外在 COCO Loss [8] 論文裡提到:好的檢測和對齊方法,僅用 softmax 就能達到 99.75%,秒殺目前大多數最新論文的結果。COCO Loss 的 Github issue [16] 裡提到了更多細節。

此外,因為 alignment 演算法效能的區別,2017 年及以後的論文更加註重相對實驗結果的比較,以排除 alignment 演算法引入的優劣勢,方便更直觀比較各家的人臉識別演算法,lfw 上輕鬆能達到 99% 以上也是現在更傾向於採用相對結果的原因。 

人臉對齊 

人臉對齊做的是將檢測到的臉和 Landmark 通過幾何變換,將五官變換到圖中相對固定的位置,提供較強的先驗。

廣泛使用的對齊方法為 Similarity Transformation。更多對其變換方法和實驗可以參考這篇知乎文章 [17]。

作者程式碼實現:


https://github.com/Joker316701882/Additive-Margin-Softmax/blob/master/align/align_lfw.py

值得探討的一個問題是:人臉檢測和對齊真的有必要嗎?現實應用中常出現人臉 Landmark 無法檢測的情況,沒有 Landmark 就無法使用 Similarity Transoformation。

針對這個問題也有相關研究,通過使用 Spatial Transform Network [9] “讓網路自己學習 alignment”,論文參考 End-to-End Spatial Transform Face Detection and Recognition。這方面的研究進展還不充分,所以實際系統中多數情況下還是使用了 detection->alignment 這套流程。

人臉識別

可以說人臉識別的專案中絕大部分問題都是人臉檢測和對齊的問題。識別模型之間的差距倒沒有那麼明顯。不過訓練 AM-softmax 過程中依然碰到了些值得注意的問題。

Spheraface 裡提出的 Resface20,AM-softmax 中也同樣使用,一模一樣復現情況下在 lfw 上只能達到 94%。

TensorFlow 中能擬合的情況為如下配置:

Adam, no weight decay, use batch normalization.

對應原文配置:

Momentum, weight decay, no batch normalization.

以及在實驗中發現的: 除了 Adam 以外的任何一個 optimizer 都達不到理想效果,這可能是不同框架底層實現有所區別的原因,Sphereface,、AM-softmax都是基於 Caffe,本文所有實驗全使用 TensorFlow,結論有區別也算正常。

另一點,Sandberg FaceNet 中的 resnet-inception-v1 搬過來套用 AM-softmax 在 lfw 上的結果達不到 97%,這是過程中不太理解的點。

從其他論文裡看,如果 loss 選的沒問題,那諸如 resnet-inception,不同深度的 Resnet,甚至 Mobile-net,Squeezenet 等結構的表現也不該有明顯差距(AM-softmax 的情況下至少也該達到99%)。

此外,直接套用 Arcface 也無法擬合,需要進一步實驗。 

最後,關於 Sandberg 的 code 中一個值得關注的點,他將 train_op 定義在了 facenet.train() 函式裡,仔細閱讀這個函式會發現,Sandberg 的程式碼中所有網路引數並不是採用每次更新梯度後的值,而是採用滑動平均值作為網路實際的引數值。

也正是因為這個原因,解釋了 Sandberg 在 batch_norm 的引數 configuration中,甚至沒把”is_training”的值交給 placeholder,而是預設 train 和 test 時都採用 local statistics 的模式。

如果不是因為所有引數都用了滑動平均,那麼這種使用 batch_norm 的做法其實是錯誤的。Sandberg 這樣實現的好壞只能交給實驗結果來評判了。

如果想正常使用網路引數和 batch norm,而不是用滑動平均引數和全程開著“is_training”,只需要將 facenet.train() 函式替換成普通的 Optimizer,然後將 batch_norm的“is_training”交給 placeholder 處理,詳細可以參考我的 AM-softmax 實現。

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

感謝大家堅持閱讀到最後,以 TensorBoard 的 plot 作為結尾吧!

如何走近深度學習人臉識別?你需要這篇超長綜述 | 附開原始碼

參考文獻

[1] F. Schroff, D. Kalenichenko, and J. Philbin. Facenet: A unified embedding for face recognition and clustering. In Proc. CVPR, 2015. 

[2] Y. Sun, X. Wang, and X. Tang. Deep learning face representation by joint identification-verification. CoRR, abs/1406.4773, 2014. 

[3] O. M. Parkhi, A. Vedaldi, and A. Zisserman. Deep face recognition. In BMVC, 2015 

[4] A. Hermans, L. Beyer, and B. Leibe. In defense of the triplet loss for person re-identification. arXiv preprint arXiv:1703.07737, 2017 

[5] Wu, C. Manmatha, R. Smola, A. J. and Krahenb uhl, P. 2017. Sampling matters in deep embedding learning. arXiv preprint arXiv:1706.07567 

[6] W. Liu, Y. Wen, Z. Yu, M. Li, B. Raj, and L. Song. Sphereface: Deep hypersphere embedding for face recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition, 2017 

[7] Zhang, K., Zhang, Z., Li, Z., Qiao, Y.: Joint face detection and alignment using multi-task cascaded convolutional networks. arXiv preprint, 2016 

[8] Yu Liu, Hongyang Li, and Xiaogang Wang. 2017. Learning Deep Features via Congenerous Cosine Loss for Person Recognition. arXiv preprint arXiv:1702.06890, 2017 

[9] M. Jaderberg, K. Simonyan, A. Zisserman, and K. Kavukcuoglu. Spatial transformer networks. In NIPS, 2015. 

[10] W. Liu, Y. Wen, Z. Yu, and M. Yang. Large-margin softmax loss for convolutional neural networks. In ICML, 2016. 

[11] F. Wang, W. Liu, H. Liu, and J. Cheng. Additive margin softmax for face verification. In arXiv:1801.05599, 2018. 

[12] CosFace: Large Margin Cosine Loss for Deep Face Recognition 

[13] Deng, J., Guo, J., Zafeiriou, S.: Arcface: Additive angular margin loss for deep face recognition. In: Arxiv preprint. 2018 

[14] Y. Wen, K. Zhang, Z. Li, and Y. Qiao. A discriminative feature learning approach for deep face recognition. In ECCV, 2016. 

[15] Y. Liu, H. Li, and X. Wang. Rethinking feature discrimination and polymerization for large-scale recognition. arXiv:1710.00870, 2017.

[16] https://github.com/sciencefans/coco_loss/issues/9

[17] https://zhuanlan.zhihu.com/p/29515986

相關文章