1. 程式人生 > >【轉】DeepID人臉識別演算法之三代

【轉】DeepID人臉識別演算法之三代

DeepID人臉識別演算法之三代

轉載請註明:http://blog.csdn.NET/stdcoutzyx/article/details/42091205

DeepID,目前最強人臉識別演算法,已經三代。

如今,深度學習方興未艾,大資料風起雲湧,各個領域都在處於使用深度學習進行強突破的階段,人臉識別也不例外,香港中文大學的團隊使用卷積神經網路學習特徵,將之用於人臉識別的子領域人臉驗證方面,取得了不錯的效果。雖然是今年7月份才出的成果,但連發三箭,皆中靶心,使用的卷積神經網路已經改進了三次,破竹之勢節節高。故而在這裡將DeepID神經網路的三代進化史總結一下,以期相互討論,互有增益。

在說明具體的結論之前,我先進行總結式的幾段文字,然後再做詳細的技術說明,以防有些過來尋求科普的人看到一坨坨的公式便拂袖遠去,沒看到什麼乾貨。

1. 問題引入及演算法流程

DeepID所應用的領域是人臉識別的子領域——人臉驗證,就是判斷兩張圖片是不是同一個人。人臉驗證問題很容易就可以轉成人臉識別問題,人臉識別就是多次人臉驗證。DeepID達到的效果都是在LFW資料集上,該資料集是wild人臉資料集,即沒有經過對其的人臉,背景變化比較大。該資料集太小,很多identities都只有一張人臉,5000個人只有13000張圖片。所以DeepID引入了外部資料集CelebFaces和CelebFaces+,每次模型更新都會使用更大的資料集,這在後面介紹DeepID時再細說。

卷積神經網路在DeepID中的作用是是學習特徵,即將圖片輸入進去,學習到一個160維的向量。然後再這個160維向量上,套用各種現成的分類器,即可得到結果。DeepID之所以有效,首先在於卷積神經網路學習到的特徵的區分能力比較強,為了得到比較強的結果,DeepID採取了目前最常用的手法——增大資料集,只有大的資料集才能使得卷積神經網路訓練的更加的充分。增大資料集有兩種手法,第一種手法,就是採集好的資料,即CelebFaces資料集的引入。第二種手法,就是將圖片多尺度多通道多區域的切分,分別進行訓練,再把得到的向量連線起來,得到最後的向量。DeepID的演算法流程如下:

process

在上述的流程中,DeepID可以換為Hog,LBP等傳統特徵提取演算法。Classifier可以是SVM,Joint Bayes,LR,NN等任意的machine learning分類演算法。

在引入外部資料集的情況下,訓練流程是這樣的。首先,外部資料集4:1進行切分,4那份用來訓練DeepID,1那份作為訓練DeepID的驗證集;然後,1那份用來訓練Classifier。這樣劃分的原因在於兩層模型不能使用同一種資料進行訓練,容易產生過擬合。

如此,想必大家對DeepID的應用場景已經熟悉了,下面開始講三代DeepID的進化。

2. DeepID

在這裡,我假定大家對卷積神經網路已經有了基本的認識,如果沒有的話,出門左轉看我這篇blog:卷積神經網路http://blog.csdn

.Net/stdcoutzyx/article/details/41596663。

2.1 DeepID網路結構

DeepID是第一代,其結構與普通的卷積神經網路差不多。結構圖如下:

img1

該結構與普通的卷積神經網路的結構相似,但是在隱含層,也就是倒數第二層,與Convolutional layer 4和Max-pooling layer3相連,鑑於卷積神經網路層數越高視野域越大的特性,這樣的連線方式可以既考慮區域性的特徵,又考慮全域性的特徵。

2.2 DeepID實驗設定

實驗中,人臉圖片的預處理方式,也就是切分方式的樣例如下:

img1

在DeepID的實驗過程中,使用的外部資料集為CelebFaces+,有10177人,202599張圖片;8700人訓練DeepID,1477人訓練Joint Bayesian分類器。切分的patch(也就是上圖這樣的資料)數目為100,使用了五種不同的scale。每張圖片最後形成的向量長度為32000,使用PCA降維到150。如此,達到97.20的效果。使用某種Transfer Learning的演算法後,達到97.45%的最終效果。

2.3 實驗結論

  • 使用multi-scale patches的convnet比只使用一個只有整張人臉的patch的效果要好。
  • DeepID自身的分類錯誤率在40%到60%之間震盪,雖然較高,但DeepID是用來學特徵的,並不需要要關注自身分類錯誤率。
  • 使用DeepID神經網路的最後一層softmax層作為特徵表示,效果很差。
  • 隨著DeepID的訓練集人數的增長,DeepID本身的分類正確率和LFW的驗證正確率都在增加。

這就是DeepID第一代。

3 DeepID2

DeepID2相對於DeepID有了較大的提高。其主要原因在於在DeepID的基礎上添加了驗證訊號。具體來說,原本的卷積神經網路最後一層softmax使用的是Logistic Regression作為最終的目標函式,也就是識別訊號;但在DeepID2中,目標函式上添加了驗證訊號,兩個訊號使用加權的方式進行了組合。

3.1 兩種訊號及訓練過程

識別訊號公式如下:

img1

驗證訊號公式如下:

img1

由於驗證訊號的計算需要兩個樣本,所以整個卷積神經網路的訓練過程也就發生了變化,之前是將全部資料切分為小的batch來進行訓練。現在則是每次迭代時隨機抽取兩個樣本,然後進行訓練。訓練過程如下:

img1

在訓練過程中,lambda是驗證訊號的加權引數。M引數時動態調整的,調整策略是使最近的訓練樣本上的驗證錯誤率最低。

3.2 實驗設定

首先使用SDM演算法對每張人臉檢測出21個landmarks,然後根據這些landmarks,再加上位置、尺度、通道、水平翻轉等因素,每張人臉形成了400張patch,使用200個CNN對其進行訓練,水平翻轉形成的patch跟原始圖片放在一起進行訓練。這樣,就形成了400×160維的向量。

這樣形成的特徵維數太高,所以要進行特徵選擇,不同於之前的DeepID直接採用PCA的方式,DeepID2先對patch進行選取,使用前向-後向貪心演算法選取了25個最有效的patch,這樣就只有25×160維向量,然後使用PCA進行降維,降維後為180維,然後再輸入到聯合貝葉斯模型中進行分類。

DeepID2使用的外部資料集仍然是CelebFaces+,但先把CelebFaces+進行了切分,切分成了CelebFaces+A(8192個人)和CelebFaces+B(1985個人)。首先,訓練DeepID2,CelebFaces+A做訓練集,此時CelebFaces+B做驗證集;其次,CelebFaces+B切分為1485人和500人兩個部分,進行特徵選擇,選擇25個patch。最後在CelebFaces+B整個資料集上訓練聯合貝葉斯模型,然後在LFW上進行測試。在上一段描述的基礎上,進行了組合模型的加強,即在選取特徵時進行了七次。第一次選效果最好的25個patch,第二次從剩餘的patch中再選25個,以此類推。然後將七個聯合貝葉斯模型使用SVM進行融合。最終達到了99.15%的結果。

其中,選取的25個patch如下:

img1

3.3 實驗結論

  • 對lambda進行調整,也即對識別訊號和驗證訊號進行平衡,發現lambda在0.05的時候最好。使用LDA中計算類間方差和類內方差的方法進行計算。得到的結果如下:

img1

可以發現,在lambda=0.05的時候,類間方差幾乎不變,類內方差下降了很多。這樣就保證了類間區分性,而減少了類內區分性。如果lambda為無窮大,即只有驗證訊號時,類間方差和類內方差都變得很小,不利於最後的分類。

  • DeepID的訓練集人數越多,最後的驗證率越高。
  • 對不同的驗證訊號,包括L1,L2,cosin等分別進行了實驗,發現L2 Norm最好。

4 DeepID2+

DeepID2+有如下貢獻,第一點是繼續更改了網路結構;第二點是對卷積神經網路進行了大量的分析,發現了幾大特徵,包括:+ 神經單元的適度稀疏性,該性質甚至可以保證即便經過二值化後,仍然可以達到較好的識別效果;+ 高層的神經單元對人比較敏感,即對同一個人的頭像來說,總有一些單元處於一直啟用或者一直抑制的狀態;+ DeepID2+的輸出對遮擋非常魯棒。

4.1 網路結構變化

相比於DeepID2,DeepID2+做了如下三點修改:

  • DeepID層從160維提高到512維。
  • 訓練集將CelebFaces+和WDRef資料集進行了融合,共有12000人,290000張圖片。
  • 將DeepID層不僅和第四層和第三層的max-pooling層連線,還連線了第一層和第二層的max-pooling層。

最後的DeepID2+的網路結構如下:

img1

上圖中,ve表示監督訊號(即驗證訊號和識別訊號的加權和)。FC-n表示第幾層的max-pooling。

4.2 實驗設定

訓練資料共有12000人,290000張影象。其中2000人用於在訓練DeepID2+時做驗證集,以及訓練聯合貝葉斯模型。

4.3 實驗結論

分別使用FC-n進行實驗,比較的演算法包括DeepID2+、只有從FC-4反向傳播下來進行訓練的模型、使用少量資料的、使用小的特徵向量的模型。結果如下:

img1

DeepID2選取了25個patch,DeepID2+選取了同樣的25個patch,然後抽取的特徵分別訓練聯合貝葉斯模型,得到的結果是DeepID2+平均比DeepID2提高2%。

4.4 適度稀疏與二值化

DeepID2+有一個性質,即對每個人,最後的DeepID層都大概有半數的單元是啟用的,半數的單元是抑制的。而不同的人,啟用或抑制的單元是不同的。基於此性質。使用閾值對最後輸出的512維向量進行了二值化處理,發現效果降低有限。

img1

二值化後會有好處,即通過計算漢明距離就可以進行檢索了。然後精度保證的情況下,可以使人臉檢索變得速度更快,更接近實用場景。

4.5 特徵區分性

存在某個神經單元,只使用普通的閾值法,就能針對某個人得到97%的正確率。不同的神經單元針對不同的人或不同的種族或不同的年齡都有很強的區分性。在這裡,對每個單元的啟用程度進行由高到低排序,可以得到下圖所示:

img1

上圖只是其中一張圖示,還有針對種族、年齡等的啟用分析。此處不贅述。

但值得說的是,這種分析方法對我們很有啟發。卷積神經網路的輸出的含義是什麼,很難解釋,通過這種方法,或許可以得到一些結論。

4.6 遮擋魯棒性

在訓練資料中沒有遮擋資料的情況下,DeepID2+自動就對遮擋有了很好的魯棒性。有兩種方式對人臉進行多種尺度的遮擋,第一種是從下往上進行遮擋,從10%-70%。第二種是不同大小的黑塊隨機放,黑塊的大小從10×10到70×70。

img1

結論是遮擋在20%以內,塊大小在30×#30以下,DeepID2+的輸出的向量的驗證正確率幾乎不變。

img1

img1

5 總結

至此,DeepID的三代進化史就講完了。簡單的說一下我的感受。

首先是卷積神經網路的作用,雖說之前聽說過卷積神經網路既可以分類,也可以學習特徵,但ImageNet上的卷積神經網路都是分類的,這次終於見到不關注分類錯誤率而關注特徵的卷積神經網路。

其次,卷積神經網路的改進方式,無非如下幾種:增大網路深度和寬度,增加資料,將網路隱含層連線到前面幾層來,新增其他的訊號。

再次,也是最重要的,就是DeepID在發展過程中對輸出向量的分析,尤其是DeepID2+,神經網路的各個單元一直是無法解釋的,但這次作者不僅試圖去發現規律,還基於規律做出了一些改動,比如二值化。

最後,卷積神經網路的魯棒性真的很厲害。

6 參考文獻

  • [1] Sun Y, Wang X, Tang X. Deep learning face representation from predicting 10,000 classes[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1891-1898.
  • [2] Sun Y, Chen Y, Wang X, et al. Deep learning face representation by joint identification-verification[C]//Advances in Neural Information Processing Systems. 2014: 1988-1996.
  • [3] Sun Y, Wang X, Tang X. Deeply learned face representations are sparse, selective, and robust[J]. arXiv preprint arXiv:1412.1265, 2014.