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

- Batch:是指輸入的人臉圖像樣本;
- Deep Architecture:作者使用了兩種模型
- 22層的Zelier&Fergus的網絡
- Inception網絡
- L2:是指特征歸一化(使其特征的|fx|2=1。這樣所有圖像的特征都會被映射到一個超球面上)
- Embeddings:就是前面經過深度學習網絡,L2歸一化後生成的特征向量;
- Triplet Loss:就是有三張圖檔輸入的Loss;
Triplet loss原理
上述式子可以寫成損失函數:L =
Triplet Selection(generate)
論文中指出,如果我們按照上述損失函數計算的話,那麼我們窮舉的這個三元組集合是非常大的。例如:person sum =100,每人20張照片,那麼三元組集合大小為:總圖檔數*每個圖檔類内組合*每個圖檔類間組合,即:
T =(100*20)*19*(20*99)
這樣的複雜度是:O(T)=N^2。如果類别繼續增大,訓練起來會更加困難。是以作者解釋可以選擇那些最困難的圖檔來組成三元組,具體的來說,選出同一個人中最不像他的那張(hard positive∈19圖像),在其他的認重選出最像他的那張(hard negative∈20*99圖像)的兩張圖檔組成三元組。
那麼如何進行挑選呢?在整個訓練集上尋找argmax和argmin是困難的。如果找不到,會使訓練變得困難,難以收斂,例如錯誤的打标簽和差勁的反映人臉。是以需要采取兩種顯而易見的方法避免這個問題:offline和online方法,具體的差别隻是在訓練上。
Offline: 每隔n步離線生成三元組,使用最新的網絡模型的檢查點并計算資料子集上的argmin和argmax。參考這樣了解:訓練網絡之前把樣本分成 N 份,分别計算每一份樣本的最大值和最小值(anchor 與 positive 歐式距離最大值,與negative 歐式距離最小值,選出 hard-positive/negative,下文的最大值、最小值都是這個意思),然後依次用這些資料訓練網絡,比如從第一份資料開始,訓練完成後保持模型的參數,然後這些參數作為第二份資料訓練模型時的初始化參數,依次類推。
Online: 在mini-batch上,選擇不好的正(類内)/負(類間)訓練模型(一個mini-batch可以訓練出一個子模型)。論文中選擇Sample people為1800張照片數。
在具體的代碼中設定參數如下:
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的浮點運算量 |