天天看點

【FaceNet】人臉識别模型之FaceNet架構

論文:FaceNet: A Unified Embedding for Face Recognition and Clustering

來源:CVPR 2015

4.1 摘要

我們的方法使用一個經過訓練的深度卷積網絡來直接優化嵌入本身,而不是像以前的深度學習方法那樣使用一個中間的瓶頸層。其網絡結構靈活性較大可以使22層的Zelier&Fergus的網絡,也可以使用現在在物體識别裡面效果比較好的inception網絡。其主要特點采用三元對之間的距離建構損失函數,每一個人臉輸出為128次元,作為表征特征。

4.2 方法

【FaceNet】人臉識别模型之FaceNet架構
  • Batch:是指輸入的人臉圖像樣本;
  • Deep Architecture:作者使用了兩種模型
    1. 22層的Zelier&Fergus的網絡
    2. Inception網絡
  • L2:是指特征歸一化(使其特征的|fx|2=1。這樣所有圖像的特征都會被映射到一個超球面上)
  • Embeddings:就是前面經過深度學習網絡,L2歸一化後生成的特征向量;
  • Triplet Loss:就是有三張圖檔輸入的Loss;

Triplet loss原理

【FaceNet】人臉識别模型之FaceNet架構
【FaceNet】人臉識别模型之FaceNet架構

上述式子可以寫成損失函數:L =

【FaceNet】人臉識别模型之FaceNet架構

Triplet Selection(generate)

論文中指出,如果我們按照上述損失函數計算的話,那麼我們窮舉的這個三元組集合是非常大的。例如:person sum =100,每人20張照片,那麼三元組集合大小為:總圖檔數*每個圖檔類内組合*每個圖檔類間組合,即:

T =(100*20)*19*(20*99)

這樣的複雜度是:O(T)=N^2。如果類别繼續增大,訓練起來會更加困難。是以作者解釋可以選擇那些最困難的圖檔來組成三元組,具體的來說,選出同一個人中最不像他的那張(hard positive∈19圖像),在其他的認重選出最像他的那張(hard negative∈20*99圖像)的兩張圖檔組成三元組。

【FaceNet】人臉識别模型之FaceNet架構

    那麼如何進行挑選呢?在整個訓練集上尋找argmax和argmin是困難的。如果找不到,會使訓練變得困難,難以收斂,例如錯誤的打标簽和差勁的反映人臉。是以需要采取兩種顯而易見的方法避免這個問題:offline和online方法,具體的差别隻是在訓練上。

  Offline: 每隔n步離線生成三元組,使用最新的網絡模型的檢查點并計算資料子集上的argmin和argmax。參考這樣了解:訓練網絡之前把樣本分成 N 份,分别計算每一份樣本的最大值和最小值(anchor 與 positive 歐式距離最大值,與negative 歐式距離最小值,選出 hard-positive/negative,下文的最大值、最小值都是這個意思),然後依次用這些資料訓練網絡,比如從第一份資料開始,訓練完成後保持模型的參數,然後這些參數作為第二份資料訓練模型時的初始化參數,依次類推。

  Online: 在mini-batch上,選擇不好的正(類内)/負(類間)訓練模型(一個mini-batch可以訓練出一個子模型)。論文中選擇Sample people為1800張照片數。

       在具體的代碼中設定參數如下:

【FaceNet】人臉識别模型之FaceNet架構

Deep Convolutional Networks

NN1 ZF-Net(Zeiler&Fergus) 在前幾個卷積層加入了1*1*d的卷積層,有效的減小了參數的個數,140M個參數,1.6B次浮點計算
NN2 GooleNet

1.使用的是L2池化而不是max池化。

2.池化的卷積核大小一般是3*3(除了最後那個平均池化),并且并行于每個輸入子產品裡的卷積子產品。

如果在1*1,3*3,5*5池化後有次元下降,那麼把它們連接配接起來作為最後的輸出。7.5M個參數,1.6B次浮點計算

NN3 GooleNet 與NN2結構一樣,但輸入圖檔大小隻有160*160。這樣極大幅度的降低了對CPU的需求
NN4 GooleNet 與NN2結構一樣,但輸入圖檔大小隻有96*96。這樣極大幅度的降低了對CPU的需求,285M次浮點運算
NNS1 剪裁後GooleNet 26M個參數,220M次浮點計算
NNS2 剪裁後GooleNet 4.3M的參數和20M的浮點運算量