吳恩達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維,將其命名為
建立一個人臉識別系統的方法是,如果你要比較兩個圖片的話,把兩個圖片喂入有相同網路結構和引數的神經網路,然後分別得到一個128維的向量,兩個影象的編碼分別命名為
對於兩個不同的輸入,執行相同的卷積神經網路,然後比較他們這一般叫做Siamese網路架構[1]。
從上面的描述可知,計算兩個圖片的網路結構有著同樣的引數,所以實際只需要訓練一個網路,它計算得到的編碼可以用於計算函式d,換句話說其實就是神經網路的引數定義了一個編碼函式
4.Triplet損失
想要通過神經網路來學到好的人臉影象編碼,方法之一是定義三元組損失函式然後用梯度下降,為了應用三元組損失函式,你需要比較成對的影象。
用Triplet的術語來說,你通常會看到anchor(A)、positive(P))、negtative(N)三幅影象,positive是和anchor是同一個人,negative和anchor是不同的人,所以我們希望我們的網路引數能滿足:
Triplet損失函式的定義:
Triplet損失函式的定義基於A、P、N三張圖片,損失函式可以表示為:
所以只要能使
假如你有一個1萬張圖片的訓練樣本集,包含1000個人,那麼平均每個人有10張圖片,將其構建成A、P、N的三元組組合,從而訓練網路結構,最終通過梯度下降來訓練你的網路。
隨機的選擇圖片構成三元組組合可以達到目的,但是這樣的訓練樣本集很容易就能滿足
5.面部驗證與二分類
這部分分享了一種把人臉識別轉變成二分類問題的方法。這種方法選取一對Siamese網路結構,使其同時計算影象的embedings,然後將這些embeding輸入到邏輯迴歸單元進行預測,如果是同一個人就輸出1,不是同一個人就輸出0,這種方法可以替代Triplet損失,最後的邏輯迴歸單元
參考文獻
[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