使用深度學習進行人臉辨識: Triplet loss, Large margin loss(ArcFace)

張家銘
Taiwan AI Academy
Published in
10 min readJan 23, 2021
https://www.sodapdf.com/blog/facial-recognition/

人臉辨識的目標是確定一張人臉影像的身份,即這個人是誰,這是機器學習中的分類問題,人臉辨識主要分成兩個種類。

  • Face Verification (人臉驗證)
1. 輸入影像與 name/ID
2. 輸出是否為此人
3. 視為 1:1 matching problem

主要應用在:

  • Face Recognition (人臉辨識)
1. 擁有 K 個人物的 Database
2. 輸入影像
3. 如果影像中的人物為 K 個人物中的其中一個,則輸出對應的 name/ID,否則則無法識別 (not recognized)。
4. 視為 1:K matching problem

主要應用在:

人臉辨識主要分成三個模塊:

  1. 人臉偵測 (Face Detection)
  2. 人臉對齊 (Face Alignment)
  3. 特徵表徵 (Feature Representation)

先輸入一張影像,使用人臉偵測找到影像中的人臉邊界框位置 (Bbox) 與關鍵點位置 (landmarks),透過 Bbox 或 landmarks,我們可以使用人臉對齊將五官對齊,讓輸入影像有很好的統一性,再使用 Deep Neural Network 將 Crop 好的人臉 embedding 成特徵表徵,並使用這些特徵來進行人臉辨識

1. Face Detection

其實就是物件偵測的一種,另外可以增加訓練 5 個 landmark 資訊,包含左眼、右眼、鼻子、左嘴角、右嘴角,洞見實驗室將常見的資料集 WiderFace 標上 landmark 資訊,並發展出 RetinaFace 是個很大的貢獻,常見的 Face Detection 模型:

  • MTCNN
  • RetinaFace

2. Face Alignment

同一個人在不同的影像中可能會出現不同的姿態和表情,這種情況是不利於人臉辨識的,所以有必要將人臉影像都轉換到一個統一的角度和姿態,這就是人臉對齊。

它的原理是找到人臉的若干個關鍵點,並透過這些對應的關鍵點進行相似變換,將人臉盡可能變換到標準人臉,下圖是一個典型的人臉對齊過程:

3. Feature Representation

第三個模塊是本次重點要講的人臉辨識算法,它接受的輸入是人臉對齊影像,通過特徵建模得到特定長度的人臉特徵向量 (例如 128 維的向量),最後再通過聚類 (Clutering)、相似性偵測 (Similarity detection)、分類 (Classification) 等各種方法得到人臉辨識的結果。

人臉辨識技術

在 2014 年前都是使用傳統的方法來進行人臉辨識,直到 Deepface 問世,才開始使用了 Deep learning。

使用 Deep learning 來進行人臉辨識所遇到的問題:

  1. 小資料
    每個人物可能只有少許照片甚至是一張照片,我們該如何透過少許樣本就讓辨識系統知道是否為本人,如果只有少許訓練資料讓 CNN 去訓練,這效果是不好的,我們該如何解決?
  2. 新的人物
    當有新的人物要加入 CNN 模型進行識別時,又要重新訓練,因為 softmax 又多一個類別,這勢必是很麻煩的,我們該如何解決?

答案:使用 One-shot/few-shot learning Problem

當我們使用美少女的訓練集訓練一個模型,這個模型可以很好的辨識這五個人,而我們想將這個模型拿來辨識除了這五個美少女以外的人,例如:新垣結衣、廣末涼子、江祖平。

3-ways 1-shot 代表有 3 個類別而每個類別只有 1 張訓練資料

這聽起來很神奇,那我們該如何做這件神奇的事呢?

我們將對齊後的影像輸入到模型中,進而得到 128 維的特徵向量,並使用歐式距離來判斷其相似性,並設定一個閾值 (例如1) 進而判斷是否是同一個人。

例如下圖中
兩張新垣結衣的歐式距離是 0.66,並且小於設定的閾值 (例如1),因此是同一個人
新垣結衣和廣末涼子的歐式距離則是 1.12,並且大於設定的閾值 (例如1),因此不是同一個人

loss 進化史

DeepFace 是 CVPR2014 上由 Facebook 提出的方法,是深度卷積神經網絡在人臉辨識領域的奠基之作,深度卷積神經網絡針對對齊後的人臉 Patch 進行多類的分類學習,使用的是經典的交叉熵損失函數 (Softmax) 進行問題優化,最後通過特徵嵌入 (Feature Embedding) 得到固定長度的人臉特徵向量,DeepFace 在 LFW 上取得了97.35%的準確率,已經接近了人類的水平。

Deepface network architecture

然而我們希望在 Embedding Space 中,同個人的距離能越靠近越好,不同人的距離能越遠越好,這樣使用歐式距離來判斷是否是同個人時才能有很好的結果。

而 Softmax 的缺點是他只鼓勵不同類別的特徵分開,如下表 feature 從 [1, 1, 1, 1] 變成 [5, 1, 1, 1] 時 cross entropy loss 從 0.3465 下降到 0.0133,此時梯度接近收斂就不再下降了。

所以可以看到,如果你使用 L2 距離或 cos 距離來判斷是否是同個人時會有錯誤的情形發生。

  • L2 距離:黃色的虛線比綠色的虛線長,但是虛線比較長的卻是同個人。
  • cos 距離:黃色的角度比綠色的角度大,但是角度比較大的卻是同個人。

為了解決這個問題,有關人臉的 loss 開始進化...,詳細的進化史可以查看人臉辨識中 Softmax-based Loss 的演化史

  • 2014: softmax
  • 2015: contrastive loss, triplet loss
  • 2016: center loss
  • 2017: weight and feature normalization
  • 2018–2020: large margin loss

Triplet loss

Google 在 2015 年時推出了 FaceNet,並使用三元組損失函數 (Triplet Loss) 代替常用的 Softmax 交叉熵損失函數。

  • Anchor: 給定一個要比較的人臉
  • Positive: 跟 Anchor 同個類別的影像,也就是同個人
  • Negative: 跟 Anchor 不同類別的影像,也就是不同人

我們的目標是經由學習後 Anchor 和 Positive 要越近越好,Anchor 和 Negative 要越遠越好

經由訓練後,進而在一個超球空間上進行優化,使得類內距離更緊湊,類間距離更遠,最後得到了一個緊湊的 128 維人臉特徵,其網絡使用 GoogLeNet 的 Inception 模型,模型參數量較小,精度更高,在 LFW 上取得了 99.63% 的準確率。

為了節省運算資源,因此使用了 Siamese Neural Network 的架構 (由 DeepFace 提出),簡單來說就是網路的權重都是一樣的 (sharing weights),將 Positive(P), Anchor(A), Negative(N) 同時輸入 Net 後分別得到 Embedding f(P), f(A), f(N),目標是 ||f(A)-f(P)|| 越小越好、||f(A)-f(P)|| 越大越好

更詳細的解說可以觀看吳恩達老師的影片: Youtube 連結

Large margin loss

最常用的分類損失函數: softmax loss,x 代表最後一層的 feature、W 代表最後一層的權重,b 代表 bias。

為了方便,我們將 b 設為 0,而點積是兩個向量的長度與它們夾角餘弦的乘積,因此可以寫成這樣:

為了方便優化將特徵和權重都標準化,另外再乘以一個縮放因子 scale: s,就會變成:

為什麼要乘以縮放因子 s ?

由於我們將特徵和權重都標準化,因此我們算出來的值為 cos(θ),而 cos(θ) 的值域為 [-1, 1],在 cos(θ)=1,其他 feature 為 0 的情況下,算出來的 CE loss 為 0.744 ,卻無法再優化了。因此我們乘上縮放因子 s=30 後才能很好的優化權重。

然後引入了 margin 的概念,讓 weight 和 feature 的角度越小越好,如果他們角度很小,代表每個類別都分得很開。

加入 margin 的效果如下圖所示:

這樣我們就可以達到我們要的效果,即類內很近、類間很遠。可以透過簡單的歐式距離相減就獲得兩個人臉是否接近,進而達到人臉辨識的效果。

Keras implementation of ArcFace, CosFace, and SphereFace in mnist dataset: https://github.com/4uiiurz1/keras-arcface

--

--