一、什么是人臉識別
老實說這一節中的人臉識別技術的演示的確很牛bi,但是演技好尷尬,233333
啥是人臉識別就不用介紹了,下面筆記會介紹如何實現人臉識別。
二、One-shot(一次)學習
假設我們發財了,開了一家公司。然后作為老板的我們希望與時俱進,所以想使用人臉識別技術來實現打卡。
假如我們公司只有4個員工,按照之前的思路我們訓練的神經網絡模型應該如下:

如圖示,輸入一張圖像,經過CNN,最后再通過Softmax輸出5個可能值的大小(4個員工中的一個,或者都不是,所以一一共5種可能性)。
看起來好像沒什么毛病,但是我們要相信我們的公司會越來越好的啊,所以難道公司每增加一個人就要重新訓練CNN以及最后一層的輸出數量嗎?
這顯然有問題,所以有人提出了一次學習(one-shot),更具體地說是通過一個函數來求出輸入圖像與數據庫中的圖像的差異度,用\(d(img1,img2)\)表示。

如上圖示,如果兩個圖像之間的差異度不大於某一個閾值 τ,那么則認為兩張圖像是同一個人。反之,亦然。
下一小節介紹了如何計算差值。
三、Siamese網絡
注意:下圖中兩個網絡參數是一樣的。
先看上面的網絡。記輸入圖像為\(x^{(1)}\),經過卷積層,池化層和全連接層后得到了箭頭所指位置的數據(一般后面還會接上softmax層,但在這里暫時不用管),假設有128個節點,該層用\(f(x^{(1)})\)表示,可以理解為輸入\(x^{(1)}\)的編碼。
那么下一個網絡同理,不再贅述。
因此上一節中所說的差異度函數即為
\(d(x^{(1)},x^{(2)})=||f(x^{(1)})-f(x^{(2)})||^2\)

問題看起來好像解決了,但總感覺還漏了點什么。。。
沒錯!!!
你沒錯!!!
神經網絡的參數咋確定啊?也就是說\(f(x^{(i)})\)的參數怎么計算呢?
首先我們可以很明確的是如果兩個圖像是同一個人,那么所得到的參數應該使得\(||f(x^{(1)})-f(x^{(2)})||^2\)的值較小,反之較大。(如下圖示)

沿着這個思路我們繼續看下一小節內容~~~
四、Triple損失
1. Learning Objective
這里首先介紹一個三元組,即 (Anchor, Positive, Negative),簡寫為(A,P,N)
Anchor: 可以理解為用於識別的圖像
Positive: 表示是這個人
Negative: 表示不是同一個人
由上一節中的思路,我們可以得到如下不等式:
\(d(A,P)\leqq d(A,N)\),即\(||f(A)-f(P)||^2-||f(A)-f(N)||^2\leqq0\) (如下圖示)

但是這樣存在一個問題,即如果神經網絡什么都沒學到,返回的值是0,也就是說如果\(f(x)=\vec{0}\)的話,那么這個不等式是始終成立的。(如下圖示)

為了避免上述特殊情況,而且左邊值必須小於0,所以在右邊減去一個變量\(α\),但是按照慣例是加上一個值,所以將\(α\)加在左邊。


綜上,所得到的參數需要滿足如下不等式
\(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α\leqq0\)
2. Lost function
介紹完三元組后,我們可以對單個圖像定義如下的損失函數(如下圖示)
\(L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α,0)\)
解釋一下為什么用max函數,因為如果只要滿足\(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α\leqq0\),我們就認為已經正確識別出了圖像中的人,所以對於該圖像的損失值是0.

所以總的損失函數是 : \(J=\sum{L(A^{(i)},P^{(i)},N^{(i)})}\)
要注意的是使用這種方法要保證每一個人不止有一張圖像,否則無法訓練。另外要注意與前面的One-shot區分開來,這里是在訓練模型,所以訓練集的數量要多一些,每個人要有多張照片。而One-shot是進行測試了,所以只需一張用於輸入的照片即可。
3. Choosing the triplets(A,P,N)
還有一個很重要的問題就是如何選擇三元組(A,P,N)。因為實際上要滿足不等式\(d(A,P)+α\leqq d(A,N)\)是比較簡單的,即只要將Negative選擇的比較極端便可,比如anchor是一個小女孩,而Negative選擇一個老大爺。
所以還應該盡量滿足\(d(A,N)\approx{d(A,N)}\)

五、面部驗證與二分類
通過以上內容,我們可以確定下圖中的網絡的參數了,那么現在開始進行面部驗證了。
上面的是測試圖,下面的是數據庫中的一張照片。
和之前一樣假設\(f(x^{(i)})\)有128個節點,之后這兩個數據作為輸入數據輸入到后面的邏輯回歸模型中去,即
\(\hat{y}=σ(\sum_{k=1}^{128}w_i|f(x^{(i)})_k-f(x^{(j)})_k|+b_i)\)
若\(\hat{y}=1\),為同一人。反之,不是。
如下圖示,綠色下划線部分可以用其他公式替換,即有
\(\hat{y}=σ(\sum_{k=1}^{128}w_i \frac{(f(x^{(i)})_k-f(x^{(j)})_k)^2}{f(x^{(i)})_k+f(x^{(j)})_k}+b_i)\)

當然數據庫中的圖像不用每次來一張需要驗證的圖像都重新計算,其實可以提前計算好,將結果保存起來,這樣就可以加快運算的速度了。

六、什么是神經風格轉換
如下圖示,不多贅述。

七、深度卷積網絡在學什么?



八、代價函數
如下圖示:
左上角的包含Content的圖片簡稱為C,右上角包含Style的簡稱S,二者融合后得到的圖片簡稱為G。
我們都知道計算問題必須是有限的,所以融合的標准是什么?也就是說Content的保留程度和Style的運用程度如何取舍呢?
此時引入損失函數,並對其進行最優化,這樣便可得到最優解。
\(J(G)=αJ_{Content}(C,G)+βJ_{Style}(S,G)\)
\(J_{Content}(C,G)\)表示圖像C和圖像G之間的差異,\(J_{Style}(S,G)\)同理。

計算過程示例:
- 隨機初始化圖像G,假設為100*100*3 (如下圖右邊四個圖像最上面那個所示)
- 使用梯度下降不斷優化J(G)。 (優化過程如下圖右邊下面3個圖像所示)

下面一小節將具體介紹損失函數的計算。
九、內容代價函數
- 首先假設我們使用第\(l\)層隱藏層來計算\(J_{Content}(C,G)\),注意這里的\(l\)一般取在中間層,而不是最前面的層,或者最后層。
原因如下:
- 假如取第1層,那么得到的G圖像將會與圖像C像素級別的相似,這顯然不行。
- 假如取很深層,那么該層已經提取出了比較重要的特征,例如圖像C中有一條狗,那么得到的圖像G會過度的保留這個特征。
-
然后使用預先訓練好的卷積神經網絡,如VGG網絡。這樣我們就可以得到圖像C和圖像G在第\(l\)層的激活函數值,分別記為\(a^{[l][C]},a^{[l][G]}\)
-
內容損失函數 \(J_{Content}(C,G)=\frac{1}{2}||a^{[l][C]}-a^{[l][G]}||^2\)

十、風格損失函數
1.什么是“風格”
要計算風格損失函數,我們首先需要知道“風格(Style)”是什么。
我們使用\(l\)層的激活來度量“Style”,將“Style”定義為通道間激活值之間的相關系數。(Define style as correlation between activation across channels)

那么我們如何計算這個所謂的相關系數呢?
下圖是我們從上圖中所標識的第\(l\)層,為方便說明,假設只有5層通道。

如上圖示,紅色通道和黃色通道對應位置都有激活項,而我們要求的便是它們之間的相關系數。
但是為什么這么求出來是有效的呢?為什么它們能夠反映出風格呢?
繼續往下看↓
2.圖像風格的直觀理解
如圖風格圖像有5層通道,且該圖像的可視化特征如左下角圖所示。
其中紅色通道可視化特征如圖中箭頭所指是垂直條紋,而黃色通道的特征則是橘色背景。
那么通過計算這兩層通道的相關系數有什么用呢?
其實很好理解,如果二者相關系數性強,那么如果出現橘色背景,那么就應該很大概率出現垂直條紋。反之,亦然。

3.風格相關系數矩陣
令\(a_{i,j,k}^{[l]}\)表示(i,j,k)的激活項,其中i,j,k分別表示高度值(H),寬度值(W)以及所在通道層次(C)。
風格矩陣(也稱為“Gram Matrix”)用\(G^{[l]}\)表示,其大小為\(n_c^{l]}*n_c^{l]}\).
因此風格圖像的風格矩陣為:
生成圖像的相關系數矩陣

4.風格損失函數
第\(l\)層的風格損失函數為:
總的風格損失函數:
