使用深度學習進行人臉辨識: Triplet loss, Large margin loss(ArcFace)
人臉辨識的目標是確定一張人臉影像的身份,即這個人是誰,這是機器學習中的分類問題,人臉辨識主要分成兩個種類。
- 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
主要應用在:
人臉辨識主要分成三個模塊:
- 人臉偵測 (Face Detection)
- 人臉對齊 (Face Alignment)
- 特徵表徵 (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 來進行人臉辨識所遇到的問題:
- 小資料:
每個人物可能只有少許照片甚至是一張照片,我們該如何透過少許樣本就讓辨識系統知道是否為本人,如果只有少許訓練資料讓 CNN 去訓練,這效果是不好的,我們該如何解決? - 新的人物:
當有新的人物要加入 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%的準確率,已經接近了人類的水平。
然而我們希望在 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