1. 程式人生 > >我讀FaceNet

我讀FaceNet

背景

論文地址:FaceNet: A Unified Embedding for Face Recognition and Clustering
程式碼地址:GitHub(非官方)
谷歌人臉檢測演算法,發表於 CVPR 2015,利用相同人臉在不同角度等姿態的照片下有高內聚性,不同人臉有低耦合性,提出使用 cnn + triplet mining 方法,在 LFW 資料集上準確度達到 99.63%,在 youtube 人臉資料集上準確度 95.12%,比以往準確度提升了將近 30%。

方法

通過 CNN 將人臉對映到歐式空間的特徵向量上,計算不同圖片人臉特徵的距離,通過相同個體的人臉的距離,總是小於不同個體的人臉

這一先驗知識訓練網路。
測試時只需要計算人臉特徵,然後計算距離使用閾值即可判定兩張人臉照片是否屬於相同的個體。

實現

  1. 對圖片使用 CNN 網路提取特徵向量。
    1. 存在特徵向量的維度選擇問題,維度約小計算越快,但是太小的話很難區分不同圖片;維度越大越容易區分不同圖片,但是太大訓練模型不易收斂,且測試時計算慢,佔用空間大。作者實驗證明 128 維的特徵能夠較好的平衡這個問題。
    2. CNN 模型的選擇,高精度的模型往往引數多,計算量大。移動裝置上最好使用體積小,精度略低的模型;伺服器上可以使用高精度,高計算量的模型。
  2. 使用三元損失函式。
    1. 之前的工作有人使用的是二元損失函式,二元損失函式的目標是把相同個體的人臉特徵對映到空間中的相同點,而三元損失函式目標是對映到相同的區域,使得類內距離小於類間距離。
      這裡寫圖片描述
    2. 假設 x 是輸入的圖片,f(x)Rd 是 CNN 表示後的特徵向量,三元函式為 f(xai)f(xpi)22+α<f(xai)f(xni)22,(f(xai),f(xpi),f(xni))T,所以最終的損失函式為:iN[f(xai)f(xpi)22f(xai)f(xni)22]+α
  3. 可以看到上面的公式中需要三個輸入人像,如何選擇這一個三元組訓練呢?為了保證訓練收斂速度,我們就選擇距離最遠的相同人像,和距離最近的不同人像來訓練好了。於是作者在每個 mini-batch 中進行上述選擇。
  4. 卷積網路。選擇模型是常見的問題,作者針對 ZF/GoogLeNet 做了不同的測試。
  5. 最終驗證。通過計算不同圖片的特徵向量的距離,使用閾值後得到結果。

實驗結果

不同的網路模型

這裡寫圖片描述

不同的訓練集合大小

這裡寫圖片描述

不同的特徵維度大小

這裡寫圖片描述

不同圖片質量

這裡寫圖片描述

總結

  • 提取特徵直接計算距離,比之前的使用 PCA + SVM 更加簡單,訓練的損失函式直接針對實際誤差,end-to-end 方式訓練都能提高精度
  • 只要有個人臉的 bounding box 就行