1.What is face recognition?算法
人臉驗證:數據庫
input:圖片,名字/ID網絡
output:是否爲對應的那我的 (一對一問題)dom
人臉識別:函數
有一個數據庫有K我的性能
input:圖片學習
output:若是圖片是對應的K人中的一人,則輸出此人ID,不然驗證不經過 ,人臉識別比人臉驗證更難一些,若是一我的臉驗證系統的正確率爲99%,即錯誤率爲1%,將這我的臉驗證系統應用到另外一我的臉識別系統,犯錯概率就變爲了K倍.即K%編碼
one-shot learning 指數據庫中的每一個人都只有一個樣本,利用這一個樣原本訓練一個CNN模型來進行人臉識別.atom
若數據庫有K我的,則CNN模型輸出softmax層就是K維的。spa
缺點:
1.每一個人只有一個樣本,樣本少,訓練的CNN 不夠健壯
2.當加入一個新成員的時候,須要對模型進行從新訓練,使softmax的維度加一,這增大了模型的計算量
爲了解決這一問題,引入similarity 函數:
similarity function:
對於人臉識別,只須要計算圖片與數據庫中的K張圖片的d(img1,img2),取最小的爲目標的匹配對象,若都很大,則數據庫中沒有此人
Siamese network是指將通常的CNN去掉softmax所獲得的網絡
將每一個人的圖片輸入參數相同的網絡結構後,將最後的一個全鏈接層所獲得的向量當作是原圖片的編碼
構建Siamese network後,Similarity funtion用兩圖片的編碼差範數表示:
d(x1,x2)=∥f(x1)−f(x2)∥22
接下來咱們要學習參數來 使得表示同一我的的圖片的範數差變得小,而表示不一樣人的圖片的範數差變得大
讓網絡學習參數,構建合理的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)更大,即讓模型性能更好。
值得一提的是,如今許多商業公司構建的大型人臉識別模型都須要百萬級別甚至上億的訓練樣本。如此之大的訓練樣本咱們通常很難獲取。可是一些公司將他們訓練的人臉識別模型發佈在了網上,可供咱們使用。
除了用Trilet loss外,咱們還可使用二分類結構
在兩個Siamese Network組合在一塊兒,在每一個的編碼輸出後加一個邏輯處理單元,該單元使用sigmoid函數,輸入兩張圖片,若相同則輸出1,不然輸出0,這就將一我的臉識別問題轉化成了一個二分類問題
其輸出的表達式爲
參數w_k,和b都是通過訓練獲得的
還有一個表達式爲
上式被稱爲χ方公式,也叫χ方類似度.
在實際的人臉驗證系統中,咱們能夠對數據庫的人臉圖片進行預計算,存儲卷積網絡獲得的編碼。當有圖片進行識別時,運用卷積網絡計算新圖片的編碼,與預計算保存好的編碼輸入到邏輯迴歸單元中進行預測。這樣能夠提升咱們系統預測的效率,節省計算時間。
(注:該trick也一樣能夠用到上面triplet loss function中,即提早將圖片進行預編碼(走一遍Siamese網絡,獲得去掉softmax層的輸出神經元的值),就避免了後續再對數據庫image進行計算編碼,提高了效率,若是不存儲圖片,同時還能節省空間(對於大型數據集)。)
神經風格遷移便是將一張圖片的風格遷移到另外一張圖片的風格中,生成一張新的圖片
通常用C表示內容圖片,用S表示風格圖片,用G表示生成圖片
卷積神經網絡每一層究竟在學什麼?
如何得知卷積神經網絡在學什麼?
1.挑選一個單元
2.遍歷訓練集,尋找激活輸出最大的的圖片或圖片塊
3.對其餘運算單元(不一樣濾波器通道)執行操做2
能夠看出第一層一般會找一些簡單的特徵,如邊緣,陰影等
隨着層數的加深,所找的特徵愈來愈複雜,從邊緣到紋理再到具體物體。
風格遷移的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
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不斷減少
一幅圖片的"style"的意思,
假設你正在使用l層的激活來測量"style"
定義風格爲不一樣通道激活項之間的相關性(激活項的乘積)
(注:上述定義是風格轉義的本質,即保證生成圖片各通道激活項之間的相關性與參考圖片各通道激活函數項之間的相關性近似。)
那麼如何取判斷相關或不相關,以下圖所示:
不一樣通道即爲神經網絡所學習的特徵,假設紅色通道即爲提取圖片的垂直特徵,黃色通道爲提取圖片橙色背景
這兩個通道之間的相關性大小即爲原始圖片中包含垂直特徵的區域同時爲橙色區域的大小.
咱們將相關係數應用到風格圖片S和生成圖片G的對應通道上,就能夠度量風格圖片和生成圖片的類似度。
Style矩陣
咱們以前所講的卷積都是2D的,咱們能夠推廣到1D和3D
1D:
3D:
補充參考自:https://blog.csdn.net/red_stone1/article/details/79055467
https://blog.csdn.net/Dby_freedom/article/details/79883452