1. 程式人生 > >卷積神經網路--人臉識別和神經風格遷移

卷積神經網路--人臉識別和神經風格遷移

卷積神經網路 — 特殊應用:人臉識別和神經風格遷移

人臉識別

人臉驗證(Verification):

1. Input:圖片、名字/ID;

2.Output:輸入的圖片是否是對應的人。

3.1 to 1 問題。

    對於大多數的人臉識別系統都存在的一個問題就是one shot learning。

什麼是one shot learning:

    對於一個人臉識別系統,我們需要僅僅通過先前的一張人臉的圖片或者說一個人臉的樣例,就能夠實現該人的識別,那麼這樣的問題就是one shot 問題。對於存在於資料庫中的人臉圖片,系統能夠識別到對應的人;而不在資料庫中的人臉圖片,則系統給出無法通過識別的結果。

但是One-shot learning的效能並不好,其包含了兩個缺點

       1.每個人只有一張圖片,訓練樣本少,構建的CNN網路不夠健壯。

       2.若資料庫增加另一個人,輸出層softmax的維度就要發生變化,相當於要重新構建CNN網路,使模型計算量大大增加,不夠靈活。

    對於one shot learning 問題,因為只有單個樣本,是不足以訓練一個穩健的卷積神經網路來進行不同人的識別過程。而且,在有新的樣本成員加入的時候,往往還需要對網路進行重新訓練。所以我們不能以傳統的方法來實現識別系統。

Similarity 函式:

為了能夠讓人臉識別系統實現一次學習,需要讓神經網路學習

Similarity 函式:

d(img1, img2):兩幅圖片之間的差異度

輸入:兩幅圖片

輸出:兩者之間的差異度

如果d(img1,img2)⩽τ ,則輸出“一樣”;

如果d(img1,img2)>τ,則輸出“不一樣”.

        對於人臉識別系統,通過將輸入的人臉圖片與資料庫中所擁有的圖片成對輸入Similarity函式,兩兩對比,則可解決one shot problem。如果有新的人加入團隊,則只需將其圖片新增至資料庫即可。

 Siamese 網路

利用Siamese 網路來實現 Similarity 函式。

構建網路:

    對於一個卷積神經網路結構,我們去掉最後的softmax層,將圖片樣本1輸入網路,最後由網路輸出一個N維的向量(圖中例項以128表示),這N維向量則代表輸入圖片樣本1的編碼。將不同人的圖片樣本輸入相同引數的網路結構,得到各自相應的圖片編碼。

Similarity 函式實現:

將Similarity 函式表示成兩幅圖片編碼之差的範數:

那麼也就是說:

我們的神經網路的引數定義了圖片的編碼;

學習網路的引數,使我們得到好的Similarity 函式:

如果x1x2是同一個人的圖片,那麼得到的很小;

如果x1x2不是同一個人的圖片,那麼得到的很大。

Triplet 損失

    如何通過學習神經網路的引數,得到優質的人臉圖片的編碼?方法之一就是定義 Triplet 損失函式,並在其之上運用梯度下降。

學習目標:

    Triplet Loss需要每個樣本包含三張圖片:靶目標(Anchor)、正例(Positive)、反例(Negative),這就是triplet名稱的由來。顧名思義,靶目標和正例是同一人,靶目標和反例不是同一人。Anchor和Positive組成一類樣本,Anchor和Negative組成另外一類樣本

    為了使用Triplet 損失函式,我們需要比較成對的影象(三元組術語):

Anchor (A): 目標圖片;

Positive(P):與Anchor 屬於同一個人的圖片;

Negative(N):與Anchor不屬於同一個人的圖片。

對於Anchor 和 Positive,我們希望二者編碼的差異小一些;對於Anchor 和Negative,我們希望他們編碼的差異大一些。所以我們的目標以編碼差的範數來表示為:

也就是:    

    上面的公式存在一個問題就是,當f(A)=f(P)=f(N)=0時,也就是神經網路學習到的函式總是輸出0時,或者f(A)=f(P)=f(N)時,也滿足上面的公式,但卻不是我們想要的目標結果。所以為了防止出現這種情況,我們對上式進行修改,使得兩者差要小於一個較小的負數:

一般將α稱為“margin”。即:

    不同 margin 值的設定對模型學習具有不同的效果,margin 的作用就是拉大了 Anchor與Positive 圖片對 和 Anchor與Negative 圖片對之間的差距。

Triplet 損失函式**:

    Triplet 損失函式的定義基於三張圖片:Anchor、Positive、Negative。(A P同一人,N為不同人)

整個網路的代價函式:

    假設我們有一個10000張片的訓練集,裡面是1000個不同的人的照片樣本。我們需要做的就是從這10000張訓練集中抽取圖片生成(A,P,N)的三元組,來訓練我們的學習演算法,並在Triplet 損失函式上進行梯度下降。

注意:為了訓練我們的網路,我們必須擁有Anchor和Positive對,所以這裡我們必須有每個人的多張照片,而不能僅僅是一張照片,否則無法訓練網路。

三元組(A,P,N)的選擇:

在訓練的過程中,如果我們隨機地選擇圖片構成三元組(A,P,N),那麼對於下面的條件是很容易滿足的:

所以,為了更好地訓練網路,我們需要選擇那些訓練有“難度”的三元組,也就是選擇的三元組滿足:

演算法將會努力使得 d(A,N)變大,或者使d(A,N)+α變小,從而使兩者之間至少有一個α的間隔;(即設法將α設大

增加學習演算法的計算效率,避免那些太簡單的三元組。

最終通過訓練,我們學習到的引數,會使得對於同一個人的圖片,編碼的距離很小;對不同人的圖片,編碼的距離就很大。

    對於大型的人臉識別系統,常常具有上百萬甚至上億的訓練資料集,我們並我容易得到。所以對於該領域,我們常常是下載別人在網上上傳的預訓練模型,而不是從頭開始。

___________________________________________________________________________________

臉部驗證和二分類

除了利用 Triplet 損失函式來學習人臉識別卷積網路引數的方法外,還有其他的方式。我們可以將人臉識別問題利用Siamese網路當成一個二分類問題,同樣可以實現引數的學習。

Siamese 二分類改進:

對兩張圖片應用Siamese 網路,計算得到兩張圖片的N維編碼,然後將兩個編碼輸入到一個logistic regression 單元中,然後進行預測。如果是相同的人,那麼輸出是1;如果是不同的人,輸出是0。那麼這裡我們就將人臉識別的問題,轉化為一個二分類問題。

    在實際的人臉驗證系統中,我們可以對資料庫的人臉圖片進行預計算儲存卷積網路得到的編碼。當有圖片進行識別時,運用卷積網路計算新圖片的編碼,與預計算儲存好的編碼輸入到邏輯迴歸單元中進行預測。這樣可以提高我們系統預測的效率,節省計算時間。

總結:

利用Siamese 網路我們可以將人臉驗證當作一個監督學習,建立成對的訓練集和是否同一個人的輸出標籤。

我們利用不同的圖片對,使用反向傳播的演算法對Siamese網路進行訓練,進而得到人臉驗證系統。

Part 2:神經風格遷移

風格遷移:

    在進行神經風格遷移之前,我們先來從視覺化的角度看一下卷積神經網路每一層到底是什麼樣子?它們各自學習了哪些東西。

深度卷積網路到底在學什麼?

視覺化例子: 

    典型的CNN網路如下所示

各層的視覺化:

我們希望看到不同層的隱藏單元的計算結果。依次對各個層進行如下操作:

在當前層挑選一個隱藏單元;

遍歷訓練集,找到最大化地激活了該運算單元的圖片或者圖片塊;

對該層的其他運算單元執行操作。

    對於在第一層的隱藏單元中,其只能看到卷積網路的小部分內容,也就是最後我們找到的那些最大化啟用第一層隱層單元的是一些小的圖片塊。我們可以理解為第一層的神經單元通常會尋找一些簡單的特徵,如邊緣或者顏色陰影等。對於卷積網路的各層單元,隨著網路深度的增加,隱藏層計算單元隨著層數的增加,從簡單的事物逐漸到更加複雜的事物。

神經風格遷移代價函式

代價函式:

為了實現神經風格遷移,我們需要為生成的圖片定義一個代價函式。

其中:

執行過程:

隨機初始化生成圖片G,如大小為100×100×3

使用梯度下降演算法最小化上面定義的代價函式 J(G),

     對於上圖的內容圖片C和風格圖片S,通過梯度下降演算法一次次的徐訓練,我們可以由初始的噪聲圖片得到最終的風格遷移圖片G。

_____________________________________________________________________________

8. 內容代價函式(Content cost)

假設我們使用隱藏層 l 計算內容代價。(如果選擇的 l太小,那麼代價函式就會使得我們的生成圖片G在畫素上非常接近內容圖片;然而用很深的網路,那麼生成圖片G中就會產生與內容圖片中所擁有的物體。所以對於l一般選在網路的中間層,既不深也不淺);

使用一個預訓練的卷積網路。(如,VGG或其他);

定義內容代價函式如下:

    在對代價函式執行梯度下降演算法時,會激勵這裡的內容代價函式,努力使得生成圖片G隱含層l的啟用值和內容圖片C隱含層l的啟用值相似。

風格代價函式(Style cost)

“Style”的含義:

對於一個卷積網路中,我們選擇網路的中間層 l, 定義“Style”表示l層的各個通道啟用項之間的相關性。

相關性大小的度量:

    上面是我們選出的l層的啟用項,對於不同的通道值,代表不同的神經元所學習到的特徵,這裡假如紅色的通道可以找到圖片中含有垂直紋理特徵的區域,黃色通道可以找出橙色的區域。

而相關性大小的含義就是,如假設中,圖片出現垂直紋理特徵的區域顯示橙色可能的大小。我們將相關係數應用到風格圖片S和生成圖片G的對應通道上,就可以度量風格圖片和生成圖片的相似度。

Style 矩陣:

9. 1D to 3D 卷積

在我們上面學過的卷積中,多數是對圖形應用2D的卷積運算。同時,我們所應用的卷積運算還可以推廣到1D和3D的情況。

2D和1D卷積:

2D卷積:14×14×35×5×3>10×10×nc

1D卷積:14×15×1>10×nc

3D卷積:

3D卷積:

14×14×14×15×5×5×1>10×10×10×nc

14×14×14×15×5×5×1>10×10×10×nc

3D資料:如醫療CT掃描中的即可產生身體的3D模型;電影切片也屬於3D資料。