Face Recognition人臉識別

1. Face verification && Face recognition

人臉驗證:驗證輸入圖片中的那個人是否與他聲稱的身份相符,也被稱作1對1問題。

人臉識別:從一個大量人臉數據庫中找到匹配輸入圖片中的那個人。如果你有一個上百人的數據庫,你想得到一個可接受的識別誤差,那麼我們就需要構造一個驗證系統,用於驗證人臉識別的準確度,當準確率達到99.9%或更高時纔可以在100人的數據庫上運行而保證有很大機率不出錯。

構造一個人臉驗證作爲基本模塊,如果準確率夠高,就可以把它用在識別系統上。人臉識別之所以難,是因爲要解決one-shot(一次學習)問題。

2. One-shot Learning

在絕大多數人臉識別應用中,我們需要通過單單一張圖片或者單單一個人臉樣例,就能去識別這個人,one-shot learning就是解決這個問題的。

假設我們訓練這樣的人臉識別模型:將數據庫中所有人的人臉圖片都輸入到神經網絡中進行訓練,使用softmax輸出人數量+1個標籤,分別來對應前面的這些人或者非數據庫中人臉,所以會有人數量+1中輸出。但實際上這樣效果不好,因爲如此小的訓練集,不足以去訓練一個穩健的神經網絡。而且當你有新人需要加入到數據庫中,我們需要重新訓練神經網絡模型,這種做法肯定是不可取的。

所以要讓人臉識別能夠做到一次學習,爲了能有更好的效果,我們現在要做的是學習 Similarity函數

我們需要神經網絡學習這樣一個用d表示的函數,它以兩張圖片作爲輸入,然後輸出這兩張圖片的差異值。如果你放進同一個人的兩張照片,我們希望它能輸出一個很小的值。如果放進兩個長相差別很大的人的照片,我們希望它輸出的值很大。所以在識別過程中,如果這兩張圖的差異值小於某個閾值t,它是一個超參數,那麼這時就能預測這兩張圖片是同一個人;如果差異值大於t,那麼就能預測這是不同的兩個人。這就是解決人臉驗證的一個可行辦法。

只要你能學習這個函數d,通過輸入一對圖片,它將會告訴你這兩張照片是否是同一個人。如果之後有新的人臉加入到數據庫中,系統依然能照常工作。這樣我們就通過函數d解決了one-shot學習問題。

3. Siamese network

實現函數d的這個功能的一個方式就是用Siamese網絡。

輸入圖片x^{(1)},然後通過一系列卷積、池化、全連接層,最終得到這樣的特徵向量(有時候會送進softmax單元來做分類,但是在這裏我們不這麼做)。我們重點關注的是那個最後的全連接層向量,我們假設它有128個數,它是由深層網絡的全連接層計算出來的,我要給這128個數命名爲f(x^{(1)}),你可以把f(x^{(1)})看作是輸入圖像x^{(1)}的編碼。所以我們取這個輸入圖像,然後表示成一個128維的向量。、

建立一個人臉識別系統的方法就是,如果你要比較兩個圖片的話,例如這裏的x^{(1)}x^{(2)},我們需要將x^{(2)}繼續輸入進有同樣參數的同樣的神經網絡,然後得到一個不同的128維的向量,這個向量代表輸入圖像x^{(2)}的編碼f(x^{(2)})

這裏我們認爲這兩個編碼結果都能能夠很好地代表這兩張圖片,我們要做的就是定義d,將x^{(1)}x^{(2)}的距離d定義爲兩幅圖片的編碼之差的範數。所以對於兩個不同的輸入,運行相同的卷積神經網絡,然後比較它們,這一般叫做Siamese網絡架構。這裏提到的很多觀點,都來自於DeepFace這篇論文。

如何訓練這個Siamese神經網絡?我們實際要做的是訓練一個網絡,它計算得到的編碼可以用於函數d,函數d的結果告訴我們兩張照片是否是同一個人。更準確度的說,神經網絡的參數定義了一個編碼函數f(x^{(i)})。如果給定輸入圖像x^{(i)},這個網絡會輸出x^{(i)}的一個128維的編碼。我們要做的是學習參數,使得如果兩個圖片是x^{(i)}x^{(j)}是同一個人,那麼你得到的兩個編碼的距離就小;當是不同人的時候,編碼的差距就越大。

接下來我們會用到三元組損失函數來訓練上面神經網絡的參數!

4. Triplet loss

要想通過學習神經網絡的參數來得到優質的人臉圖片編碼,方法之一就是定義三元組損失函數然後應用梯度下降。

爲了應用三元組損失函數,我們需要比較成對的圖像,我們希望相似人的編碼差異較小,不同人的編碼差異較大,用三元組損失的術語來說,你要做的通常是看一個anchor圖片,你想讓anchor圖片和positive圖片的編碼差異較小,anchor圖片和Negative的圖片編碼差異較大。這就是爲什麼叫做三元組損失,它代表你通常會同時看三張圖片,你需要看anchor圖片,positive圖片、negative圖片,這裏把這三個圖片簡寫成APN。把這些寫成公式的話,你想要的是網絡的參數或者編碼能夠滿足以下特性,即

anchor圖片編碼減去positive圖片編碼,我們希望這個數值很小,準確說讓它們距離的平方小於等於 anchor圖片編碼減去negative圖片編碼的平方。

我們將這個式子做一下變化,再考慮極端情況下左側相減結果都是0,然後0\leqslant0,爲了阻止網絡出現這種情況,我們需要修改右側這個目標,也就是說不能剛好小於等於0,應該是相當小於0,所以左側應該小於一個負的α值(α是另一個超參數),這個就可以阻止網絡輸出無用的結果。我們對式子做變化移到左邊去,這個α也叫作間隔(margin)。間隔參數α的作用是拉大了anchor和positive圖片對和anchor與negative圖片對之間的差距。

三元組損失函數的定義基於三張圖片A、P、N,A和P是同一個人,A和N是不同人。  

我們對前面圖片的式子進行變換,損失函數就變成了取最大值。只要第一項小於0,那麼損失函數就是0.所以我們只要保證第一項小於等於0,那麼這個例子的損失就是0。另一方面如果這個大於0,然後你取它們的最大值,這樣你就會得到一個正的損失值,通過最小化這個損失函數,達到的效果就是使這部分成爲0或者小於等於0。只要這個損失函數小於等於0,網絡不會關心它負值有多大。

上面這是一個三元組定義的損失, 整個網絡的代價函數應該是訓練集中這些單個三元組損失的總和。假設你有一個包含1000個不同人臉的總共10000張圖片的訓練集,你要做的是取這10000張圖片然後生成這樣的三元組,然後訓練你的學習算法,對這種代價函數用梯度下降,這個代價函數就是定義在你數據集裏的這樣的三元組圖片上。注意,爲了定義三元組的數據集,你需要成對的A和P,即同一個人的成對的圖片。

當訓練完這個系統之後,你可以應用到你的一次學習問題上,對於你的人臉識別系統,可能你只有想要識別的某個人的一張照片,但對於訓練集,你需要確保有同一個人的多個圖片,至少是你訓練集裏的一部分人。這樣就有了成對的anchor和positive圖片了。

5. Face verification and binary classification 

Triple loss 三元組是一個學習人臉識別卷積網絡參數的好方法,還有其他學習參數的方法。這裏我們將人臉識別當做一個二分類問題。

另一個訓練神經網絡的方法是選取一對神經網絡,選取Siamese網絡,使其同時計算這些嵌入(比如說128維的嵌入),然後將其輸入到邏輯迴歸單元,然後進行預測。如果是相同的人,那麼輸出是1,若是不同的人,則輸出是0。這就把人臉識別問題轉換爲一個二分類問題。訓練這種系統時,可以替換triple loss的方法。

最後的邏輯迴歸單元是怎麼處理的?輸出\hat{y}會變成比如說sigmoid函數輸出。相比前面直接放入這些編碼,這裏我們將這一對128維的每一維元素差值的絕對值都計算出來,就想做普通的邏輯迴歸一樣,你將在這128個單元上訓練合適的權重,用來預測兩張圖片是否是同一個人。這是一個很合理的方法來學習預測0或1。

在這個學習公式中,我們輸入是一對圖片,這是你的訓練輸入x,輸出y是0或1,取決於你的輸入是否是相似圖片。與之前類似,我們在訓練一個Siamese網絡,意味着上面這個神經網絡擁有的參數和下面神經網絡參數相同。

這裏我們假設我們需要添加一張新圖片到數據庫中,我們可以提前將該圖片輸入到神經網絡中獲取其128維的特徵編碼。當我們輸入一個新圖片來識別時,我們可以直接使用上方的卷積網絡輸出新圖片編碼與之前計算好的編碼直接進行比較,然後輸出預測值\hat{y}。這種預先計算的思想可以節省大量的計算。這個預訓練的工作將人臉識別當作一個二分類問題,也可以用在triplet損失函數上。

總結一下,把人臉驗證當作一個監督學習,創建一個只有成對圖片的訓練集,不是三個一組,而是成對的圖片,目標標籤y是1,表示同一個人;目標標籤y是0,表示圖片中是不同的人。利用不同的成對圖片,使用反向傳播算法,去訓練神經網絡,訓練Siamese神經網絡。這種處理人臉驗證和識別拓展爲二分類問題的效果也很好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章