人臉識別總結(附開源項目代碼與各大數據集下載路徑)

2019年4月8日 更新html

人臉識別總結

概要

人臉識別在深度學習領域裏算是一項較爲成功的應用,在平常生活中,常常能夠見到人臉識別的設備,如人臉考勤機,各大交通站點的閘機,移動支付等。本人在從事人臉識別算法開發的短短一年時間裏,也關注了很多論文和大佬們,對相關的技術發展也有了一些皮毛上的瞭解,在這裏記錄一下。本文的主要結構以下:git

網絡模型

深度學習發展至今,主流的 CNN 網絡有 VGG, GoogleLeNet, ResNet, ResNeXt, DenseNet 等。其中,基於 ResNet 的開源人臉識別模型最爲常見,如 InsightFacewy1iu/spherefaceageitgey/face_recognition 等。github

本文主要介紹一下ResNet, 該模型結構是何凱明大神的團隊提出的,用於解決深度學習模型因深度加深而致使的「退化」問題。因爲網絡深度增長後,梯度消失或者爆炸的問題就會接踵而來,所以模型達不到很優的收斂效果。關於梯度爆炸與消失的問題,能夠參考博客詳解機器學習中的梯度消失、爆炸緣由及其解決方法。針對這個問題,做者提出了一個殘差(Residual)的結構,以下:算法

對於一個簡單的 block , 當輸入爲 x 時其學習到的特徵記爲 H(x) ,做者經過增長了一個恆等映射(identity mapping),將所須要學習的 H(x) 轉換成學習殘差 F(x)=H(x)-x 。這一想法源於圖像處理中的殘差向量編碼,經過一個reformulation,將一個問題分解成多個尺度直接的殘差問題,可以很好的起到優化訓練的效果。除了上圖中常規的殘差結構外,針對於更深層的 ResNet 網絡,還有以下的變體:網絡

該結構的目的主要是爲了下降模型的計算和參數量,使模型具備深層的語義表達能力的同時,兼具較快的速度,有利於實際應用需求。常見的 ResNet 網絡結構有 18, 34, 50, 101, 152 層,詳細以下:app

從該表能夠看出,ResNet 的結構能夠分爲 conv1,conv2_x,conv3_x,conv4_x,conv5_x ,共 5 個部分,每一個部分的殘差結構數目各不相同。關於其層數計算,拿 101 層的網絡爲例,每層的 block 數目爲 conv2_x:3, conv3_x:4,conv4_x:23,conv5_x:3,共計 33 個 block, 再加上 conv1 和模型最後的 FC 層,爲 101 層網絡。框架

如下是收集的有關 CNN 網絡的論文和博客等資料。機器學習

LOSS

人臉識別中所用的 LOSS 真的是百花齊放,從最基礎的 SoftMax 到加入各類 trick 的 ArcFace, 從歐氏距離到餘弦距離,從無 Margin 到加入 Margin。整理了一下,大概有以下幾種:ide

  • L2-softmax: L2-constrained Softmax Loss for Discriminative Face Verification函數

    原始的 softmax 未優化提取的人臉特徵,而 L2-softmax 添加了一個 L2 約束,使得類內的距離減少。實驗結果:在 LFW 上的準確率達到 99.78%, YTF 上的準確率爲 96.08%。

    該方法主要針對輸入到 Loss Layer 的數據先作一步歸一化的操做,而後對該歸一化的值放大 α 倍,最後使用普通的 Softmax 函數進行計算。

  • Contrastive Loss: Dimensionality Reduction by Learning an Invariant Mapping

    主要是用在降維中,即原本類似的樣本,在通過降維(特徵提取)後,在特徵空間中,兩個樣本仍舊類似;而本來不類似的樣本,在通過降維後,在特徵空間中,兩個樣本仍舊不類似。在人臉識別中,DeepID 運用了該 loss,結合 Softmax + Contrastive Loss 在 LFW 上的準確率爲 99.53%。更多關於 DeepID 的介紹能夠參考 Deep learning face representation from predicting 10,000 classes

    該方法主要經過輸入兩張不一樣的人臉圖像,若爲相同的人,即 yij = 1, 就讓其 loss 儘量小, 若未不一樣的人,即yij = -1, 則讓特徵之間的距離大於一個固定的間距 m。

  • Triplet Loss: FaceNet: A Unified Embedding for Face Recognition and Clustering

    該 Loss 主要用於優化人臉識別模型,對於輸入到模型中的若干我的臉圖像,提取其特徵並計算相互之間的歐氏距離,選擇特定的三元組(a, p, n), 優化類內和類間的距離。FaceNet 僅僅使用 128 維的特徵,就在 LFW 上達到了 99.63% 。Triplet Loss 針對於人臉認證的場景能夠有較好的提高,強力推薦一波。
    三元組的選取規則爲,隨機從訓練樣本中取一個樣本,標記爲 anchor, 而後再隨機選取一個與 anchor 同個類別的樣本,標記爲 positive, 最後隨機選取一個不一樣類別的樣本,標記爲 negative。關於三元組的選取規則,裏面還能夠有不少 trick,經過按樣本特徵之間的距離選取來替換隨機的方式能夠有更顯著的效果。三元組的損失函數以下:

    triplet loss 選用的爲歐式距離,附加一個 α 用於增大類別之間的距離,須要說明的是,公式末尾的 ‘+’ 表示當計算值大於 0 時,該值即爲損失值,小於 0 時,損失值爲 0。tirplet loss 的缺點爲選取三元組的操做複雜繁瑣,實現困難。

  • Center Loss: A Discriminative Feature Learning Approach for Deep Face Recognition

    Center Loss 爲每一個類別都學習一個分類中心,並將每一個類別的全部人臉特徵都彙集到其對應的類別中心,即便得類內更加緊湊。做者僅使用 0.7 M 的訓練樣本,7 層的 CNN 在 LFW 上達到了 99.28% 的精度。

    可是該 loss 並不能直接使用,由於對於龐大的訓練集而言,要兼顧到全部類別樣本的特徵是很是低效的。因此做者進行了兩個改變,一是基於小批量更新類別中心,每次迭代經過單次迭代每一個類別樣本的平均特徵來更新對應的中心值,二是爲了不少許錯誤樣本致使類別中心波動幅度較大,經過一個標量 α 來控制它的更新學習率。類別中心的更新公式以下:

    δ 函數爲當條件知足時返回1, 不知足則返回0, α 的值爲[0,1]。最終做者聯合了 softmax loss 和 center loss,使得該 loss 能夠用於 CNN 網絡模型的訓練,公式爲:

    該 loss 的缺點爲,須要爲每個類別保留一個類別中心值,當類別數過大時,需佔用的內存較大,對 GPU 的要求很高。

    開源地址:https://github.com/ydwen/caffe-face

  • NormFace: L2 Hypersphere Embedding for Face Verification

    NormFace 從人臉特徵的歸一化來考慮人臉的分類問題,它對 softmax 添加了2個限制,分別爲特徵和權重矩陣參數 W 的歸一化。由於對於普通的 softmax loss 而言,loss 的大小與特徵的模長相關,若一個樣本分對了,softmax 繼續優化的時候會朝着特徵的模增加的方向,但對於總體的分類性能來講並無很大的意義。且在實際的人臉識別應用中,使用的通常是 cosine 或者歐氏距離,也會致使優化的方向與最終的應用不一致。所以 NormFace 爲了限制 softmax 的優化方向,對特徵和 W 進行歸一化,讓 loss 更關注類中心的夾角。做者定義的歸一化層爲:

    反向傳播的梯度更新以下:

    但直接使用歸一化層,而不作其餘處理時,模型的 loss 將會變得很小,致使模型沒法收斂。這是因爲使用了歸一化層後,直接優化餘弦距離,而餘弦距離的範圍在[-1,1]之間,相比於普通的 softmax loss,這個值一般能夠達到(-80,80)。最後做者假設每一個類別都有相同的樣本數,且徹底分離,且對歸一化後的特徵和權重都乘以一個放大值 L,最終改進的 softmax loss 的公式以下:

    其中 s = L^2, 做者推薦使用自動學習的方式來設定該值。

    開源地址:https://github.com/happynear/NormFace

  • Coco Loss: Rethinking Feature Discrimination and Polymerization for Large-scale Recognition

    Coco Loss 與 NormFace 的思路是同樣的,都是爲了解決同一個問題,這裏就再也不說明了。

    開源地址:https://github.com/sciencefans/coco_loss

  • L-softmax: Large Margin Loss: Large-Margin Softmax Loss for Convolutional Neural Networks

    前面介紹的 loss 都是爲了拉大分類中心之間的距離,而接下來的 loss 還考慮了人臉識別中另一個很是重要的問題,就是類之間的距離。NormFace 在優化的時候,若分類正確,就不會再繼續壓縮類內的間距,對於數量龐大的人臉識別來講,讓每一個類別的特徵都儘量的靠近,是最優的狀況。因而就產生了 Margin 這個超參數。
    第一個比較重要的工做是 L-softmax(Large-Margin Softmax),它的意思是在作分類時,但願不一樣的類之間可以區分得更開,把同一個類壓縮得更緊,但它跟以前的思路有必定的類似性,但並無經過額外的限制來作,它深刻分析了 softmax loss 的形式,直接對這個形式作了精細的改動,把其中的cosθ改爲了cosmθ,起到了增長 margin 的效果。其定義以下:

    其中,m 是一個與分類 margin 密切相關的參數,其值越大,類別之間的 margin 也就隨之增大,可是訓練將會越發困難。此外,爲了簡化前向和反向傳播,做者構造了一個特定的 ψ(θi) 函數:

    其中, k ∈ [0,m−1]。

    開源地址:https://github.com/wy1iu/LargeMargin_Softmax_Loss

  • A-Softmax loss: SphereFace: Deep Hypersphere Embedding for Face Recognition

    Asoftmax 是在 L-softmax 的基礎上進行了微小的改進,增添了兩個限制條件:一是 W 的 norm 必須是一個固定的值,例如 1,二是偏置項直接設爲0。可是該方法的預測僅取決於 W 和 特徵之間的角度,比較難優化。做者提出的 A-Softmax loss 定義以下:

    A-Softmax loss 與 L-softmax 一脈相承,一樣訓練難度較大,所以實際應用中,一般先使用普通的 softmax loss 進行訓練,再慢慢轉移到帶有 margin 的 A-Softmax loss 進行優化。

    開源地址:https://github.com/wy1iu/sphereface

  • AAM: Face Recognition via Centralized Coordinate Learning

    AAM Softmax 提出了自適應參數 η ,針對不一樣的角度差別設置不一樣的值,對於大角度差別係數值設定較小,而小角度差別係數須要足夠大才能保證 margin 的寬度。但單獨使用 AAM softmax 不穩定,須要和 softmax 一塊兒使用。其定義以下:

    從公式能夠看出 AAM softmax 與 A-Softmax 相似,只是將其中的固定參數 m 轉變成了一個根據角度可變的值 η。 η 的具體取值方式以下式所示:

    固然,因爲其增大類別之間的 margin 的方式依然爲相乘的方式,直接訓練難以收斂,做者加入了一個帶權重的 softmax loss 用於平衡 AAM softmax loss。具體的形式以下:

    其中, λ 爲常數,用於平衡兩個 loss 的權重,經過實驗,做者將其設置爲 3。

  • AMSoftmax: Additive Margin Softmax for Face Verification

    AMSoftmax 增大類別之間的 margin 的方式是改變 A-Softmax loss 中對 θ 乘以 m 的方式,轉換爲 cosθ - m。模型的輸入通過特徵和權重的歸一化後,實際上能夠化爲:

    所以 Ψ(θ) = cosθ − m 能夠簡化成 Ψ(x) = x − m,這也使得在反向傳播時無需再計算其梯度, 由於 Ψ'(x) = 1。AMSoftmax 的最終計算公式以下:

    AMSoftmax 採用固定尺度因子 s=30, m 能夠設置爲 0.35 或 0.4 以得到較優的性能。相比於 A-Softmax 性能有必定的提高,且因爲其對特徵進行了歸一化,訓練的難度也下降了,能夠直接使用其進行模型的訓練。

    開源地址:https://github.com/happynear/AMSoftmax

  • ArcFace: Additive Angular Margin Loss for Deep Face Recognition

    ArcFace 的論文總結了這一系列的 margin 方法,作了許多對比實驗,其主要思路與 AMSoftmax 類似,將 Ψ(θ) 改成了 cos(θ + m),一樣對特徵和權重做了歸一化處理,採用固定尺寸因子 s=64。其 loss 公式以下:

    ArcFace 論文中給出的不一樣 loss 在常見測試集上的性能比對:

    最後強烈推薦一波 insightface 開源人臉識別項目,性能強大,基於 mxnet 框架,速度快,佔用顯存小。

    開源地址: https://github.com/deepinsight/insightface

數據集

Train Dataset

num_id dataset person number image number url
1 CASIA-WebFace 10,575 494,414 https://drive.google.com/file/d/1Of_EVz-yHV7QVWQGihYfvtny9Ne8qXVz/view, or http://www.cbsr.ia.ac.cn/english/CASIA-WebFace/CASIA-WebFace_Agreements.pdf
2 CelebA 10,177 202,599 http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
3 UMDFace(still images) 8,277 367,888 http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
4 UMDFace(video frames) 3,107 3,735,888 http://umdfaces.io/
5 VGGFace2 9,131 ~3,310,000 http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/ need register
6 MS-Celeb-1M ~100,000 ~10,000,000 https://www.msceleb.org/celeb1m/1m not accessible
7 DeepGlint(MS-Celeb-1M-v1c) 86,876 3,923,399 http://trillionpairs.deepglint.com/data need register
8 DeepGlint(Asian-Celeb) 93,979 2,830,146 http://trillionpairs.deepglint.com/data need register
9 IMDB-FACE ~59,000 ~1,700,000 https://github.com/fwang91/IMDb-Face#data-download only url
10 CELEB-500K ~500,000 ~50,000,000 https://github.com/JiajiongCao/CELEB-500K only url, not recommended
11 MegaFace 672,057 4,753,520 http://megaface.cs.washington.edu/dataset/download_training.html need request

Validation Dataset

num_id dataset person number image number url
1 CFP-FP 500 7,000 http://www.cfpw.io/
2 AgeDB-30 570 12,240 https://ibug.doc.ic.ac.uk/resources/agedb/
3 LFW 5,749 13,233 http://vis-www.cs.umass.edu/lfw/#views
4 CALFW 5,749 13,233 http://www.whdeng.cn/CALFW/index.html?reload=true
5 CPLFW 5,749 13,233 http://www.whdeng.cn/CPLFW/index.html?reload=true

Video Test Dataset

num_id dataset person number video number url
1 YTF(YouTube Faces DB) 1,595 3,425 https://www.cs.tau.ac.il/~wolf/ytfaces/
2 IQIYI_VID_DATA -- -- http://challenge.ai.iqiyi.com/

參考資料

相關文章
相關標籤/搜索