編者按
近年來,隨著深度學習的火熱發展,人臉識別技術不斷創出新高度,更多方法的發掘及大牛們項目的持續開源,讓人臉識別、深度學習甚至是人工智慧顯得不再神秘,LFW識別率99%已經隨處可見,今天美亞柏科技術專家就人臉識別的一些經典算法和資源進行分享,感受大神們的「最強大腦」!
在實際應用中,人臉驗證(判斷是否是同一人)、人臉識別(這個人是誰)和人臉聚類(尋找類似的人)在自然場景應用仍面臨一些困難。為了降低背景和環境等因素帶來的幹擾,人臉識別一般先經過人臉檢測(Face Detection)、人臉對齊(Face Alignment)等預處理,然後將人臉圖像映射到歐幾裡得等空間,空間距離的長度代表了人臉圖像的相似性。只要該映射空間生成,人臉識別,驗證和聚類等任務就顯得不那麼複雜。
由於先前的網絡和算法在各種測評榜單上不斷被」擠下去」,似乎激發不起大夥的興趣,那麼本期我們就一起看看Google大神的匠心之作——FaceNet。
FaceNet其實就是一個前言所訴的通用人臉識別系統:採用深度卷積神經網絡(CNN)學習將圖像映射到歐式空間。空間距離直接和圖片相似度相關:同一個人的不同圖像在空間距離很小,不同人的圖像在空間中有較大的距離,可以用於人臉驗證、識別和聚類。在800萬人,2億多張樣本集訓練後,FaceNet在LFW數據集上測試的準確率達到了99.63%,在YouTube Faces DB數據集上,準確率為95.12%。
作為經典的深度學習、人臉識別案例,依然採用主流的深度神經網絡來提取特徵,並採用triplet_loss來衡量訓練過程中樣本之間的距離誤差。在訓練前或者在線學習中不斷給神經網絡製造「困難」,即一直在尋找與樣本最不像的「自己」,同時尋找與自己最像的「他人」。通過隨機梯度下降法,不斷縮短自身所有樣本的差距,同時儘可能拉大與其他人的差距,最終達到一個最優。通過這樣一種嵌入學習(Embedding learing),能對原始的特徵提取網絡輸出層再進一步學習,從而改善特徵的表達。
Triplet Loss:
圖1 通過學習後,正樣本對距離更近,負樣本對距離更遠
因此,算法的目標——對樣本集裡構造的任意三元組,使得類內距離儘可能小,類間距離儘可能拉大。即優化機器學習裡這樣的一個損失函數:
這裡,是個閾值,當類內距離與類間距離大於閾值時,才產生loss和梯度。梯度計算:當與之間的距離小於與之間的距離加時,[]內的值大於零,就會產生損失。
當與之間的距離大於等於與之間的距離加時,loss為零。對三元組分別求偏導,則有:
可見,求梯度的結果都是用到了正向傳播的變量。因此,計算時只需將正向傳播的結果暫存,便可以直接計算反向傳播梯度。
對於整個FaceNet結構,這裡的特徵提取可以當作一個黑盒子,可以採用各式各樣的網絡。最早的FaceNet採用兩種深度卷積網絡:經典Zeiler&Fergus架構和Google的Inception v1。最新的FaceNet進行了改進,主體模型採用一個極深度網絡Inception ResNet -v2,由3個帶有殘差連接的Inception模塊和1個Inception v4模塊組成。
圖2 FaceNet系統框架
如圖2所示,模型的整體框架與其他經典深度學習方法基本一致。前面特徵提提取部分也是基於CNN的,只不過深度網絡Inception-v4,後面接一個特徵歸一化層,使得特徵的二範式,即將圖像特徵都映射到一個超球面上,這樣可以規避樣本的成像環境帶來的差異。最後採用triplet_loss作為損失,加上隨機梯度下降法(SDG,Stochastic Gradient Descent)進行反向傳播。模型Inception還連接了殘差,也是本方法的突出點之一,提高了訓練收斂速度。各個模塊具體如下:
圖3 Inception-ResNet-v2網絡簡化示意圖
(左)典型的Inception-v4 網絡
(右)Inception-ResNet-v2網絡輸入部分
網絡:Inception-ResNet-v2
新一代的FaceNet採用Inception-ResNet-v2網絡,在原有的Google的Inception系列網絡的基礎上結合了微軟的殘差網絡ResNet思想。其中,殘差連接(Residual connections )允許模型中存在shortcuts,可以讓研究學者成功地訓練更深的神經網絡,同時還能明顯地簡化Inception塊。
圖4(a) 圖4(b)
圖4(c) 圖4(d)
圖4 不同尺度,不同連接方式下的Inception
1、Triplet選取策略:
為了使類內距離更小,類間距離更大,如何選擇合適的triplet顯得格外重要。因此,訓練中我們儘可能選擇兩種困難樣本對(hard negative pair 和 hard positive pair)。在n張樣本(包含同一個人和不同人的)的集合裡,總共可能出現n2種比較。對於每張訓練樣本,首先可以考慮從一個ID的自身樣本集中找出與當前訓練樣本最不像的樣本形成hard positive pair;然後與其他類的所有樣本比對,找出最像的樣本,與之形成hard negative pair。
當然,對於大量訓練樣本集,每次訓練要在完整數據集上計算argmin和argmax是不可能的,而且容易被樣本分布左右訓練結果。因此,這裡設置可以在每N步過後,使用最近生成的網絡,計算子集裡的兩兩差異,生成一些triplet,再進行下一步訓練。也可以設置mini-batch,這個mini-batch固定的同一類數量分布(比如都為40張)和隨機負樣本,用在線生成和選取mini-batch裡的hard pos/neg 樣例。這裡hard negative pair可以選擇mini-batch裡的所有同類形成的正樣本對,而不一定是最困難那對。Batch大小會影響梯度收斂,但是太小batch對選擇triplet不利。經過多次實驗,這裡batch size設置為1800。
除此之外,還可以對triplet進行約束:
與傳統的softmax loss相比,triplet_loss直接對距離進行度量和優化,效果更明顯。根據其他工程人員經驗,實際訓練中,可以對softmax loss和triplet_loss進行加權,在線調整權值,達到最優。
2、訓練策略:
殘差不是訓練極深度神經網絡的必要條件,但能明顯提升訓練速度。
為了防止陷入局部最優,防止訓練過程中網絡突然「死亡」(梯度都接近於0),一味地下調學習率或者外加batch-normaliztion不是長久之計,因此這裡採用了在原來的激活層外連接殘差塊。
圖5殘差連接塊
Inception-v4網絡+最新的residual connection技術+triplet_loss咋眼一看,強大完美的組合有木有!既提取了魯棒人臉特徵,又加快訓練速度,更重要的是拉開了類別之間的差距。但是,實際上會遇到一些棘手的問題,比如triplet選取有偏差(絕大多數可能出現);網絡龐大,硬體資源有限時batch size無法加上去;訓練採用歐式距離而實際驗證比對時難以直接比較,使用時需要重新映射或轉換到(0,1)之間等。當然,FaceNet本身也在不斷改進和演化,更強的網絡和方法持續發布,其他平臺的版本也在開發中。
FaceNet早已開源,其中tensorflow的版本在https://github.com/davidsandberg/facenet處,而且項目不斷在更新。有興趣的朋友可以自己試試,可以嘗試將其中的黑盒部分(網絡模型)替換成其他的經典模型,說不定會有意外收穫哦,但是由於業內眾所周知的問題,tensorflow被許多大牛們冠以反人類深度學習框架的美名,說實話,很多工程上的同行是不情願去用它的,不過從研究角度上講,作者欣然將源碼精華分享,是業內的福音。
原項目中,谷歌大神在八百萬人臉數據集上訓練。學習率0.045,momentum為0.9,batch size 1800,拼死將LFW刷到99.6%以上!(前提是得有8百萬人,2億張樣本…)
未完待續.
[1] Schroff F, Kalenichenko D, Philbin J. FaceNet: A unified embedding for face recognition and clustering[J]. 2015:815-823.
[2]Christian Szegedy,Sergey Ioffe,Vincent Vanhoucke. Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning. arXiv:1602.07261
[3] https://github.com/davidsandberg/facenet
更多往期技術分享,點擊閱讀原文或者美亞柏科菜單欄【美亞V+】->【技術分享】即可!