face recognition[Euclidean-distance-based loss][FaceNet]


本文來自《FaceNet: A Unified Embedding for Face Recognition and Clustering》。時間線爲2015年6月。是谷歌的做品。網絡

0 引言

雖然最近人臉識別領域取得了重大進展,但大規模有效地進行人臉驗證和識別仍是有着不小的挑戰。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特徵球形聚類效果(一個聚類簇就是一我的的多張人臉圖片)。
優化


正如圖1所示,其中的陰影遮擋等對於以前的人臉驗證系統簡直是噩夢。

1 FaceNet

類似於其餘採用深度網絡的方法,FaceNet也是一個徹底數據驅動的方法,直接從人臉像素級別的原始圖像開始訓練,獲得整我的臉的表徵。不使用工程化後的特徵,做者暴力的經過一大堆標記人臉數據集去解決姿態,光照和其餘不變性(數據爲王)。本文中採用了2個深度卷積網絡:spa

  • 基於《Visualizing and understanding convolutional networks》的深度網絡(包含多個交錯的卷積層,非線性激活,局部響應歸一化(local response normalizations)和最大池化層),增長了幾個額外的1x1xd卷積層;
  • 基於Inception模型。

做者實驗發現這些模型能夠減小20倍以上的參數,而且由於減小了FLOPS的數量,因此計算量也降低了。
FaceNet採用了一個深度卷積網絡,這部分有2種選擇(上述兩種),總體結構以下圖
3d


經過將深度卷積網絡視爲一個黑盒子,來進行介紹會更方便一些。整個FaceNet結構是end-to-end的,在結構的最後採用的itriplet loss,直接反映了人臉驗證,識別和聚類所獲取的本質。即獲取一個embedding \(f(x)\),將一個圖像 \(x\)映射到特徵空間 \(R_d\)中,這樣來自同一個ID的不一樣圖像樣本之間距離較小,反之較大。
這裏採用Triplet loss是來自《Deep learning face representation by joint identification-verification》的靈感,相比而言,triplet loss更適合做爲人臉驗證,雖然前面《·》的loss更偏向一個ID的全部人臉都映射到embedding空間中一個點。不過triplet loss會增大不一樣ID之間的人臉邊際,同時讓一個ID的人臉都落在一個流行上。

1.1 triplet loss

embedding表示爲\(f(x)\in R^d\)。經過將一個圖片\(x\)嵌入到d維歐式空間中。另外,限制這個embedding,使其處在d維超球面上,即\(||f(x)||_2=1\)。這裏要確保一個特定人的圖片\(x_i^a\)(錨)和該人的其餘圖片\(x_i^p\)(正樣本)相接近且距離大於錨與其餘人的圖片\(x_i^n\)(負樣本)。以下圖所示
rest


所以,符合以下形式:
\[||f(x_i^a)-f(x_i^p)||_2^2+\alpha < ||f(x_i^a)-f(x_i^n)||_2^2,\, \, \forall (f(x_i^a),f(x_i^p),f(x_i^n))\in T \]
這裏 \(\alpha\)是邊際用於隔開正對和負對。 \(T\)是訓練集中全部可能的triplets,且其有 \(N\)個候選三元組
這裏loss能夠寫成以下形式:
\[\sum_i^N\left [ ||f(x_i^a)-f(x_i^p)||_2^2-||f(x_i^a)-f(x_i^n)||_2^2+\alpha\right ]_+\]
基於全部可能的triplets組合,能夠生成許多的triplet。這些triplet中有許多對網絡訓練沒有什麼幫助,會減慢網絡的收斂所需時間,因此須要挑出那些信息量大的triplet組合。

1.2 triplet 選擇

爲了保證快速收斂,須要找到那些反模式的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個樣本。

1.3 深度卷積網絡

本實驗中,採用SGD方式和AdaGrad方式訓練CNN,在實驗中,學習率開始設定爲0.05,而後慢慢變小。模型如《Going deeper with convolutions》同樣隨機初始化,在一個CPU集羣上訓練了1k到2k個小時。在訓練開始500h以後,loss的降低開始變緩,不過接着訓練也明顯提高了準確度,邊際\(\alpha\)爲0.2。如最開始介紹的,這裏有2個深度模型的選擇,他們主要是參數和FLOPS的不一樣。須要按照不一樣的應用去決定不一樣的深度網絡。如數據中心跑的模型能夠有許多模型,和較多的FLOPS,而運行在手機端的模型,就須要更少的參數,且要能放得下內存。全部的激活函數都是ReLU。


如表1中採用的是第一種方法,在標準的卷積層之間增長1x1xd的卷積層,獲得一個22層的模型,其一共140百萬個參數,每一個圖片須要1.6十億個FlOPS的計算。

第二個策略就是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

2 實驗及分析

......

相關文章
相關標籤/搜索