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生成的特征向量進行計算。

之前的人臉識別方法是在一個已知人臉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個深度卷積網絡:

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

作者實驗發現這些模型可以減少20倍以上的參數,並且因為減少了FLOPS的數量,所以計算量也下降了。
FaceNet采用了一個深度卷積網絡,這部分有2種選擇(上述兩種),整體結構如下圖

通過將深度卷積網絡視為一個黑盒子,來進行介紹會更方便一些。整個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\)(負樣本)。如下圖所示

因此,符合如下形式:

\[||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\)。而且,如一些誤標記和質量不高的人臉圖像也滿足此類需求,而這些樣本會導致訓練引入更多噪音。這可以通過兩個明顯的選擇避免此類問題:

  • 每隔\(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 實驗及分析

......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM