1.What is face recognition?
人臉驗證:
input:圖檔,名字/ID
output:是否為對應的那個人 (一對一問題)
人臉識别:
有一個資料庫有K個人
input:圖檔
output:如果圖檔是對應的K人中的一人,則輸出此人ID,否則驗證不通過 ,人臉識别比人臉驗證更難一些,如果一個人臉驗證系統的正确率為99%,即錯誤率為1%,将這個人臉驗證系統應用到另一個人臉識别系統,犯錯幾率就變為了K倍.即K%
2.One-shot learning
one-shot learning 指資料庫中的每個人都隻有一個樣本,利用這一個樣本來訓練一個CNN模型來進行人臉識别.
若資料庫有K個人,則CNN模型輸出softmax層就是K維的。

缺點:
1.每個人隻有一個樣本,樣本少,訓練的CNN 不夠健壯
2.當加入一個新成員的時候,需要對模型進行重新訓練,使softmax的次元加一,這增大了模型的計算量
為了解決這一問題,引入similarity 函數:
similarity function:
- d(img1, img2):兩幅圖檔之間的差異度
- 輸入:兩幅圖檔
- 輸出:兩者之間的差異度
- 如果 d(img1,img2)≤τd(img1,img2)≤τ,則輸出“same”;
- 如果 d(img1,img2)>τd(img1,img2)>τ,則輸出“different”.
對于人臉識别,隻需要計算圖檔與資料庫中的K張圖檔的d(img1,img2),取最小的為目标的比對對象,若都很大,則資料庫中沒有此人
3.Siamese Network
Siamese network是指将一般的CNN去掉softmax所得到的網絡
将每個人的圖檔輸入參數相同的網絡結構後,将最後的一個全連接配接層所得到的向量看成是原圖檔的編碼
建構Siamese network後,Similarity funtion用兩圖檔的編碼差範數表示:
d(x1,x2)=∥f(x1)−f(x2)∥22
接下來我們要學習參數來 使得表示同一個人的圖檔的範數差變得小,而表示不同人的圖檔的範數差變得大
4.Triplet Loss
讓網絡學習參數,建構合理的CNN,需要定義損失函數.我們引入Triplet Loss.
學習的目标:
Anchor(靶目标). Positive(與靶目标相同). Negative(與靶目标相反).
我們希望Anchor與Postive的圖像編碼接近一些,而Anchor與Negative的編碼不同一些,即||f(A)−f(D)||2盡可能小,而||f(A)−f(N)||2盡可能大,我們列出如下式子:
但這種情況的時候 f(A),f(P),f(N)都為0的時候也滿足這個表達式,但不是我們想要的結果,于是我們對上式進行修改,
其中α為超參數,且α大于0 順便提一下,這裡的α也被稱為邊界margin,類似與支援向量機中的margin。舉個例子,若d(A,P)=0.5d(A,P)=0.5,α=0.2,則d(A,N)≥0.7。
Loss Function如下:
L(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)
這裡triplet損失函數:目前者<=0時,則L(A, P, N) = 0,即損失函數為0;目前者>0時,則L(A, P, N) = 前者,此時,利用梯度下降降低損失函數,正好達到訓練參數的目的,最終訓練好的參數隻訓練到d(A, N) - d(A, P) >= alpha,即滿足margin要求。
Cost Function:
在選擇我們的A,P,N時,如果A,P太容易滿足d(A,P)+α<=d(A,N),
網絡不需要經過複雜訓練就能實作這種明顯識别,但是抓不住關鍵差別。是以,最好的做法是人為選擇A與P相差較大(例如換發型,留胡須等),A與N相差較小(例如發型一緻,膚色一緻等)。這種人為地增加難度和混淆度會讓模型本身去尋找學習不同人臉之間關鍵的差異,“盡力”讓d(A,P)更小,讓d(A,N)更大,即讓模型性能更好。
值得一提的是,現在許多商業公司建構的大型人臉識别模型都需要百萬級别甚至上億的訓練樣本。如此之大的訓練樣本我們一般很難擷取。但是一些公司将他們訓練的人臉識别模型釋出在了網上,可供我們使用。
5.Face verification and binary classfication
除了用Trilet loss外,我們還可以使用二分類結構
在兩個Siamese Network組合在一起,在每個的編碼輸出後加一個邏輯處理單元,該單元使用sigmoid函數,輸入兩張圖檔,若相同則輸出1,否則輸出0,這就将一個人臉識别問題轉化成了一個二分類問題
其輸出的表達式為
參數w_k,和b都是經過訓練得到的
還有一個表達式為
上式被稱為χ方公式,也叫χ方相似度.
在實際的人臉驗證系統中,我們可以對資料庫的人臉圖檔進行預計算,存儲卷積網絡得到的編碼。當有圖檔進行識别時,運用卷積網絡計算新圖檔的編碼,與預計算儲存好的編碼輸入到邏輯回歸單元中進行預測。這樣可以提高我們系統預測的效率,節省計算時間。
(注:該trick也同樣可以用到上面triplet loss function中,即提前将圖檔進行預編碼(走一遍Siamese網絡,得到去掉softmax層的輸出神經元的值),就避免了後續再對資料庫image進行計算編碼,提升了效率,如果不存儲圖檔,同時還能節省空間(對于大型資料集)。)
6.What is nerual style transfer?
神經風格遷移即是将一張圖檔的風格遷移到另一張圖檔的風格中,生成一張新的圖檔
一般用C表示内容圖檔,用S表示風格圖檔,用G表示生成圖檔
7.What is deep ConvNets learning?
卷積神經網絡每一層究竟在學什麼?
如何得知卷積神經網絡在學什麼?
1.挑選一個單元
2.周遊訓練集,尋找激活輸出最大的的圖檔或圖檔塊
3.對其他運算單元(不同濾波器通道)執行操作2
可以看出第一層通常會找一些簡單的特征,如邊緣,陰影等
随着層數的加深,所找的特征越來越複雜,從邊緣到紋理再到具體物體。
8.Cost funtion
風格遷移的Cost Function如下:
J(G)=α⋅Jcontent(C,G)+β⋅Jstyle(S,G)
其中 α,β為超參數,Jcontent(C,G),Jstyle(S,G)為圖檔C,G 與S,G的相似度
如何得到 G:
1.先随機初始化G
2.根據梯度下降算法最小化cost function來計算出得到G
9.Content cost function
Content cost function
假設我們正在使用l層來計算Jcontent(C,G)
使用已經訓練好的卷積神經網絡(如:VGG)
讓我們分别使用a[l](C),a[l](G)來表示圖檔C,圖檔G 在l層的激活輸出
如果a[l](C),a[l](G)相似,則兩者有相似的内容
(注:如果l層選的太小,那代價函數會使得生成圖檔G在像素上與内容圖檔C有相同的内容,如果l層選的太深,那麼會使得生成圖檔G出現圖檔C上的物體,是以對l層的選取,應該既不深也不淺)
content cost function:
Jcontent(C,G)=1/2||a[l](C)−a[l](G)||2
通過梯度下降不斷修正G的值,使得Jcontent不斷減小
10.Style cost function
一幅圖檔的"style"的意思,
假設你正在使用l層的激活來測量"style"
定義風格為不同通道激活項之間的相關性(激活項的乘積)
(注:上述定義是風格轉義的本質,即保證生成圖檔各通道激活項之間的相關性與參考圖檔各通道激活函數項之間的相關性近似。)
那麼如何取判斷相關或不相關,如下圖所示:
不同通道即為神經網絡所學習的特征,假設紅色通道即為提取圖檔的垂直特征,黃色通道為提取圖檔橙色背景
這兩個通道之間的相關性大小即為原始圖檔中包含垂直特征的區域同時為橙色區域的大小.
我們将相關系數應用到風格圖檔S和生成圖檔G的對應通道上,就可以度量風格圖檔和生成圖檔的相似度。
Style矩陣
11.1D and 3D generalizations of models
我們之前所講的卷積都是2D的,我們可以推廣到1D和3D
1D:
3D:
補充參考自:https://blog.csdn.net/red_stone1/article/details/79055467
https://blog.csdn.net/Dby_freedom/article/details/79883452