人臉識別系列四 | DeepID1算法
- 2019 年 12 月 4 日
- 筆記
前言
這是人臉識別系列的第5篇文章,前4篇文章可以在公眾號的人臉識別欄里找到,這篇文章主要是解析CVPR 2014年的經典人臉識別論文DeepID1算法。論文的地址如下:http://mmlab.ie.cuhk.edu.hk/pdf/YiSun_CVPR14.pdf 。
題外話
前面4篇人臉識別系列推文中我們介紹了基於傳統方法的人臉識別算法,代表性的就是特徵臉法。傳統人臉識別存在很多弊端,如側臉,模糊圖片,光照遮擋等都會對人臉識別過程造成影響。在基於深度學習的人臉識別技術沒有出現以前,傳統的人臉識別方法的性能都是很差的,難以實際應用到對安全係數要求很高的場景中。而自從基於深度學習的人臉識別技術一點點演進到今天,人臉識別結果已經可以和人工相比了,有的甚至還會由於人工識別的結果。這就使得人臉識別可以應用到對安全係數要求較為嚴格的場景,如門禁系統甚至是金融場景。同時,由於人臉識別非常方便,對信息採集設備的要求不是很高,可以通過雲端進行識別,這樣更推進了人臉識別技術的快速落地。然後基於深度學習的人臉識別方法主要分為兩個大的類別,第一個是基於度量學習的方法,第二種是基於邊界分類的方法。所謂度量學習(Metric Learning)是專門研究如何讓一個算法更好的學習到一種度量的方向,如歐式距離,餘弦相似度都是一種度量方法。
介紹
DeepID1是CVPR2014的論文,作者是著名的港中文大學和中科院高等技術研究所的湯曉鷗,王曉剛團隊。這個算法以人臉識別的子領域人臉驗證(Face Verification)為目標,算法並沒有直接用二類分類CNN做人臉驗證,而是通過學習一個多類(10000累,每個類大概有20個實例)人臉識別任務來學習特徵,並把學習到的特徵應用到人臉驗證上。算法使用人臉圖片的不同patch(也就是一張圖片的子區域)訓練多個單獨的CovNet,每個ConvNet的最後一個隱層是提取到的特徵,論文稱為DeepID(Deep hidden IDentitiy feature)。最後將這些patch提取到的DeepID在通道上concat起來,構成一個整張人臉圖片的特徵向量送入Joint Bayesian分類器,做二分類就可以實現人臉驗證了。
貢獻
用多個不同的Face patch分別訓練一個很難的分類任務的卷積網絡,因為這裡有10000個不同身份的人,然後得到一些分辨力很強的特徵表示,最後再不需要嚴格對其的前提下在LFW上取得了97.45%的人臉對比精度。
算法原理
算法過程
 如上圖所示,這是特徵提取的示意圖,實際上這篇文章核心點就是這個特徵提取部分,驗證部分直接做二分類就好。首先,從輸入人臉扣出一部分patch(下面也稱為塊),然後把這些patch輸入同一個結構不同參數的ConvNet提取160維的DeepID特徵,最後把這些DeepID特徵concat起來就是這個人臉的特徵了。需要注意的是,每一個塊對應了一個單獨的ConvNet網絡提取對應的DeepID特徵,並且 DeepID特徵是在最後一個隱層提取,而不是輸出層,那個10000個節點的輸出層,是訓練時候才有的,最後多個塊的DeepID連接層最後整個人臉的特徵,所以最後一張人臉的特徵長度是160*patch的個數。
網絡結構

在這裡插入圖片描述
ConvNet特徵提取網絡的結構圖如上面所示。一共有5層,越往後神經元個數越少,到最後只剩下160個神經元的輸出,上面的人臉塊是經過對齊後的人臉塊,也就是說以左(右)眼為中心的人臉區域塊,嘴角為中心的人臉區域塊等等,這樣就有多個不同的塊輸入到特定的ConvNet中,最後使用了Max pooling layer3+Conv layer4的輸出作為特徵。這裡論文解釋是不同層次的特徵抽象程度不一樣,而且經過連續的採樣,Conv layer4所含的神經元太少,前面損失了太多的信息,所以加入Max Pooling layer3緩和一下。網絡的輸入圖像有兩種類型,即個人臉圖像塊和個圖像塊,其中代表圖像的通道數,同時人臉還會使用3個尺度,激活函數用ReLU,使用隨機梯度下降算法優化網絡。
人臉的最後特徵

在這裡插入圖片描述
如上圖所示,每個人臉會提取3個尺度的10個patch(以鼻頭,左眼,右眼,左嘴角,右嘴角為中心)然後彩色圖加上灰度圖,加上水平翻轉數量又翻倍數量又翻倍,一共是:。然後將這120個輸出圖片分別送入到60個ConvNet(水平翻轉和原圖,用同一個Conv Net),提取了一共維度的特徵向量,作為這個臉的最終特徵送入聯合貝葉斯分類器做分類。另外有些特例,兩個以嘴角和兩個眼球為中心的這四個patch,不做翻轉操作,直接用他們的對稱patch最為他們翻轉圖的特徵。
訓練
DeepID1的訓練使用了CelebFaces+,有10177人,202599張圖片;8700人訓練DeepID,1477人訓練Joint Bayesian分類器。切分的patch數目是100,使用了5種不同的scale。每張圖片最後形成的向量長度為32000,使用PCA降維到150。訓練ConvNet的時候使用10000類的交叉熵損失函數作為目標函數,最後論文在LFW上達到了97.45%的驗證精度。
結論
論文通過實驗證明使用Multi-scale patches的Conv Net比只使用一個只有整張人臉的patch的效果要好。DeepID1是2014年的論文距離今天快5年了,這5年人臉識別的準確率已經非常高了,但經典論文留給我們的思路仍然是值得借鑒的。畢竟,萬丈高樓平地起。
代碼實現
這裡推薦一個Tensorflow版本的代碼實現,代碼結構簡單易懂。使用了開放的 Youtube Aligned Face 數據集,在 8:1:1 的切分下達到了 95% 的識別精度。地址為:https://github.com/jinze1994/DeepID1
參考
https://zhuanlan.zhihu.com/p/82448662
歡迎關注我的微信公眾號GiantPadaCV,期待和你一起交流機器學習,深度學習,圖像算法,優化技術,比賽及日常生活等。
歡迎在後台回復「交流群」加入GiantPandaCV交流群和我討論算法哦,順便看到這裡的話在右下角點下在看哦。