什麼是人臉驗證?
這可以認為是分類問題,使用匹配分數來驗證人的身份。如果兩個圖像屬於同一個人,則它們應具有較高的匹配度;如果兩個圖像屬於兩個不同的人,則匹配度應較低。
您可能想到的第一件事是,為什麼不將捕獲的圖像與另一個像素逐個匹配呢?如果所捕獲圖像的像素值與另一個圖像的像素值之間的距離(均方或絕對)很小,則它們應該對應於同一個人。但是,由於光線,位置或方向略有變化,圖像中的像素值也會發生巨大變化,因此該方法實際上效果不佳。
那我們現在怎麼辦呢?這就是卷積神經網絡(俗稱CNN)發揮作用的地方。通過將每個圖像嵌入d維向量空間,此類網絡可以幫助我們更好地表示圖像。然後評估圖像嵌入的相似性。
解決問題的一些方法
SVM:這裡的想法是為訓練集中的每個示例訓練一個線性SVM分類器。DeepID:在這裡,驗證任務被視為人臉識別的子問題(為每個人分配標籤)。暹羅網絡:這是基於以下思想:個人內部的距離應該比人際之間的距離小得多。在研究暹羅網絡之前,讓我們首先討論暹羅網絡所基於的一個非常重要的概念。那就是One Shot Learning。
「One Shot Learning」是一個對象分類問題,主要出現在計算機視覺中,它試圖從一個或幾個訓練樣本中學習有關對象分類的信息。通常,在深度學習中,我們需要大量的機器學習數據,我們獲得的機器學習數據越多則機器學習模型越好。但在人臉驗證的情況下,一個人不可能獲得數千張照片。其次,我們的大腦也不需要成千上萬的人的照片來識別一個人。
對於面部驗證任務,我們希望系統能夠從一張/幾張圖像中判斷一個人的身份。
如前所述,卷積神經網絡(CNN)有助於圖像的向量化表示。但是卷積神經網絡(CNN)確實需要訓練很多實例。此外,每次將一個新用戶的圖像添加到機器學習數據集中,都要對機器學習模型進行訓練,這很不方便。因此,為什麼不建立一個模型來學習兩個不同的人之間的距離呢?這正是暹羅網絡所要做的。
圖像x(1)被饋送給卷積神經網絡(CNN),由卷積層和全連接層組成。卷積層提供了一個特徵空間,而附加到卷積層的全連接層則在該空間中學習一個函數(大部分是非線性的)。我們最後得到的是一個特徵向量(在特徵向量中沒有添加softmax激活,因為在這個階段它不會被用於分類)。圖像x(2)被輸入到一個與上面完全相同的卷積神經網絡(CNN)。在我們的例子中,我們有第三張圖像x(3)被提供給相同的CNN。
我們選擇x(1)作為anchor圖像,x(2)作為正圖像,x(3)作為負圖像。anchor和正圖像屬於同一人,而負圖像是另一個人。因此,我們的目標是最小化正圖像和anchor之間的距離,同時最大化anchor和負圖像之間的距離。
該目標可以寫為:
我們可以添加一個超參數alpha
這裡A = x(1),P = x(2),N = x(3)
現在,我們如何將其構造為損失函數。
這稱為三重損失函數。如我們所見,此損失函數可確保max函數中的第一項不超過0。
Python實現
創建數據
這是創建機器學習數據集的Python代碼。它使用稱為Haar frontal face classifier 的預訓練分類器,該分類器以級聯方式識別人臉。下面的代碼存儲使用網絡攝像頭捕獲的20張人臉圖像,並將其存儲在文件夾中。
創建模型並進行訓練
創建數據集時,您可以看到我在現有圖像上填充了一些值(此處寬度為22,高度為12)。之所以如此,是因為使用了在ImageNet數據集上預訓練的VGG16模型,該神經網絡模型期望輸入圖像的尺寸為(224、224、3),而我們使用的數據集的每個圖像都為(200、180、3)。
對於每個人(由數據集文件夾內的文件夾標記的人),我們存儲5個(A,P,N)的triplets。然後對它們進行訓練,該模型本身包含三個VGG16模型,並由一個實現三重損失函數的Lambda層連接。
使用模型進行驗證
接收圖像img(使用網絡攝像頭捕獲的人的圖像)的detect_face函數查找面部並將其裁剪。用驗證如下:
a)我們在數據集文件夾中找到命名的文件夾。我們從該文件夾中選擇一個圖像。
b)我們隨機選擇另外三個文件夾,並從每個文件夾中選擇一個圖像。這些將作為negative images。
c)我們找到每個圖像的編碼,由detect_face返回,一個來自步驟a),三個來自步驟b)。
d)我們求出步驟a)和步驟b中每個圖像編碼的均方誤差。
e)如果從步驟b)獲得的任何圖像的誤差小於從步驟a)獲得的圖像的誤差,我們說該人已被授權,否則就沒有授權。