4.4特殊應用:人臉識別和神經網絡風格轉換
覺得有用的話,歡迎一起討論相互學習~
4.1什么是人臉識別
Face verification人臉驗證 VS face recognition人臉識別
Face verification人臉驗證
- 人臉驗證
- 輸入是一張圖片,以及人的姓名或者ID作為標簽
- 輸出是這張輸入的圖片是否是這個確定的人
- 這時候也被稱為1對1問題
- 人臉識別
- 人臉識別問題比人臉驗證問題困難的多,其輸入為一個具有K個人的數據集,將一張圖片作為輸入,如果這張圖片是這K個人中的某一個,則輸出這個人的ID。
- 也就是說如果人臉驗證的錯誤率是1%,即正確率為99%,則這個系統在人臉識別問題上的准確率只有\(0.99^{k}\)
4.2 One-Shot learning
- 在絕大多數人臉識別項目中,你需要通過單單一張圖片或者單單一個人臉識別樣例就能去識別這個人。
- 而歷史上深度學習系統只有一個訓練樣例時,它的表現並不好。
One-Shot learning
- 通過一個樣本來進行學習,以能夠認出同一個人--因為在工業界中你的員工照片往往只有一張。
learning a "similarity" function
-
\[d(img1,img2)=degree\ of\ differemce\ between\ images \]
然后輸出兩張圖片的差異值--如果你放進同一個人的兩張照片,你希望他能輸出一個很小的值,如果你放進兩個長相差別很大的人的照片
\[If\ d(img1,img2)<=u 則判別這兩張圖片為同一張圖片 \]
\[>u則判別這兩張圖片為不同的圖片 \]

4.3 Siamese 網絡/DeepFace 系統
Taigman Y, Yang M, Ranzato M, et al. DeepFace: Closing the Gap to Human-Level Performance in Face Verification[C]// IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society, 2014:1701-1708.
- 方法是把第二張圖片傳給有相同參數的同樣的神經網絡,然后得到一個不同的128維的向量。
- 這個向量能夠代表一整張圖片的信息,

- 對於一張圖片而言,其可以通過卷積神經網絡將其轉化為一個128維度的向量--用以表征整張圖片。而得到的向量通過\(f(x^{(i)})\)進行表示,而系統的目的就是調整參數使得如果\(x^{(i)}\)和\(x^{(j)}\)表示的是同一張圖片則\(\parallel f(x^{(i)})-f(x^{(j)})\parallel_2\)的目標函數可以盡可能的小。得如果\(x^{(i)}\)和\(x^{(j)}\)表示的是不同的圖片則\(\parallel f(x^{(i)})-f(x^{(j)})\parallel_2\)的目標函數可以盡可能的大。

4.4 Triplet損失
learning a "similarity" function
Schroff F, Kalenichenko D, Philbin J. FaceNet: A unified embedding for face recognition and clustering[J]. 2015:815-823.
- 對於使用Siamese網絡的損失函數設置為三元組損失函數然后應用梯度下降。
- 為了使用三元組損失函數進行梯度下降,需要比較成對的圖像。即對於是同一個人的圖片你需要將兩者的三元組損失設置大一些,而對不同人的圖片你需要將兩者的三元組損失設置小一些。對於同時看三張圖片(Anchor原始圖片(A),positive 同一人物圖片(P),negative不同人物圖片(N))

- 用數學公式表達這一過程即為:
\[d(A,P)\le d(A,N) \]\[(f(A)-f(P))^{2}\le(f(A)-f(N))^{2} \]\[(f(A)-f(P))^{2}-(f(A)-f(N))^{2}\le0 \]
- 但是注意,這一過程不能使得f(A) = f(P) = f(N)=0,所以等式的右邊需要減去一個很小的數。
\[(f(A)-f(P))^{2}-(f(A)-f(N))^{2}\le0-\alpha \]\[(f(A)-f(P))^{2}-(f(A)-f(N))^{2}+\alpha\le0 \]這里的\(\alpha\)習慣被稱為margin.
- 三元組損失函數基於A,P,N三張圖片,其中A和P代表了同一個人,而A和N代表了不同的人。
- 三元損失函數可以被定義為 $$L(A,P,N)=max((f(A)-f(P))^{2}-(f(A)-f(N))^{2}+\alpha,0)$$
\[J=\sum^{m}_{i=1}L(A^{(i)},P^{(i)},N^{(i)}) \]
- 在訓練過程中\(d(A,P)+\alpha\le d(A,N)\)往往很容易達到,這就使在選擇圖片數據構成難以訓練的A,P,N三元組-- $$d(A,P) \approx d(A,N)$$
流行的命名方式
- 對於深度學習領域網絡模型的命名方式可以采用“_Net”或"Deep_"的形式,例如對於用於人臉識別的網路,可以將其命名為“FaceNet”或“DeepFace”
4.5Face verification and binary classification面部驗證與二分類
- Triplet loss 是一個學習人臉識別卷積神經網絡參數的好方法;將人臉識別當成一個二分類問題也可以很好地調整神經網絡的參數。
面部驗證與二分類
Taigman Y, Yang M, Ranzato M, et al. DeepFace: Closing the Gap to Human-Level Performance in Face Verification[C]// IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society, 2014:1701-1708.
- 將Siamese 網絡得到的兩個128維的編碼向量后接上回歸用的神經元,將其轉化為一個回歸問題,並且輸出為0或1表示兩個輸入的圖片是否來自同一張人臉。這就將人臉識別問題轉化為一個二分類的問題。

\[\hat{y}=\sigma(\sum^{128}_{k=1}W_{i}|f(x^{(i)})_{k}-f(x^{(j)}_{k})|+b)$$其中$\sigma$表示非線性激活函數。 或基於 **X-square similarity函數的回歸方法** $$\hat{y}=\sigma(\sum^{128}_{k=1}W_{i}\frac{(f(x^{(i)})_{k}-f(x^{(j)}_{k}))^{2}}{f(x^{(i)})_{k}+f(x^{(j)}_{k})}+b) \]
- 注意,在這個問題中,訓練的輸入是兩張圖片,而輸出是0或1.
- 並且由於使用的是一個Siamese網絡,所以上下兩個卷積神經網絡的參數完全相同。
- 對於門禁系統而言,如果下方的圖片來自離線的員工數據集,可以事先將表示向量計算好並保存起來。而上方的圖片來自員工進入時實時的圖片。通過預先計算數據庫中中已有圖片的編碼向量的方法,可以大大節省人臉識別的時間





