1. 程式人生 > >DeepLearning.ai筆記:(4-4)-- 特殊應用:人臉識別和神經風格轉換

DeepLearning.ai筆記:(4-4)-- 特殊應用:人臉識別和神經風格轉換


title: ‘DeepLearning.ai筆記:(4-4)-- 特殊應用:人臉識別和神經風格轉換’
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-10-12 18:55:15
    id: dl-ai-4-4

首發於個人部落格:fangzh.top,歡迎來訪
本週講了CNN的兩個特殊應用:人臉識別和神經風格轉換。

人臉識別

Face Verification and Face Recognition

人臉識別和人臉驗證不一樣。

人臉驗證是輸入一張圖片,和這個人的ID或者名字,然後根據輸入的圖片判斷這個人是不是對應這個ID,是個1對1的問題。

人臉識別是有K個人的資料庫,然後輸入一張人臉的圖片,不確定他是哪一位,然後輸出在K個人的資料庫中對應的那個人,是1對K的問題。

所以人臉識別難度更高,而且精度要求更高,因為如果每張圖片都是99%的精度,那麼K個人就是K倍了,所以應該有99.9%以上的精度。

One shot learning

人臉識別系統,通常都是隻有一個人臉的樣例,然後就能夠成功的識別是不是這個人。這就是one shot learning,一次學習,單單通過一張照片就能識別這個人。

因此,在只有單個樣本的情況下,並不能用之前的方法來實現這個識別系統。這裡就需要有一個相似性函式。

similarity函式:

通過 d ( i m g 1 , i m g

2 ) d(img1,img2) 來表示兩張圖片的差異程度,如果d大於某個閾值,那麼就表示差別很大,如果小於某個閾值,則認為是同一個人。

Siamese網路

那麼如何計算這個 d ( i m g 1 , i m g 2 ) d(img1,img2) 呢?

可以利用Siamese網路來實現。

如圖,輸入兩張圖片 x ( 1 ) , x ( 2 ) x^{(1)},x^{(2)} ,經過一個卷積神經網路,去掉最後的softmax層,可以得到N維的向量, f ( x ( 1 ) ) , f ( x ( 2 ) ) f(x^{(1)}),f(x^{(2)}) ,假設是128維,而N維的向量就相當於是對輸入圖片的的編碼(encoding)。

然後比較這兩個向量之間的差值:

d ( x 1 , x 2 ) = f ( x 1 ) f ( x 2 ) 2 2 d(x1,x2) = ||f(x1) - f(x2)||^{2}_{2}

如果距離 d d 很小,那表示這兩張圖片很相近,認為是同一個人。

如果距離 d d 很大,那麼表示這兩張圖片差別很大,不是同一個人。

Triplet loss

那麼,我們之前說到,要得到輸入圖片的向量編碼 f ( x ) f(x) ,是需要經過卷積神經網路的,那麼卷積神經網路的引數如何確定呢?使用的方法就是Triplet loss損失函式,而後用梯度下降法進行迭代。

我們需要比較兩組成對的影象 (Anchor, Positive, Negative),簡寫(A,P,N)

Anchor:表示要檢測的目標圖片

Positive:表示與anchor同個人的圖片

Negative:表示與anchor不同個人的圖片

所以我們希望A和P的距離小,A和N的距離大,因此有了如下不等式:

f ( A ) f ( P ) 2 f ( A ) f ( N ) 2 + α 0 ||f(A) - f(P)||^2 - ||f(A) - f(N)||^2 + \alpha \leq 0

這裡這個公式與SVM的損失函式很類似, α \alpha 是表示margin邊界,也就是增加 d ( A , P ) d(A,P) d ( A , N ) d(A,N) 之間的差距。

而如果上面的不等式小於0,那說明是符合我們的要求的,如果是大於0,則要計入損失函式中,所以得到了Triplet loss的公式是:

L ( A , P , N ) = m a x ( 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 + \alpha,0)

整個網路的代價函式就是把所有的圖片損失加起來:

J = L ( A , P , N ) J = \sum L(A,P,N)

三元組的選擇

每個三元組的選擇是有講究的,如果你要識別的是一個女人,然後對比的Negative是個老大爺,那麼條件就很容易滿足,學不到什麼東西。所以應該儘量選擇那些相似的圖片進行每一組的訓練,也就是:

d ( A , P ) d ( A , N ) d(A,P) \approx d(A,N)

選擇的例子如下圖,可以看到,每一個三元組對比的都是一些比較相似的圖片:

臉部驗證和二分類

除了之前說的用Triplet loss進行訓練以外,還有別的方法來進行訓練,也就是可以把Siamese網路當做一個二分類的問題。

如圖,輸入兩張圖片,當計算得到了兩個圖片的向量編碼後,求兩張圖片的距離,然後通過一個sigmoid函式,把他變成一個二分類問題,如果同個人,輸出1,不同個人則輸出0。其中,權重 W , b W,b 都可以通過訓練來得到。

這個時候,人臉識別問題就變成了一個監督學習的問題,在建立每一對訓練集的時候,應該有對應的輸出標籤y。

神經風格遷移

神經風格的遷移,就是輸入兩張圖片,一張當做內容圖片content,另一張當做風格圖片style,輸出的圖片g兼具有一張的內容,和另一張的風格。

卷積神經網路學什麼?

在進行風格遷移前,我們需要了解我們的神經網路到底在學些什麼東西,把中間的隱藏單元拎出來看看。

如上圖,假設我們有一個卷積神經網路,要看到不同層的隱藏單元計算結果,怎麼辦?依次對各個層進行如下操作:

  • 在當前層挑選一個隱藏單元;
  • 遍歷訓練集,找到最大化地激活了該運算單元的圖片或者圖片塊;
  • 對該層的其他運算單元執行操作。

對於在第一層的隱藏單元中,其只能看到卷積網路的小部分內容,也就是最後我們找到的那些最大化啟用第一層隱層單元的是一些小的圖片塊。我們可以理解為第一層的神經單元通常會尋找一些簡單的特徵,如邊緣或者顏色陰影等。

而後隨著層數的增加,隱藏層單元看到的東西就越來越複雜了:

代價函式

對於神經風格遷移,我們的目標是由內容圖片C和風格圖片S,生成最終的風格遷移圖片G。所以定義代價函式為:

J ( G ) = α J c o n t e n t ( C , G ) + β J s t y l e ( S , G ) J(G) = \alpha J_{content}(C,G) + \beta J_{style}(S,G)

  • J c o n t e n t ( C , G ) J_{content}(C, G) : 代表生成圖片G的內容和內容圖片C的內容的相似度
  • J s t y l e ( S , G ) J_{style}(S, G) : 代表生成圖片G的內容和風格圖片S的內容的相似度
  • α , β \alpha, \beta : 兩個超引數用來表示以上兩者之間的權重

首先隨機初始化G的畫素,然後進行梯度下降:

內容代價函式

  • 首先假設我們使用第 l l 層隱藏層來計算 J c o n t e n t ( C , G ) J_{content}(C, G) 注意這裡的 l l 一般取在中間層,而不是最前面的層,或者最後層。因為太淺了啥也看不到,太深了就太像原圖了。
  • 使用一個預訓練的卷積網路。(如,VGG或其他)
  • a [ l ] ( C ) a^{[l] (C)} a [ l ] ( G ) a^{[l] (G)} 分別代表內容圖片C和生成圖片G的 l l 層的啟用值;
  • 內容損失函式 J c o n t e n t = 1 2 a [ l ] ( C ) a [ l ] ( G ) 2 J_{content} = \frac{1}{2}||a^{[l] (C)} - a^{[l] (G)}||^2

風格代價函式

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

那如何計算這個相關性呢?

假設我們在第 l l