1. 程式人生 > >吳恩達deeplearning之CNN—人臉識別與風格化轉換(1)

吳恩達deeplearning之CNN—人臉識別與風格化轉換(1)

1.什麼是人臉識別

  這部分演示了百度總部大樓的人臉識別系統,員工刷臉進出辦公區,在這個演示中主要應用到了人臉識別技術和活體檢測。
人臉識別的術語:
1)face verification:輸入影象、名字ID判斷輸入影象是不是名字ID指定的使用者
2)face recognition:有一個包含K個使用者的資料庫,拿到一幅圖片,然後判斷圖片中的人是不是在資料庫中,在輸出指定使用者name,不在就輸出未識別。
  人臉識別要比人臉驗證要困難的多,在人臉驗證中準確率99%也許可以接受,但是放到包含100個使用者的人臉識別資料集下,這個誤差就會被放大,意味著1%的概率會出錯。在後續我們首先構建人臉驗證系統作為基本模組,如果準確率夠高就可以把它用在識別系統上。人臉驗證系統的難點在於解決one-shot learning(一次學習)問題。
這裡寫圖片描述

2. one-shot learning

  one-shot的意思是你需要通過單單一張圖片,就能去識別這個人,但是在深度學習中只有一個訓練樣本時,它的表現並不好,那麼如何去解決這個問題呢?
  假如員工資料庫有四個員工,當某個員工來的時候,你想通過人臉識別系統判斷他是不是四個員工之一,系統需要做的是僅僅通過一張照片,來識別前面這個人。所以在one-shot學習問題中只能通過一個樣本來進行學習以能夠認出同一個人,大多數人臉識別系統都要解決這個問題,因為在你的資料庫中每個僱員可能都只有一張照片。有一種辦法是將人的照片輸入卷積神經網路,使用softmax單元輸出5個標籤,分別對應四個員工和四個都不是,但是這樣的效果並不好,假如有新的員工加入你的團隊,你就需要重新訓練你的神經網路,這個確實有些糟糕。
這裡寫圖片描述


  要讓人臉識別做到一次學習,為了能有更好的效果,你需要做的是學習similarity函式,詳細的說就是下圖中d表示的函式,d以兩張圖片作為輸入,然後輸出這兩張圖片的差異值,如果是同一個人的兩張照片,希望輸出一個很小的值,如果是兩個差異很大的人的照片d輸出一個很大的值。這樣新加入一個員工只許將其的照片加入到資料庫中即可,不需要重新訓練模型。
這裡寫圖片描述

3.Siamese網路

  Siamese網路就是實現上節函式d的訓練,你經常會看到如下的網路結構,輸入一個影象經過一系列的卷積、池化和全連線層最終得到一個特徵向量,有時候會將其輸入softmax單元來做分類,但是在這裡我們不需要將其輸入softmax單元。加入輸出的特徵向量大小是128維,將其命名為f

(x(1)),你可以將其看成輸入影象的編碼。

  建立一個人臉識別系統的方法是,如果你要比較兩個圖片的話,把兩個圖片喂入有相同網路結構和引數的神經網路,然後分別得到一個128維的向量,兩個影象的編碼分別命名為f(x(1))f(x(2))x(1)x(2)分別表示輸入的兩張圖片,那麼將兩張圖片的編碼只差可以定義為:

d(x(1),x(2))=||f(x(1))f(x(2))||22
對於兩個不同的輸入,執行相同的卷積神經網路,然後比較他們這一般叫做Siamese網路架構[1]。
這裡寫圖片描述
  從上面的描述可知,計算兩個圖片的網路結構有著同樣的引數,所以實際只需要訓練一個網路,它計算得到的編碼可以用於計算函式d,換句話說其實就是神經網路的引數定義了一個編碼函式f(xi)可以將圖片轉換成向量編碼。所以我們需要做的就是訓練這個網路,使其在兩張圖片是同一個人的時候距離函式儘可能的小,不是同一個人的時候距離函式儘可能的大。

這裡寫圖片描述

4.Triplet損失

  想要通過神經網路來學到好的人臉影象編碼,方法之一是定義三元組損失函式然後用梯度下降,為了應用三元組損失函式,你需要比較成對的影象。
  用Triplet的術語來說,你通常會看到anchor(A)、positive(P))、negtative(N)三幅影象,positive是和anchor是同一個人,negative和anchor是不同的人,所以我們希望我們的網路引數能滿足:

d(A,P)d(A,N)0其中:d(A,P)=||f(A)f(P)||2,d(A,N)=||f(A)f(N)||2,這個函式還存在一個問題就是如果d(A,P)和d(A,N)都為0也滿足上不等式,但是這並不是我們所想要的,為了避免網路最終學出上面情況,我們在公式中加入超引數α,公式變形為:
d(A,P)d(A,N)+α0
這裡寫圖片描述
Triplet損失函式的定義:
  Triplet損失函式的定義基於A、P、N三張圖片,損失函式可以表示為:
l(A,P,N)=max(d(A,P)d(A,N)+α,0)
  所以只要能使d(A,P)d(A,N)+α0損失函式的值就為0,如果d(A,P)d(A,N)+α>0大於0就會得到一個正損失。損失函式只關心d(A,P)d(A,N)+α0,但是並不關心小多少。整個網路的代價函式表示為:
J=i=1ml(Ai,Pi,Ni),
  假如你有一個1萬張圖片的訓練樣本集,包含1000個人,那麼平均每個人有10張圖片,將其構建成A、P、N的三元組組合,從而訓練網路結構,最終通過梯度下降來訓練你的網路。

這裡寫圖片描述
  隨機的選擇圖片構成三元組組合可以達到目的,但是這樣的訓練樣本集很容易就能滿足d(A,P)d(A,N)+α0的條件,我們在選擇訓練樣本集 的時候更多應該關注A和N之間差異比較小的影象,從而讓網路在這些影象上有更好的區分度[2]。
這裡寫圖片描述
這裡寫圖片描述

5.面部驗證與二分類

  這部分分享了一種把人臉識別轉變成二分類問題的方法。這種方法選取一對Siamese網路結構,使其同時計算影象的embedings,然後將這些embeding輸入到邏輯迴歸單元進行預測,如果是同一個人就輸出1,不是同一個人就輸出0,這種方法可以替代Triplet損失,最後的邏輯迴歸單元

yˆ=σ(k=1128|f(x(i))kf(x(j))k|)+b其中:k為embeding的下標。因為是Siamese網路結構,上下兩個網路結構的引數是完全一致的。
這裡寫圖片描述
這裡寫圖片描述

參考文獻

[1] DeepFace closing the gap to human level performance. Taigeman et.al 2014
[2] FaceNet:A unified embeding for face recognition and clustering.Schroff et al.2015