1. 程式人生 > >人臉識別和神經風格轉換

人臉識別和神經風格轉換

人臉識別

人臉識別是一個很有趣的卷積神經網路的應用。

來看看人臉驗證和人臉識別的區別。人臉驗證系統輸入的是一張圖片和某個人的名字或ID,輸出的是圖片是否是這個人。在人臉識別中,系統有K個人的資料庫,輸入一張圖片,如果圖片是這K個人中的一個,就輸出這個人的ID。

One-Shot學習

人臉識別面臨的一個問題是One-Shot學習(一次學習問題)。只有一張圖片,用這張圖片進行學習,這就是One-Shot學習問題。比如,人臉識別資料庫中,每個人的圖片只有一張,一張圖片是很難學習到一個很好的神經網路來識別資料庫裡的人。

解決的方法是,系統不去學習每個人的特有特徵,而是學習兩張圖片有哪些不同。給出一張圖片img1和人臉識別資料庫中的一個人的照片img2,為了判斷這兩張圖片是否是同一個人,我們需要有一個函式d(img1,img2)d(img1,img2),這個函式可以輸出兩張圖片的不同程度。我們再設定一個閾值ττ,如果d(img1,img2)≤τd(img1,img2)≤τ,那麼這兩張圖片是同一個人,如果d(img1,img2)>τd(img1,img2)>τ,那麼這兩張圖片不是同一個人。

Siamese network

學習d(img1,img2)d(img1,img2)函式可以使用Siamese network。

Siamese network結構如下: 
Siamese network
最後輸出的結果是一個長度為128的向量,這個向量可以認為是圖片的特徵編碼。第一幅圖的特徵編碼用f(x(1))f(x(1))表示,第二幅圖片的特徵編碼用f(x(2))f(x(2))表示。

函式d(img1,img2)d(img1,img2)定義為: 

d(img1,img2)=∥f(x(1))−f(x(2))∥22d(img1,img2)=‖f(x(1))−f(x(2))‖22

Siamese network具體的引數沒有在課程中給出來,詳情請看論文 Taigman et. al.,2014. DeepFace closing the gap to human level performance

三元組損失

要學習函式d(img1,img2)d(img1,img2),需要設定好訓練資料。我們選擇3張圖片,分別是 
三元組圖片
我們的目標圖片是Anchor,再選擇一張與Anchor是同一人的圖片Positive,然後選擇一張與Anchor不是同一人的圖片Negative,組成一個三元組。我們希望 

∥f(A)−f(P)∥2≤∥f(A)−f(N)∥2‖f(A)−f(P)‖2≤‖f(A)−f(N)‖2


如果訓練出來的模型計算出來的特徵編碼f(image)=0f(image)=0,那麼∥f(A)−f(P)∥2=0‖f(A)−f(P)‖2=0和∥f(A)−f(N)∥2=0‖f(A)−f(N)‖2=0,從而上一個不等式一定成立。演算法學習到了一個錯誤的模型。為了避免這種情況,我們新增一個超引數αα,α>0α>0, 

∥f(A)−f(P)∥2−∥f(A)−f(N)∥2<0−α‖f(A)−f(P)‖2−‖f(A)−f(N)‖2<0−α


把αα移動到不等式的左邊 

∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α<0‖f(A)−f(P)‖2−‖f(A)−f(N)‖2+α<0


超引數αα是一個比較少的數值,比如0.2,用於確保演算法不會學習出錯。

設定好訓練的物件,我們再定義一下損失函式。三元組的損失函式是 

l(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)l(A,P,N)=max(‖f(A)−f(P)‖2−‖f(A)−f(N)‖2+α,0)


當滿足不等式時,損失函式值為0;當不滿足不等式時,損失函式值為兩個特徵編碼向量的差值(大於0)。

當我們有m個三元組,成本函式J為 

J=∑i=1ml(A(i),P(i),N(i))J=∑i=1ml(A(i),P(i),N(i))

如果Negative是隨機選擇的一張不同的圖片,那麼∥f(A)−f(N)∥2‖f(A)−f(N)‖2的值是一個很大的數,很容易實現 

∥f(A)−f(P)∥2+α≤∥f(A)−f(N)∥2‖f(A)−f(P)‖2+α≤‖f(A)−f(N)‖2


神經網路的學習效果也就不好,因此,要選擇難以學習的三元組個神經網路學習。難以學習的三元組是指 

∥f(A)−f(P)∥2≈∥f(A)−f(N)∥2‖f(A)−f(P)‖2≈‖f(A)−f(N)‖2

人臉驗證和二分類

在Siamese網路後半段 
Siamese
計算出圖片的特徵編碼後,下一層需要輸出這兩張圖片是否是同一個人。這就可以轉換成一個二分類問題,可以使用sigmoid函式來預測兩張圖片是同一個人的概率。最後一層網路的計算可以是 

y^=sigmoid(∑k=1128wk|f(x(i)k)−f(x(j)k)|+b)y^=sigmoid(∑k=1128wk|f(xk(i))−f(xk(j))|+b)


或者是 

y^=sigmoid(∑k=1128wk(f(x(i)k)−f(x(j)k))2+b)y^=sigmoid(∑k=1128wk(f(xk(i))−f(xk(j)))2+b)

人臉驗證監督學習問題可以使用Siamese網路,使用的訓練集是 
人臉驗證監督學習訓練集

人臉驗證可以簡單的說是1比1問題(1張圖片和1張圖片做對比),人臉識別就是1比N問題,實現人臉識別的最簡單方法就是目標圖片與資料庫N個人的圖片進行N次人臉驗證,通過置信度來判斷目標圖片最像資料庫中的哪個人。

神經風格轉換

神經風格轉換是把一張圖片轉換成另外一張圖片的風格。比如 
神經風格轉換 
左邊的是風景圖,右邊是一幅藝術畫,是梵高畫的星空圖,把風景圖和星空圖結合起來,形成新的帶有星空圖藝術風格的風景圖。

卷積神經網路在學什麼

實現神經風格轉換要深入理解卷積神經網路在學習什麼。有一篇論文使用視覺化來展示了卷積神經網路在學習什麼。下面來直觀地瞭解一下。

下圖一個AlexNet的簡化版網路 
AlexNet的簡化版網路
在第一層網路中選擇一個神經元,尋找能夠最大化這個神經單元啟用函式的9張圖片。下圖是9組不同的能夠最大化神經單元啟用函式的9張圖片。 
layer1 
可以看到,第一層網路主要學習影象的邊緣和純顏色塊。

接著看第二層網路中能夠最大化神經單元啟用函式的9張圖片,同樣是9組圖片 
layer2 
第二層網路主要學習簡單的形狀,比如說線條、圓等。

接著看第三層網路 
layer3 
第三層網路可以學習簡單的物體。

接著看第四層網路 
layer4 
第四層網路可以學習更加複雜的物體,比如可以識別狗。

接著看第五層網路 
layer5 
第五層網路可以學習更加複雜的物體。

神經風格轉換的代價函式

為了判斷生成的圖片是否是內容和風格的結合體,我們定義神經風格轉換的代價函式 

J(G)=αJContent(C,G)+βJStyle(S,G)J(G)=αJContent(C,G)+βJStyle(S,G)


其中內容代價函式JContent(C,G)JContent(C,G)表示生成的圖片和內容原圖的相識度,風格代價函式JStyle(S,G)JStyle(S,G)表示生成的圖片和風格圖的相識度。αα和ββ用於衡量生成的圖片的內容和風格。

神經風格轉換的過程如下,首先隨機初始化Generated image,接著使用梯度下降最小化J(G)J(G) 

G=G−∂∂GJ(G)G=G−∂∂GJ(G)

下面一組圖表示了這個過程 
神經風格轉換梯度下降過程

內容代價函式

使用預訓練的卷積網路(比如VGG),使用某隱藏層l來計算內容代價函式。使用a[l](C)a[l](C)和a[l](G)a[l](G)分別表示內容原圖和生成圖片在第l層的啟用函式值。如果a[l](C)a[l](C)和a[l](G)a[l](G)相似,說明兩張圖片有相似的內容。所以 

JContent(C,G)=14×nH×nW×nC∥a[l](C)−a[l](G)∥2JContent(C,G)=14×nH×nW×nC‖a[l](C)−a[l](G)‖2

風格代價函式

我們使用第l層網路層的啟用值來衡量風格。定義風格是通道之間的啟用值的相關性。 
下圖是某個卷積層的啟用項。 
啟用項通道的相關性

上圖的啟用項有5個通道,使用不同顏色標記出來。每個通道相當於普通神經網路的神經元。使得紅色通道的啟用值最大化的9張圖片在圖中的紅色框中。使得黃色通道的啟用值最大化的9張圖片在圖中的黃色框中。紅色通道和黃色通道的啟用值的相關性強,是指當紅色框的豎條特徵出現時,黃色框中的橙色特徵有很大的概率會出現。紅色通道和黃色通道的啟用值的相關性不強,當紅色框的豎條特徵出現時,黃色框中的橙色特徵有很大的概率不會出現。紅色通道和黃色通道的啟用值的相關性也就是豎條特徵和橙色特徵的相關性。圖片的風格就是各種特徵之間的相關性。

計算啟用項通道的相關性,相當於計算圖片的風格。兩兩通道的相關性可以組成相關性矩陣,定義這個矩陣為風格矩陣。設a[l]i,j,kai,j,k[l]為第l層在(i,j,k)(i,j,k)的啟用值,其中i是指啟用項的高度n[l]HnH[l],j指啟用項的寬度n[l]WnW[l],k指啟用項的通道數n[l]cnc[l]。設G[l]G[l]為第l層的風格矩陣,大小是n[l]c×n[l]cnc[l]×nc[l]。風格圖在l層的風格矩陣的計算公式是 

G[l](S)kk′=∑i=1n[l]H∑j=1n[l]Wa[l](S)i,j,ka[l](S)i,j,k′Gkk′[l](S)=∑i=1nH[l]∑j=1nW[l]ai,j,k[l](S)ai,j,k′[l](S)


生成圖在l層的風格矩陣的計算公式是 

G[l](G)kk′=∑i=1n[l]H∑j=1n[l]Wa[l](G)i,j,ka[l](G)i,j,k′Gkk′[l](G)=∑i=1nH[l]∑j=1nW[l]ai,j,k[l](G)ai,j,k′[l](G)

最後判斷G[l](S)kk′Gkk′[l](S)和G[l](G)kk′Gkk′[l](G)的相似度。 

J[l]Style(S,G)=1(2n[l]Hn[l]Wn[l]c)2∥G[l](S)kk′−G[l](G)kk′∥2F=1(2n[l]Hn[l]Wn[l]c)2∑k∑k′(G[l](S)kk′−G[l](G)kk′)2JStyle[l](S,G)=1(2nH[l]nW[l]nc[l])2‖Gkk′[l](S)−Gkk′[l](G)‖F2=1(2nH[l]nW[l]nc[l])2∑k∑k′(Gkk′[l](S)−Gkk′[l](G))2


最後計算所有網路層的風格代價函式 

JStyle(S,G)=∑lλ[l]J[l]Style(S,G)JStyle(S,G)=∑lλ[l]JStyle[l](S,G)


其中λ[l]λ[l]是l層風格矩陣相似度的權重,不同網路層學習的特徵不同,不同特徵的重要性不同,所以可以加上權重。

一維到三維的推廣

卷積網路處理的資料不僅可以是二維的資料,還可以是一維的和三維的。

處理心電圖可以使用卷積網路,比如 
心電圖卷積 
心電圖的資料是一維的資料,使用一維的過濾器進行過濾,提取出我們需要的特徵。

處理人體模型的3D資料可以使用卷積網路。處理3D資料,需要使用3D的過濾器。 
3D資料卷積