
人臉識別是圖像分析與理解最重要的應用之一,所謂人臉識別,就是利用計算機分析人臉視頻或者圖像,並從中提取出有效的識別信息,最終判別人臉對象的身份。人臉識別的研究可以追溯到20世紀 60年代末期,主要的思路是設計特征提取器,再利用機器學習的算法進行分類。2012深度學習引入人臉識別領域后,特征提取轉由神經網絡完成,深度學習在人臉識別上取得了巨大的成功。下面以時間為順序,梳理下人臉識別各算法的發展歷程。
一、傳統算法
(一)基於幾何特征
1、原理
人臉由眼睛、鼻子、嘴巴、下巴等部件構成,這些部件的形狀、大小,以及各部件在臉上的分布各異,構成各種各樣的人臉,利用這些部件的形狀和結構關系的幾何描述,做為人臉識別的特征。比如:眼角點、鼻尖點和兩個嘴角點,構造若干特征向量。特征向量通常包括人臉指定兩點間的距離、曲率、角度等。
1973年,Kelly’s and Kanade’s PhD theses,第一篇人臉識別的paper,

2、優缺點
(1)優點
算法識別速度快,需要的內存小。
(2)缺點
一般幾何特征只描述了部件的基本形狀與結構關系,忽略了局部細微特征,造成部分信息的丟失,更適合於做粗分類,而且目前已有的特征點檢測技術在精確率上還遠不能滿足要求。
(二)基於全局信息(holistic method)
基於幾何特征的方法,萃取人臉部件的輪廓和幾何關系,並沒有用到圖片中的其他信息,為了提高識別准確度,全局算法應運而生,全局算法的特征向量,包含人臉圖像上所有部分的信息。
按照對全局特征處理方法的不同,介紹下面兩種方法
1、PCA(Principal Components Analysis)
a.提出背景:
照片的識別,可以看成特征向量相互匹配的過程。如果2張100*100的照片,在各個維度上都相近,那么我們可以認為,這兩張照片屬於同一個人。但是以100 * 100的照片為例,數據維度10000維,數據維度太高,計算機處理復雜度高,需要將維度降低(因為10000維里面數據之間存在相關關系,所以可以除去重復維度信息,而保持信息不丟失)
b.降維方法







降低維度后,再拿這個壓縮過的向量做識別即可。典型的方法有egienface等。

PCA所作的是將數據映射到最方便表示這組數據的坐標系上,映射時沒有利用任何數據分類信息。做PCA其實是在信息損失盡可能低的情況下,將數據降維。如果在降維的時候加入分類信息,效果會不會更好?
2、LDA(Linear Discriminant Analysis線性判別分析)

左圖是PCA,它所作的只是將數據映射到,最方便表示這組數據的坐標軸上。分類效果可能一般。
右圖是LDA,可以明顯看出,在增加了分類信息之后,兩組輸入映射到了另外一個坐標軸上,有了這樣一個映射,兩組數據之間的就變得更易區分了(在低維上就可以區分,減少了很大的運算量)。
LDA的典型方法有Fisher Linear Discriminant等,它求一個線性變換,使樣本數據中“between classes scatter matrix”(類間協方差矩陣)和“within classes scatter matrix”(同內協方差矩陣)之比的達到最大。
(三)基於局部信息
基於局部信息的的提取方法也叫Feature-based method。我們考慮一種情況,同一個人的2張照片,它們之間唯一的區別是其中一人的眼睛是閉着的。在整體方法中,所有的特征向量的都可能不同(每一個特征向量都能看到全圖信息)。但在在基於特征的方法中,大部分特征保持不變,只有與眼睛周圍提取的特征向量會不同。而且,我們可以在基於特征方法中,將描述符設計為對變化(例如縮放、旋轉或平移)保持不變。使其魯棒性更強
基於局部信息的典型算法是LBP(Local Binary Pattern,局部二值模式),由芬蘭的T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,用於圖像的局部紋理特征提取。
1、原理
原始的LBP算子定義為在3*3的窗口內,以窗口中心像素為閾值,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大於中心像素值,則該像素點的位置被標記為1,否則為0。這樣,3*3鄰域內的8個點經比較可產生8位二進制數(通常轉換為十進制數即LBP碼,共256種),即得到該窗口中心像素點的LBP值,並用這個值來反映該區域的紋理信息。如下圖所示:

LBP算子利用了周圍點與該點的關系對該點進行量化。量化后可以更有效地消除光照對圖像的影響。只要光照的變化不足以改變兩個點像素值之間的大小關系,那么LBP算子的值不會發生變化,所以一定程度上,基於LBP的識別算法解決了光照變化的問題(圖像光照變化不均勻時,各像素間的大小關系被破壞,對應的LBP模式也就發生了變化)。
原始的LBP提出后,研究人員不斷對其提出了各種改進和優化,使其具有旋轉不變等特性。
經過LBP處理后的如下所示

2、Pipeline
a、首先將檢測窗口划分為16×16的小區域(cell);
b、計算每個像素點的LBP值
c、然后計算每個cell的直方圖
d、最后將得到的每個cell的統計直方圖進行連接成為一個特征向量,也就是整幅圖的LBP紋理特征向量
然后便可利用SVM或者其他機器學習算法進行分類。
二、深度學習算法
因為對人臉識別的許多規律或規則進行顯性的描述相當困難,而神經網絡方法則可以通過學習,獲得這些規律的隱性表達,它的適應性更強。2012年深度學習在ILSVRC大放異彩后,很多研究者都在嘗試將其應用在自己的方向,目前深度學習在人臉識別中也取得了非常好的效果。
(一)DeepFace
DeepFace是Facebook在2014年的CVPR上提出來的,后續出現的DeepID和FaceNet也都體現DeepFace的身影,可以說DeepFace是CNN在人臉識別的奠基之作。下邊介紹DeepFace的基本框架。
1、網絡架構

DeepFace的架構並不復雜,層數也不深。網絡架構由6個卷積層 + 2個全連接層構成。
2、Pineline
從實現過程,理解網絡
a、圖片的3D對齊
輸入原始圖片,講過3D對齊后,使人臉的正面朝前(圖g)

3D對齊技術可以將圖像從2D空間,映射到3維空間,得到人臉特征3維空間的分布,進而可以得到人臉在2D空間下,各種角度的特征分布。
Recongnition任務中,正面照片的分辨效果最好,圖g輸出人臉的正面圖片用來做識別的input,圖h輸出人臉在45度角下的2D圖,用來展示3D對齊的在各個角度下的2D的輸出樣例。
b、前3層采用傳統的conv提取信息
通過3層共享權值的卷積,每一層在整張圖片上,提取本層的特征(同一層內,提取的是同一維度上的特征,因為filter一樣)

在這里,介紹下共享權重卷積和非共享權重卷積。
1)共享權重
1個卷積核,提取1個特征,卷積核在input圖上滑動,提取不同區域的同1種特征(叫做卷積層的參數共享),不同的卷積核,在不同特征的維度上,對input進行特征提取。大部分我們看到的卷積都是這種結構。參數量少,計算速度快。

不同的pixel對應的filter相同
如果1個卷積核大小是“5*5*1”,一個圖對應的參數是5*5*1, feature map上輸出的是,不同部位,同一維度上的特征。
2)非共享權重( Local-Conv),也叫局部連接卷積

不同的pixel對應的filter不同。
如果1個卷積核大小是“5*5*1”,則1個128*128大小的圖上,會有124*124個這樣的filter,對應的參數數量是124*124*5*5*1,參數量劇增。因為不同的filter提取的是不同維度上的特征,所以feature map上輸出的是不同部位,不同維度上的特征。
這樣做的理由是,因為input里面人臉經過了3D對齊和2D映射,輸入的圖片是矯正后的正面人臉,各特征點的position都固定下來了,人臉部不同位置(鼻子,嘴巴,....)的特征不同,用不同的filter來學習效果更好。
c、后3層conv,采用局部連接層,提取不同維度上的特征。
后3層,采用Local-Conv,提人臉不同位置上的各種不同特征,因為Local-Conv參數量巨大,所以需要使用超大的數據庫進行訓練。DeepFace采用的是Facebook自己做的SFC數據集,有4030個人的440萬張人臉數據。所以用在這里正好~

d、過全連接層,獲取圖像全局信息
1)過卷積生成的feature map送入第7層,第7層為全連接層,可以感受到上一層傳過來的圖像的所有信息。
之所以人臉識別的各種架構里面,大部分都含有這一層,原因是,全連接層可以捕捉到人臉距離較遠區域的特征之間的關聯性。比如,眼睛的位置和形狀,與嘴巴的位置和形狀之間的關聯性,這種關聯性,可以contribute to最后一步的recognition score.
2)在第7層對所有特征進行了L2歸一化,使其值域落在【0,1】之間,以減弱圖像對光照的敏感性.為什么歸一化之后就可以減少圖像對光照的敏感性?

我的是這樣理解的,歸一化之前,光照強的圖像(如右圖)對應的值高,比如左圖中某一點a的像素值為100,左圖上像素值最大的是200,右圖的光線更強,與a點相對應的點a’像素值為110,右圖上像素值最大的是220,經過歸一化后,左圖右圖同一點的值,也就相同了。
e、輸出4030類的識別結果。
用softmax輸出4030種人物的分類信息
3、網絡特點
a、提出了3D對齊
3D對齊和3D-2D映射在這里不敷述,paper中覺得這樣做,對最后的准確率提升幫助較大。但是現在的網絡,在沒有采用3D對齊的前提下,也取得漂亮的score.
3D對齊這一塊可以先放一放。
b、局部卷積。
局部連接的思想,就跟上面分析的一樣,比較好理解。至於這種方法在別的網路中work不work,后面paper看多了應該能有個更清楚的認識。
4、網絡成績
DeepFace在LFW數據集中進行人臉識別中取得了97.35%的好成績,該成績相對於傳統方法中依靠人工顯式的提取特征,再進行分類的method,識別准確性獲得明顯提高,再次證實了CNN在特征提取方面的威力,此外該成績已經逼近人類在LFW數據集中97.5%的識別成績,性能卓越。

5、特征度量
雖然網絡的output是個4030維的分類結果,paper中還是提出了另外的度量2個圖片相似性的方法。
a、內積
文中直接計算兩個經過歸一化后的特征之間的內積來計算2個圖像過backbone后的vector之間的距離,一開始有點不太懂,兩個圖片相同的話,內積是大還是小?感覺看內積大小分不出來2個圖片相似性啊?
后來想了想,這樣之所以work,是因為本網絡的特殊性。過第7層的fc層后,輸出的vector是個4096維的數據,網絡架構中采用了relu激活,這4096維中有75%的數據是0,4096維的vector構成了1個稀疏向量。基於這樣的前提,兩個不同的圖片,對應的不同位置上的0和非0元素相乘抵消,內積趨近於0,而相似的2個圖片,由於0存在於2個vector相同的位置,非0元素也存在於2個vector相同的位置,0沒有和非零元素相抵消,對應的值較大。這樣就實現了圖片相似性的區分。
Paper中提到的另外2個距離度量算法。
b、X² similarity
按照下面公式乘就可以了,比較簡單,沒啥好說的


權重參數是由SVM學來的
c、Siamese network孿生網絡
當神經網絡訓練完成后,將其除了L8外的其他層復制為兩份,分別輸入兩張人臉圖像,得到特征后,先計算兩個feature的絕對差值,然后將其輸入給一個新的全連接層(注意不是原來的L8,其只有一個神經元)來進行二分類,判斷兩張人臉是否身份相同


(二)DeepID
DeepID是一種特征提取的算法,由港中文湯曉鷗團隊於2014年提出,發表於CVPR2014。其應用領域是人臉識別的子領域——人臉驗證,就是判斷兩張圖片是不是同一個人。之前的人臉驗證任務主要的方法是使用過完備的(over-complete)低層次特征,結合淺層的機器學習模型進行的。過去的方法常常是將人臉提取出幾萬乃至幾百萬的特征,然后將特征進行降維,再計算兩個特征的相似度,本文提出一種使用深度學習提取人臉深層次特征(稱之為DeepID)的方法。DeepID特征由人臉分類任務學習得到,此特征可以用於人臉驗證中,最終在LFW數據集上取得了97.45%的成績。
1、網絡架構

DeepFace的架構並不復雜,層數也不深。網絡架構由4個卷積層 + 1個全連接層構成。
2、Pineline
a、做patch
1)截區域
按照人臉特征點的分布,在1張輸入圖片上取10個區域,如下圖所示:

2)數據增強
(1)將每個區域,resize成3中不同尺度的pic,如下圖所示:

(2)將圖像進行水平翻轉

(3)提取灰度圖

(4)patches總量
經過前3步的數據增強,此時的1張image,產生了10 * 3 * 2 * 2 = 120個區域,將每1個區域與其水平翻轉的區域,送入網絡,進行特征提取。此步共訓練60個神經網絡。輸出160*2維的DeepID

3)增加patches效果
由下圖可見,增加patches數量后,網絡性能,相對於只用了1整張image的原始結構,提升明顯,感覺就是數據增強的原因。

b、過ConvNets

以1個區域的輸入為例,如果區域是長方形,則resize成39*31,如果如果區域是正方形,則resize成31*31,假設本次輸入的區域是長方形,喂入網絡,如上圖所示。

圖片經過4層卷積,第3層,和第4層的feature map分別是3*2*60,和2*1*80維。將最后2層的feature map分別過全連接層,concatenate成1個160維的vector

Concatenate方式:在同一維度上疊加
不同hierarchy的Feature map疊加在一起,分類器可以看到多尺度的圖像。想當於聯系了上下文,網絡性能更好。

DeepID自身的分類錯誤率在40%到60%之間震盪,雖然較高,但DeepID是用來學特征的,並不需要要關注自身分類錯誤率。
將上文160維的vector送入soft-max進行分類,輸出10000分類的結果。60個網絡,各自對應各自預測的cls結果,如下圖所示:

3、利用DeepID做verification
本來以為做完cls,這個paper就可以結束了,然鵝,看了paper后面密密麻麻的2張,才意識到這個paper是關於verification的,之所以要做cls,主要是多分類的訓練,可以提高ConvNet的提取特征的能力,終其目的,還是為了拿到提取的特征,做其關心的verification
a、用前面訓練好的網絡,對2張圖片做verification
每張照片,根據是否水平翻轉,分為2組,每組有60個patches(10個區域,每個區域3個size,每個size有RGB和Grey2種模式)
將每1個區域與其水平翻轉對應的部分,聯合要對比的圖片的同一個區域,組着在一起,送入網絡,進行特征提取。此步調用了60個神經網絡。

每張輸入的160維vector,即為那個區域的identity,可視化160維的數據如下,可以看出相同人臉的identity相似度高,不同人臉的identity區別較大。

1張image經過網絡,輸出120(60個patches,每個patch里2張圖)*160=19200維vector,以此vector表征人臉的identity。
將2張face的identity,送入joint Bayesian,判斷是否為同1個人。

下面介紹一下classifier里面的joint Bayesian分類器
b、Joint Bayesian
1)經典Bayesian Face
在介紹joint Bayesian之前,先看一下joint Bayesian出現之前,業界廣泛使用的經典Bayesian Face,算法描述如下:





但是經典bayesian從2維投射到1維時,會喪失一些分區信息,導致在2維平面上可分的目標,在1維平面上變得不可區分。

從上圖中可以看到,2-D的數據通過差分x-y映射到1-D上。O附近的點交錯在一起, 使得在O附近的Class-1 和Class-2 無法區分開來。這就是經典Bayesian Face的缺陷
2)joint Bayesian
針對經典Bayesian Face出現的問題,中科大,港中文以及亞研院的4位同學,在孫劍的指導下於2012年提出來joint Bayesian方法



c、神經網絡分類器
14年,當時的verification sota 分類器還是joint Bayesian,神經網絡成績一般,作者試了這2種方法后,選擇了性能更優的joint Bayesian

4、網絡成績
DeepID相對於傳統的PCA方法,表征能力進一步增強

DeepID在LFW數據集上取得了97.45%的准確率,相比於DeepFace的97.35%,獲得了進一步的提高。ROC曲線如下:

5、數據指標
簡單的介紹下ROC,以前看的時候沒有仔細去弄明白這個指標,最近看好多paper上都有這個東西,查閱了資料,總結如下
ROC全名叫receiver operating characteristic curve,中文譯為:接收者操作特征曲線,用以說明二分類器在識別閾值變化時的診斷能力。
ROC將偽陽性率(FPR)定義為 X 軸,真陽性率(TPR)定義為 Y 軸。繪圖方法如下
a、統計樣本分類score
將一系列樣本,按照positive可能性得分,進行排序

b、計算真陽率和假陽率
以score作為閾值,依次對排好序的樣本進行判斷,score > threshold, 則判定為Positive, 否則判為Negative,每一個threshold計算1次真陽率和假陽率,做出這個20個樣本的真陽率-假陽率對應圖。

c、ROC曲線優勢
為什么要使用ROC呢?因為ROC曲線有個很好的特性:當測試集中的正負樣本的分布變換的時候,ROC曲線能夠保持不變。在實際的數據集中經常會出現樣本類不平衡,即正負樣本比例差距較大,而且測試數據中的正負樣本也可能隨着時間變化。下圖是ROC曲線和Presision-Recall曲線的對比:

(a)和(c)為Roc曲線,(b)和(d)為Precision-Recall曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c)(d)是將測試集中負樣本的數量增加到原來的10倍后,分類器的結果,可以明顯的看出,ROC曲線基本保持原貌,而Precision-Recall曲線變化較大。
6、小結
分類數提高,可以學到表征力更強的identity


用更多的分類來訓練網絡,測試的error rate持續降低。一開始還疑惑DeepID初衷是做verification,為什么一開始要用softmax做cls,其實原因到這里就明了了,分類越多,學到的160維的identity表征力越強。
(三)DeepID_v2
港中文湯曉鷗團隊在DeepId_v1基礎上提出的新版本架構,發表於NIPS2014
1、Architecture

網絡架構基本上與DeepId_v1一致。
2、Pipeline
圖片被分成20regions,每個region有5scales,2RGB&Gray共10種模式,共生成200個pathes,進行水平翻轉,分別送入200個網絡中。
以1個55 * 47的RGB 模式patch為例,過程和DeepID_v1相似,最后生成1個160維的向量。
用前后向貪心算法,從400個DeepID中,篩選出25個有效且互補的DeepID2向量,縮減計算規模,得到160*25 = 4000的特征值。

再利用PCA對此向量進行降維,得到1* 180的向量,以此向量為依據,做cls和verif,cls用交叉熵,verif用join Bayesian。
3、相比於DeepID_V1的改動
網絡結構沒有多大改動,重點是在loss計算上。眾所周知,表征人臉的特征最好能使不同的人臉之間的差異盡可能大,使相同人臉的不同照片人臉之間差異盡可能小。我們希望得到一個網路,這個網絡計算出來的特征vector盡可能滿足上述條件。設計loss函數如下:
a、分類loss

F是特征向量,θid是softmax層參數,t是label的分類結果。
b、Verification loss

1)類內loss
當

,input image和標簽數據是同一個分類,此時訓練網絡,使之與label中的特征,盡可能的相近。

2)類間loss
當

,input image和標簽數據屬於不同分類,

m為超參數,事先指定好。由上圖知,當輸入的圖片的特征vector,和label的vector差異很大,其L2距離超過m時,loss值為0,網絡傾向於學習,使類間距離盡可能的大的vector。
總Verification loss為類間loss和類內loss的加權和,權重各為0.5。
之前業界普遍采用的方法是L1/L2范式和余弦相似度,文中采用一種基於L2 Norm的損失函數。paper中作者測試了其他幾種距離算法對准確率的影響,L2距離的性能最好。

c、cls和verif的組合

選取合適的λ,調整verif loss在總loss中的系數,當λ=0時,不計算verfi的loss,文中選取λ=0.5
4、網絡成績
LFW共有5749個人的數據,共13233張臉。數據集太小,paper中引入外部數據集CelebFace+,有10177個人的數據,共202599張臉。
為充分利用從大量圖像塊中提取到的特征,作者重復使用7次前項后向貪婪算法選取特征,每次的選擇是從之前的選擇中未被留下的部分中進行選取。然后在每次選擇的特征上,訓練聯合貝葉斯模型。再將這七個聯合貝葉斯模型使用SVM進行融合,得到最佳的效果在LFW上為99.15%。

