本文來自《FaceNet: A Unified Embedding for Face Recognition and Clustering》。時間線爲2015年6月。是谷歌的做品。網絡
雖然最近人臉識別領域取得了重大進展,但大規模有效地進行人臉驗證和識別仍是有着不小的挑戰。Florian Schroff等人所以提出了FaceNet模型,該模型能夠直接將人臉圖片映射到歐式空間中。在該空間中,歐式embedding能夠用平方的L2距離直接表示人臉的類似度:架構
- 相同ID的人臉距離較小;
- 不一樣ID的人臉距離較大。
也就是一旦若是是能直接映射到歐式空間中,那麼如人臉識別,驗證和人臉聚類均可以基於現有的標準方法直接用FaceNet生成的特徵向量進行計算。ide
以前的人臉識別方法是在一個已知人臉ID數據集下,基於一個分類層訓練深度網絡,而後將中間的bottleneck層做爲表徵去作人臉識別的泛化(即基於訓練集訓練一個特徵提取模型,而後將該模型,如sift同樣在未知人臉甚至未知ID的人臉上提取特徵)。此類方法缺點是間接性和低效性:函數
- 作預測的時候,指望bottleneck表徵可以很好的對新人臉進行泛化;
- 經過使用該bottleneck層,每一個人臉獲得的特徵向量維度是很大的(好比1k維)。雖然有工做基於PCA作特徵約間,可是PCA是一個線性模型。
FaceNet使用訓練後的深度卷積網絡直接對嵌入向量進行優化,而不是如以前的DL方法同樣去優化所謂的bottleneck層。FaceNet基於《Distance metric learning for large margin nearest neighbor classification》採用triplet loss進行訓練,並輸出只有128維的embedding向量。這裏的triplet包含人臉三元組(即三張人臉圖片\(a,b,c\),其中\(a,b\)是來自同一個ID的人臉,\(c\)是其餘ID的人臉),loss的目的就是經過一個距離邊際去劃分正對和負樣本。這裏人臉圖片是隻包含人臉區域的圖片塊,並不須要嚴格的2D或者3D的對齊,只須要作尺度縮放和平移便可。學習
固然選擇哪一種triplet也是很重要的,受到《Curriculum learning》的啓發,做者提出一個在線負樣本挖掘策略,以此保證持續性增長網絡訓練過程當中的困難程度(分類越是錯誤的,包含的修正信息越多)。爲了提高聚類準確度,同時提出了硬正樣本挖掘策略,以提高單人的embedding特徵球形聚類效果(一個聚類簇就是一我的的多張人臉圖片)。
優化
類似於其餘採用深度網絡的方法,FaceNet也是一個徹底數據驅動的方法,直接從人臉像素級別的原始圖像開始訓練,獲得整我的臉的表徵。不使用工程化後的特徵,做者暴力的經過一大堆標記人臉數據集去解決姿態,光照和其餘不變性(數據爲王)。本文中採用了2個深度卷積網絡:spa
- 基於《Visualizing and understanding convolutional networks》的深度網絡(包含多個交錯的卷積層,非線性激活,局部響應歸一化(local response normalizations)和最大池化層),增長了幾個額外的1x1xd卷積層;
- 基於Inception模型。
做者實驗發現這些模型能夠減小20倍以上的參數,而且由於減小了FLOPS的數量,因此計算量也降低了。
FaceNet採用了一個深度卷積網絡,這部分有2種選擇(上述兩種),總體結構以下圖
3d
embedding表示爲\(f(x)\in R^d\)。經過將一個圖片\(x\)嵌入到d維歐式空間中。另外,限制這個embedding,使其處在d維超球面上,即\(||f(x)||_2=1\)。這裏要確保一個特定人的圖片\(x_i^a\)(錨)和該人的其餘圖片\(x_i^p\)(正樣本)相接近且距離大於錨與其餘人的圖片\(x_i^n\)(負樣本)。以下圖所示
rest
爲了保證快速收斂,須要找到那些反模式的triplet,即給定\(x_i^a\),須要選擇的\(x_i^p\)(硬正樣本)可以知足\(\underset{x_i^p}{\arg max}||f(x_i^a)-f(x_i^p)||_2^2\),類似的,\(x_i^n\)(硬負樣本)可以知足\(\underset{x_i^n}{\arg min}||f(x_i^a)-f(x_i^n)||_2^2\)。顯然無法基於整個訓練集計算\(\arg min\)和\(\arg max\)。並且,如一些誤標記和質量不高的人臉圖像也知足此類需求,而這些樣本會致使訓練引入更多噪音。這能夠經過兩個明顯的選擇避免此類問題:orm
- 每隔\(n\)步離線的生成triplets,使用最近的網絡checkpoint,用其基於訓練集的子集計算\(\arg min\),\(\arg max\);
- 在線生成triplet,這經過一個mini-batch內部選擇硬正/負樣本對來實現。
本文主要關注在線生成方式。經過使用一個包含上千個樣本的大mini-batch去計算所須要的\(\arg min\),\(\arg max\)。而爲了確保能計算到triplet,那麼就須要訓練使用的mini-batch中必定要包含(錨,正類,負類)樣本。FaceNet的實驗中,對訓練數據集進行採樣,如每一個mini-batch中每一個ID選擇大概40個圖片。另外在對每一個mini-batch隨機採樣須要的負樣本。
不直接挑選最硬的正樣本,在mini-batch中會使用全部的(錨,正)樣本對,同時也會進行負樣本的選擇。FaceNet中,並無將全部的硬(錨,正)樣本對進行比較,不過發如今實驗中全部的(錨,正)樣本對在訓練的開始會收斂的更穩定,更快。做者同時也採用了離線生成triplet的方法和在線方法相結合,這可讓batch size變得更小,不過實驗沒作完。
在實際操做中,選擇最硬的負樣本會致使訓練之初有較壞的局部最小,特別會致使造成一個摺疊模型(collapsed model),即\(f(x)=0\)。爲了減緩這個問題,便可以選擇的負樣本知足:
\[||f(x_i^a)-f(x_i^p)||_2^2<||f(x_i^a)-f(x_i^n)||_2^2\]
這些負樣本稱爲」半硬(semi-hard)「,即雖然他們比正樣本要遠離錨,不過平方的距離是很接近(錨,正)樣本對的距離的,這些樣本處在邊際\(\alpha\)內部。
如上所述,正確的triplets樣本對的選擇對於快速收斂相當重要。一方面,做者使用小的mini-batch以提高SGD的收斂速度;另外一方面,仔細的實現步驟讓batch是包含10或者百的樣本對卻更有效。因此主要的限制參數就是batch size。本實驗中,batch size是包含1800個樣本。
本實驗中,採用SGD方式和AdaGrad方式訓練CNN,在實驗中,學習率開始設定爲0.05,而後慢慢變小。模型如《Going deeper with convolutions》同樣隨機初始化,在一個CPU集羣上訓練了1k到2k個小時。在訓練開始500h以後,loss的降低開始變緩,不過接着訓練也明顯提高了準確度,邊際\(\alpha\)爲0.2。如最開始介紹的,這裏有2個深度模型的選擇,他們主要是參數和FLOPS的不一樣。須要按照不一樣的應用去決定不一樣的深度網絡。如數據中心跑的模型能夠有許多模型,和較多的FLOPS,而運行在手機端的模型,就須要更少的參數,且要能放得下內存。全部的激活函數都是ReLU。
第二個策略就是GoogleNet,其相比少了20多倍的參數(大概6.6百萬-7.5百萬),且少了5倍的FLOPS(基於500M-1.6B)。因此這裏的模型能夠運行在手機端。如:
- NNS1只有26M參數量,須要220M FLOPS的計算;
- NNS2有4.3M參數量,且只須要20M FLOPS計算量。
表2描述了NN2網絡結構,NN3架構是同樣的,只是輸入層變成了160x160。NN4輸入層只有96x96,所以須要更少的CPU計算量(285M的FLOPS,而NN2有1.6B)。另外,爲了減小輸入尺度,在高層網絡層,也不使用5x5的卷積。並且實驗發現移除了5x5的卷積,對最後結果沒什麼影響。如圖4
......