1. 程式人生 > >學習筆記:人臉檢測和人臉識別

學習筆記:人臉檢測和人臉識別

人臉檢測( Face Detection )和人臉識別技術是深度學習的重要應用之一。本章首先會介紹MTCNN演算法的原理, 它是基於卷積神經網路的一種高精度的實時人臉檢測和對齊技術。接著,還會介紹如何利用深度卷積網路提取人臉特徵, 以及如何利用提取的特徵進行人臉識別。最後會介紹如何在TensorFlow 中實踐上述演算法。

1 MTCNN 的原理

搭建人臉識別系統的第一步是人臉檢測,也就是在圖片中找到人臉的位置。在這個過程中,系統的輸入是一張可能含有人臉的圖片,輸出是人臉位置的矩形框, 如圖6-1所示。一般來說,人臉檢測應該可以正確檢測出圖片中存在的所有人臉, 不能有遺漏, 也不能再錯檢。

獲得包含人臉的矩形框後, 第二步要做的是人臉對齊(Face Alignment )。原始圖片中人臉的姿態、位置可能再較大的區別,為了之後統一處理,要把人臉“擺正” 。為此, 需要檢測人臉中的關鍵點( Landmark ),如眼睛的位置、鼻子的位置、嘴巴的位置、臉的輪廓點等。根據這些關鍵點可以使用仿射變換將人臉統一校準,以儘量消除姿勢不同帶來的誤差,人臉對齊的過程如圖6-2 所示。
這裡寫圖片描述

這裡介紹一種基於深度卷積神經網路的人臉檢測和人臉對齊方法——
MTCNN 。MT是英文單詞Multi-task的簡寫,意即這種方法可以同時完成人
臉檢測和人臉對齊兩項任務。相比於傳統方法, MTCNN的效能更好,可以
更精確地定位人臉;此外, MTCNN也可以做到實時的檢測。

MTCNN 由三個神經網路組成,分別是P-Net 、R-Net 、0-Net。在使用這些網路之前,首先要將原始圄片縮放到不同尺度, 形成一個“影象金字塔”,如圖6-3所示。接著會對每個尺度的圖片通過神經網路計算一遍。這樣做的原因在於:原始圖片中的人臉存在不同的尺度, 如有的人臉比較大,有的人臉比較小。對於比較小的人臉,可以在放大後的圖片上檢測;對於比較大的
人臉,可以在縮小後的圖片上檢測。這樣,就可以在統一的尺度下檢測人臉了。
這裡寫圖片描述

P-Net網路結構:
現在再來討論第一個網路P-Net 的結構, 如圖6-4所示, P-Net的輸入是一個寬和高皆為12 畫素,同時是3通道的RGB影象, 該網路要判斷這個12x12的影象中是否含有人臉,並且給出人臉框相關鍵點的位置

。因此,對應的輸出由三部分組成:
這裡寫圖片描述

  • 第一個部分要判斷該影象是否是人臉(圖6-4中的face classification),輸出向量的形狀為1x1x2,也就是兩個值,分別為該影象是人臉的概率,以及該影象不是人臉的概率。這兩個值加起來嚴格等於。之所以使用兩個值來表示,是為了方便定義交叉損失。
  • 第二個部分給出框的將卻位置(圖6-4中的bounding box regression),一般稱之為框迴歸。P-Net輸入的12x12的影象塊可能並不是完美的人臉框的位置,如有的時候人臉並不正好為方形,有的時候12x12的影象塊可能偏左或偏右,因此需要輸出當前框位置相對於完美的人臉框位置的偏移。這個偏移由四個變數組成。一般地, 對於圄=影象中的框,可以用四個數來表示它的位置:框左上角的橫座標、框左上角的縱座標、框的寬度、框的高度。因此,框迴歸輸出的值是: 框左上角的橫座標的相對偏移、框左上角的縱座標的相對偏移、框的寬度的誤差、框的高度的誤差。輸出向量的形狀就是圖中的1x1x4。
  • 第三個部分給出人臉的5 個關鍵點的位置。5 個關鍵點分別為:左眼的位置、右眼的位置、鼻子的位置、左嘴角的位置、右嘴角的位置。每個關鍵點又需要橫座標和縱座標兩維來表示,因此輸出一共是10維(即1x1x10) 。

至此,我們應該對P-Net的結構比較瞭解了。在實際計算中,通過P-Net中的第一卷積層的移動,會對影象中每一個12x12的區域都做一次人臉檢測,得到的結果如圖6-5所示。
這裡寫圖片描述

圖中框的大小各有不同,除了框迴歸的影響外,主要是因為將圖片金字塔中的各個尺度都使用了P-Net計算了一遍,因此形成了大小不同的人臉框。R-Net的網路結構如圖6-6 所示。這個結構與之前的P-Net 非常類似,P-Net的輸入是12×12×3的影象,R-Net是24x24×3的影象,也就是說,R-Net 判斷
24×24×3的影象中是否有人臉,以及預測關鍵點的位置。R-Net的輸出和
P-Net 完全一樣,同樣由人臉判別、框迴歸、關鍵點位置預測三部分組成。
這裡寫圖片描述

在實際應用中,對每個P-Net輸出可能為人臉的區域都縮放到24x24的大小,再輸入到R-Net中,進行進一步判定。得到的結果如圖6-7 所示,顯然R-Net消除了P-Net中很多誤判的情況。
這裡寫圖片描述

進一步把所高得到的區域縮放成48×48的大小,輸入到最後的0-Net中, 0-Net的結構同樣與P-Net類似,不同點在於它的輸入是48×48×3的影象,網路的通道數和層數也更多了。o-Net的網路結構如圖6-8 所示,檢測結果如圖6-9所示。
這裡寫圖片描述
這裡寫圖片描述

從P-Net到R-Net,最後再到O-Net,網路輸入的圖片越來越大,卷積層的通道數越來越多,內部的層數也越來越多, 因此它們識別人臉的準確率應該是越來越高的。同時, P-Net的執行速度是最快的, R-Net的速度其次,
O-Net的執行速度最慢。之所以要使用三個網路,是因為如果一開始直接對
圖中的每個區域使用O-Net, 速度會非常慢。實際上P-Net先做了一遍過濾,將過濾後的結果再交給R-Net進行過濾,最後將過濾後的結果交給效果最好但速度較慢的O-Net進行判別。這樣在每一步都提前減少了需要判別的數量,有效降低了處理時間。

最後介紹MTCNN的損失定義和訓練過程。MTCNN中每個網路都有三部分輸出,因此損失也由三部分組成。針對人臉判別部分,直接使用交叉熵損失,針對框迴歸和關鍵點判定,直接使用L2損失。最後這三部分損失各自乘以自身權重再加起來,就形成最後的總損失了。在訓練P-Net和R-Net時,更關心框位置的準確性,而較少關注關鍵點判定的損失,因此關鍵點判定損失的權重很小。對於O-Net,關鍵點判定損失的權重較大。

2 使用深度卷積網路提取特徵

經過人臉檢測和人臉識別兩個步驟,就獲得了包含人臉的區域影象,接下來就要進行人臉識別了。這一步一般是使用深度卷積網路, 將輸入的人臉影象轉換成一個向量的表示,也就是所謂的“特徵” 。

如何針對人臉來提取特徵?可以先來回憶VGG16的網路結構(如下圖),輸入神經網路的是影象,經過一系列卷積計算後,全連線分類得到類別概率。
這裡寫圖片描述

在通常的影象應用中,可以去掉全連線層,使用卷積層的最後一層當做影象的“特徵”。但如果對人臉識別問題同樣採用這種方法,即使用卷積層最後一層作為人臉“向量表示”,效果其實是不好的。這其中的原因和改進方法是什麼?我們後面會談到,這裡我們先談談希望這種人臉的“向量表示”應該具有哪些性質。

在理想的狀況下,希望“向量表示”之間的距離可以直接反應人臉的相似度:

  • 對於同一個人的兩張人臉影象,對應的向量之間的歐幾里得距離應該是比較小的。
  • 對於不同人的兩張影象,對應的向量之間的歐幾里得距離應該是比較大的

例如,這人臉影象為x1,x2,對應的特徵為f(x1),f(x2),x1,x2對應是同一個人的人臉時,f(x1),f(x2),的距離||f(x1)f(x2)||2應該很小,而當是不同人臉時,f(x1),f(x2),的距離||f(x1)f(x2)||2應該很大的。

在原始的CNN模型中,使用的是Softmax損失。Softmax是類別間的損失,對於人臉來說,每一類就是一個人。儘管使用Softmax損失可以區別出每個人,但其本質上沒有對每一類的向量表示之間的距離作出要求。

舉個例子,使用CNN對MNIST進行分類,設計一個特殊的卷積網路,讓最後一層的選哪個量變成2維,此時可以畫出每一類對應的2維向量,如圖6-10所示。
這裡寫圖片描述

圖6-10是直接使用Softmax訓練得到的結果,它不符合希望特徵具有的特點:

  • 希望同一類對應的向量表示儘可能接近。但這裡同一類的點可能具有很大的類間距離。
  • 希望不同類對應的向量應該儘可能遠。但在圖中靠中心的位置,各個類別的距離都很近。

對於人臉影象同樣會出現類似的情況。對此,有很多改進方法。這裡介紹其中兩種,一種是使用三元組損失(Triplet Loss),一種是使用中心損失

2.1 三元組損失的定義

三元組損失( Triplet Loss )的原理是:既然目標是特徵之間的距離應當具備某些性質,那麼就圍繞這個距離來設計損失。具體地,每次都在訓練資料中去除三張人臉影象,第一章影象記為xia,第二章影象記為xip,第三章圖片記為xin。這樣一個“三元組”中,xiaxip對應的是同一個人的影象,而xin是另外一個不同人的人臉影象。因此,距離||f(xia)f(xip)||2應該較小,而距離||f(xia)f(xin)||2應該較大。嚴格來說,三元組損失要求下面的式子成立