人臉識別——FaceBook的DeepFace、Google的FaceNet、DeepID
連續看了DeepID和FaceNet後,看了更早期的一篇論文,即FB的DeepFace。這篇論文早於DeepID和FaceNet,但其所使用的方法在後面的論文中都有體現,可謂是早期的奠基之作。因而特寫博文以記之。
DeepFace基本框架
人臉識別的基本流程是:
detect -> aligh -> represent -> classify
人臉對齊流程
分為如下幾步:
a. 人臉檢測,使用6個基點
b. 二維剪下,將人臉部分裁剪出來
c. 67個基點,然後Delaunay三角化,在輪廓處新增三角形來避免不連續
d. 將三角化後的人臉轉換成3D形狀
e. 三角化後的人臉變為有深度的3D三角網
f. 將三角網做偏轉,使人臉的正面朝前。
g. 最後放正的人臉
h. 一個新角度的人臉(在論文中沒有用到)
總體上說,這一步的作用就是使用3D模型來將人臉對齊,從而使CNN發揮最大的效果。
人臉表示
經過3D對齊以後,形成的影象都是152×152的影象,輸入到上述網路結構中,該結構的引數如下:
- Conv:32個11×11×3的卷積核
- max-pooling: 3×3, stride=2
- Conv: 16個9×9的卷積核
- Local-Conv: 16個9×9的卷積核,Local的意思是卷積核的引數不共享
- Local-Conv: 16個7×7的卷積核,引數不共享
- Local-Conv: 16個5×5的卷積核,引數不共享
- Fully-connected: 4096維
- Softmax: 4030維
前三層的目的在於提取低層次的特徵,比如簡單的邊和紋理。其中Max-pooling層使得卷積的輸出對微小的偏移情況更加魯棒。但沒有用太多的Max-pooling層,因為太多的Max-pooling層會使得網路損失影象資訊。
後面三層都是使用引數不共享的卷積核,之所以使用引數不共享,有如下原因:
- 對齊的人臉圖片中,不同的區域會有不同的統計特徵,卷積的區域性穩定性假設並不存在,所以使用相同的卷積核會導致資訊的丟失
- 不共享的卷積核並不增加抽取特徵時的計算量,而會增加訓練時的計算量
- 使用不共享的卷積核,需要訓練的引數量大大增加,因而需要很大的資料量,然而這個條件本文剛好滿足。
全連線層將上一層的每個單元和本層的所有單元相連,用來捕捉人臉影象不同位置的特徵之間的相關性。其中,第7層(4096-d)被用來表示人臉。
全連線層的輸出可以用於Softmax的輸入,Softmax層用於分類。
人臉表示歸一化
對於輸出的4096-d向量:
- 先每一維進行歸一化,即對於結果向量中的每一維,都要除以該維度在整個訓練集上的最大值。
- 每個向量進行L2歸一化
分類
得到表示後,使用了多種方法進行分類:
- 直接算內積
- 加權的卡方距離
- 使用Siamese網路結構
加權卡方距離計算公式如下:
其中,加權引數由線性SVM計算得到。
Siamese網路結構是成對進行訓練,得到的特徵表示再使用如下公式進行計算距離:
其中,引數alpha是訓練得到。Siamese網路與FaceNet就很像了。
實驗評估
資料集
- Social Face Classification Dataset(SFC): 4.4M張人臉/4030人
- LFW: 13323張人臉/5749人
- restricted: 只有是/不是的標記
- unrestricted:其他的訓練對也可以拿到
- unsupervised:不在LFW上訓練
- Youtube Face(YTF): 3425videos/1595人
Training on SFC
- 訓練使用的人數不同(1.5K/3.3K/4.4K)
- 訓練使用的照片數目不同(10%/20%/50%)
- 使用的網路不同(去掉第三層/去掉第4、5層/去掉第3、4、5層)
Results on LFW
Results on YTF
總結
DeepFace與之後的方法的最大的不同點在於,DeepFace在訓練神經網路前,使用了對齊方法。論文認為神經網路能夠work的原因在於一旦人臉經過對齊後,人臉區域的特徵就固定在某些畫素上了,此時,可以用卷積神經網路來學習特徵。
針對同樣的問題,DeepID和FaceNet並沒有對齊,DeepID的解決方案是將一個人臉切成很多部分,每個部分都訓練一個模型,然後模型聚合。FaceNet則是沒有考慮這一點,直接以資料量大和特殊的目標函式取勝。
在DeepFace論文中,只使用CNN提取到的特徵,這點倒是開後面之先河,後面的DeepID、FaceNet全都是使用CNN提取特徵了,再也不談LBP了。
參考文獻
[1]. Taigman Y, Yang M, Ranzato M A, et al. Deepface: Closing the gap to human-level performance in face verification[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1701-1708.
=================================完美分割線====================================
引入
隨著深度學習的出現,CV領域突破很多,甚至掀起了一股CV界的創業浪潮,當次風口浪尖之時,Google豈能缺席。特貢獻出FaceNet再次重新整理LFW上人臉驗證的效果記錄。
FaceNet
與其他的深度學習方法在人臉上的應用不同,FaceNet並沒有用傳統的softmax的方式去進行分類學習,然後抽取其中某一層作為特徵,而是直接進行端對端學習一個從影象到歐式空間的編碼方法,然後基於這個編碼再做人臉識別、人臉驗證和人臉聚類等。
FaceNet演算法有如下要點:
- 去掉了最後的softmax,而是用元組計算距離的方式來進行模型的訓練。使用這種方式學到的影象表示非常緊緻,使用128位足矣。
- 元組的選擇非常重要,選的好可以很快的收斂。
先看具體細節。
網路架構
大體架構與普通的卷積神經網路十分相似:
如圖所示:Deep Architecture就是卷積神經網路去掉sofmax後的結構,經過L2的歸一化,然後得到特徵表示,基於這個特徵表示計算三元組損失。
目標函式
在看FaceNet的目標函式前,其實要想一想DeepID2和DeepID2+演算法,他們都添加了驗證訊號,但是是以加權的形式和softmax目標函式混合在一起。Google做的更多,直接替換了softmax。
所謂的三元組就是三個樣例,如(anchor, pos, neg),其中,x和p是同一類,x和n是不同類。那麼學習的過程就是學到一種表示,對於儘可能多的三元組,使得anchor和pos的距離,小於anchor和neg的距離。即:
所以,變換一下,得到目標函式:
目標函式的含義就是對於不滿足條件的三元組,進行優化;對於滿足條件的三元組,就pass先不管。
三元組的選擇
很少的資料就可以產生很多的三元組,如果三元組選的不得法,那麼模型要很久很久才能收斂。因而,三元組的選擇特別重要。
當然最暴力的方法就是對於每個樣本,從所有樣本中找出離他最近的反例和離它最遠的正例,然後進行優化。這種方法有兩個弊端:
- 耗時,基本上選三元組要比訓練還要耗時了,且等著吧。
- 容易受不好的資料的主導,導致得到的模型會很差。
所以,為了解決上述問題,論文中提出了兩種策略。
- 每N步線下在資料的子集上生成一些triplet
- 線上生成triplet,在每一個mini-batch中選擇hard pos/neg 樣例。
為了使mini-batch中生成的triplet合理,生成mini-batch的時候,保證每個mini-batch中每個人平均有40張圖片。然後隨機加一些反例進去。在生成triplet的時候,找出所有的anchor-pos對,然後對每個anchor-pos對找出其hard neg樣本。這裡,並不是嚴格的去找hard的anchor-pos對,找出所有的anchor-pos對訓練的收斂速度也很快。
除了上述策略外,還可能會選擇一些semi-hard的樣例,所謂的semi-hard即不考慮alpha因素,即:
網路模型
論文使用了兩種卷積模型:
- 第一種是Zeiler&Fergus架構,22層,140M引數,1.6billion FLOPS(FLOPS是什麼?)。稱之為NN1。
- 第二種是GoogleNet式的Inception模型。模型引數是第一個的20分之一,FLOPS是第一個的五分之一。
- 基於Inception模型,減小模型大小,形成兩個小模型。
- NNS1:26M引數,220M FLOPS。
- NNS2:4.3M引數,20M FLOPS。
- NN3與NN4和NN2結構一樣,但輸入變小了。
- NN2原始輸入:224×224
- NN3輸入:160×160
- NN4輸入:96×96
其中,NNS模型可以在手機上執行。
其實網路模型的細節不用管,將其當做黑盒子就可以了。
資料和評測
在人臉識別領域,我一直認為資料的重要性很大,甚至強於模型,google的資料量自然不能小覷。其訓練資料有100M-200M張影象,分佈在8M個人上。
當然,google訓練的模型在LFW和youtube Faces DB上也進行了評測。
下面說明了多種變數對最終效果的影響
網路結構的不同
影象質量的不同
最終生成向量表示的大小的不同
訓練資料大小的不同
對齊與否
在LFW上,使用了兩種模式:
- 直接取LFW圖片的中間部分進行訓練,效果98.87左右。
- 使用額外的人臉對齊工具,效果99.63左右,超過deepid。
總結
- 三元組的目標函式並不是這篇論文首創,我在之前的一些Hash索引的論文中也見過相似的應用。可見,並不是所有的學習特徵的模型都必須用softmax。用其他的效果也會好。
- 三元組比softmax的優勢在於
- softmax不直接,(三元組直接優化距離),因而效能也不好。
- softmax產生的特徵表示向量都很大,一般超過1000維。
- FaceNet並沒有像DeepFace和DeepID那樣需要對齊。
- FaceNet得到最終表示後不用像DeepID那樣需要再訓練模型進行分類,直接計算距離就好了,簡單而有效。
- 論文並未探討二元對的有效性,直接使用的三元對。
參考文獻
[1]. Schroff F, Kalenichenko D, Philbin J. Facenet: A unified embedding for face recognition and clustering[J]. arXiv preprint arXiv:1503.03832, 2015.
=================================完美分割線====================================
Taily老段的微信公眾號,歡迎交流學習