吳恩達深度學習——人臉識別與神經風格轉換

引言

本文是吳恩達深度學習第四課:卷積神經網絡。本次課程將會告訴大家如何構造卷積神經網絡並應用到圖像數據上。從中你會學到如何構建一個卷積神經網絡、如何應用卷積神經網絡到圖像識別和目標檢測上、學習如何使用神經風格轉換去生成藝術作品、能將這些算法應用到更廣泛的圖像應用上,比如2D、3D數據和視頻。

第四課有以下四個部分,本文是第一部分。

  1. 卷積神經網絡基礎
  2. 深度卷積模型:實例分析
  3. 目標檢測
  4. 特殊應用:人臉識別&神經風格轉換

什麼是人臉識別

首先要區分人臉識別與人臉驗證。
在這裏插入圖片描述
給定輸入圖片、ID或名字,人臉驗證系統做的是驗證是否是這個人。做的是1:1的匹配,這種模式最常見的應用場景便是人臉解鎖,終端設備只需將用戶事先註冊的照片與臨場採集的照片做對比,判斷是否爲同一人,即可完成身份驗證。

在這裏插入圖片描述
而人臉識別是1:K的。假設數據庫中有K個人的圖片,輸入某個人的圖片,輸出這個人是否與數據庫中的圖片匹配或沒有識別。

One-Shot學習

人臉識別所面臨的一個挑戰是需要解決一次學習問題(one-shot learning problem)。即在大多數人臉識別應用中需要通過單一圖片取識別某個人。

大多數機器學習模型在只有一個樣本進行訓練的時候都表現不好。我們來看一個例子,
在這裏插入圖片描述
假設你要做一個人臉識別門禁系統,這裏有四個員工。然後來了一個人,叫簡
在這裏插入圖片描述
那麼機器需要通過僅有的簡的一張圖片來識別出這個人就是簡,從而打開門
在這裏插入圖片描述
相反,如果來了一個人,並不是數據庫中的4個人之一,機器要知道無法識別。
在這裏插入圖片描述
所以One-shot 學習問題只能通過一個樣本來進行學習,以便能夠識別出一個人。
大多數人臉識別系統都需要解決這個問題,

這樣訓練集就很小,這種很小的訓練集不足以去訓練CNN模型。假設今天又有一個新員工加入了,那麼將有5個員工需要識別,CNN模型的輸出數也要加1,這需要修改CNN的網絡結構,並且還需要重新訓練。

所以爲了得到更合理的結果,現在要做的是學習一個相似函數,
在這裏插入圖片描述
d代表兩張圖片的不同程度。

在這裏插入圖片描述
通常可以設定一個閾值,只要小於這個值,就認爲這兩張圖片代表的是同一個人,這樣就可以應用於識別任務。
在這裏插入圖片描述
分別用數據庫中的員工去與這張圖片計算“不相似度”,越小說明越相似。通過函數d(img1,img2)解決了one-shot問題。 如果有新員工加入,只需要把新員工的照片加入數據庫,系統依然能正常工作。

現在的問題是如何得到這個函數d

Siamese網絡

實現函數d的一個方式是使用Siamese網絡

在這裏插入圖片描述
假設有一個這樣的卷積網絡,輸入圖片x(1)x^{(1)},然後通過一系列卷積、池化和全連接等操作最終得到這樣的特徵向量,我們之前學過的例子是將這個向量餵給softmax單元,得到判斷的類別。 這裏我們關注的是這個向量,假設它有128個維度,我們給這個向量一個名詞,叫做f(x(1))f(x^{(1)}),可以把它看成是輸入圖像的編碼。

建立一個人臉識別系統的方法是,如果要比較兩張圖片的話,就是分別計算這兩張圖片的編碼。
在這裏插入圖片描述
這裏計算編碼用到的是同一個網絡。
在這裏插入圖片描述
接着就可以用這兩個編碼向量之間差的範數來表示這兩張圖片的距離。

這種就叫Siamese網絡架構。那麼要如何訓練這個網絡呢。這個卷積神經網絡的參數定義了一個編碼函數f(xi)f(x^{i}),所學習參數時,如果兩個圖片中是同一個人,那麼兩個編碼的距離就要小:

在這裏插入圖片描述
改變這個網絡中不同層的參數,就可以得到不同的編碼輸出,編碼的距離也不一樣。所以可以通過反向傳播來學習參數,以滿足上面兩個條件。

那如何定義目標函數呢

Triplet損失

要想通過學習神經網絡的參數來得到一個好的編碼,方法之一就是定義三元組(Triplet)損失函數,然後通過梯度下降法來訓練。

爲了應用三元組損失函數,需要比較成對的圖像,比如下面這對圖像。
在這裏插入圖片描述
你想要它們的編碼差異小,因爲這是同一個人(吳恩達夫人)。

在這裏插入圖片描述
假如是上面這組圖片,你想要它們的編碼差異大一些,因爲是不同的人(難道是吳恩達夫人與丈母孃)。

用三元組損失的術語來說,你要做的通常是看一個anchor圖片,讓anchor圖片和positive圖片(意味着同一人)的距離很近。

而當anchor圖片和Negative(不同的人)圖片的距離很遠。這就是爲什麼叫三元組損失,因爲需要同時看三張圖片(anchor(A)、positive§和negative(N))。
在這裏插入圖片描述
通過公式表述的話,想要網絡的參數(或得到的編碼)滿足一下特徵:

在這裏插入圖片描述
爲了防止所有的輸出都爲零,我們要改變一下這個式子。

在這裏插入圖片描述
不能要這些輸出完全等於零,我們增加了一個超參數α\alpha,這樣如果ff輸出都爲零的話就不滿足了。這個α\alpha叫間隔(margin)。

下面就可以來定義損失函數了,給定3張圖片A,P,NA,P,N

在這裏插入圖片描述
這個maxmax的意思是,只要能使綠線的部分小於等於0,那麼損失就是0;反之如果綠線部分大於0,那麼損失就是大於零的這個值。

這是一個三元組定義的損失,整個網絡的代價函數應該是訓練集中的所有三元組損失之和:

在這裏插入圖片描述
爲了定義三元組的數據集,你需要成對的AAPP,所以你需要收集同一個人有多張照片的數據集。

那如何選擇樣本組成三元組呢,如果你隨機的選擇A,P,NA,P,N,要保證A,PA,P是同一個人,A,NA,N是不同的人。
在這裏插入圖片描述
如果隨機選擇的話,那麼這個約束條件很容易被滿足,因爲隨機選擇的圖片,AANNAAPP差別大的概率很大。

因此要儘可能選擇很難訓練的A,P,NA,P,N
在這裏插入圖片描述
也就是選擇的d(A,P)要很接近與d(A,N)。這樣你的算法就會努力使左邊的式子變小,右邊的式子變大。這樣這兩個式子之間就會至少有一個α\alpha間隔。

在你得到了這樣的數據集後
在這裏插入圖片描述
還需要做的是用梯度下降來最小化代價函數JJ

面部驗證與二分類

Triplet損失是學習人臉識別卷積網絡參數的好方法,這節我們介紹一下其他的方法。

我們看看如何將人臉識別當成一個二分類問題。

在這裏插入圖片描述
另一個訓練神經網絡的方法是選取一個Siamese網絡(上面其實是同一個網絡,只是表示不同輸入下的輸出),使其同時計算這些特徵向量。
然後將這些向量輸入到邏輯迴歸單元,來預測是否爲相同的人。

這樣就轉換爲一個二分類問題。可以用這種方法來替換triplet損失的方法。

那最後的邏輯單元是如何處理的,輸出的y^\hat y
在這裏插入圖片描述
這裏的下標kk表示特徵向量的維度。這裏假設有128維。這是將這兩個向量取元素差的絕對值。

在這裏插入圖片描述
和普通的邏輯迴歸一樣,還可以增加權重參數和偏置參數。

這裏有一個技巧,
在這裏插入圖片描述
假設這兩張圖片中有一張是數據庫中的圖片,我們不需要每次都重複將數據庫中的圖片餵給這個神經網得到編碼,我們只需要計算一次,保存起來即可。 即我們只需要儲存原始圖像對應的特徵向量。

這樣可以節省大量的計算,每次只要計算想要識別圖像的編碼即可。

總結一下,把人臉驗證當成一個監督學習問題,只要創建一個成對圖片的訓練集。
在這裏插入圖片描述
然後使用反向傳播算法去訓練Siamese神經網絡。

什麼是神經風格轉換

在這裏插入圖片描述
假設想用右邊的藝術圖片風格來轉換左邊的圖片,得到這樣的圖片

在這裏插入圖片描述
神經風格轉換可以完成這件事情。爲了更好的描述,這裏用CC表示內容(Content)圖像,SS表示風格(Style)圖像,GG表示生成(Generate)的圖像。

在這裏插入圖片描述
這是另一個例子。

爲了實現神經風格轉換,你需要使用卷積網絡提取特徵。

深度卷積網絡在學習什麼

深度卷積網絡到底在學什麼,本節通過一些可視化的例子來幫助大家瞭解。
這有助於理解如何實現神經風格遷移。

在這裏插入圖片描述
假設你訓練了一個網絡,你希望看到不同層之間隱藏單元的計算結果。
你可以這樣做,從第一層的某個隱藏單元開始,假設你遍歷了訓練集,發現一些圖片或圖片塊,能最大程度的激活這個單元。

注意到一個特定的單元只能看到圖片中的一小部分,因此下面只畫出了一小塊:
在這裏插入圖片描述
如果你選擇了一個隱藏單元,要找出哪9個輸入圖像塊最大程度的激活了這個單元。你可能找到了上面這樣的9個圖像塊。

可以看到這個單元是在進行邊緣檢測,尋找上圖這9種邊緣。

然後可以選擇零一個隱藏單元,重複進行上面的步驟。
在這裏插入圖片描述
把第二個隱藏單元關心的圖像塊加到右邊,它尋找的邊緣線條看起來和第一個的傾斜程度是不同的。

以此類推,假設最終得到了9個不同的神經元的結果:
在這裏插入圖片描述

現在我們得到了第一層網絡中某些隱藏單元的結果,那如何對剩下的所有深層的某些單元做這樣的操作會得到什麼呢。
在這裏插入圖片描述

在更深的層中隱藏單元將看到更大一部分圖像,

在這裏插入圖片描述
這是第一層和第二層中某9個單元得到的結果,
在這裏插入圖片描述
左上角這9個格子裏面是讓一個隱藏單元高度激活的九個圖塊,上面這個圖片展示了第2層的9個隱藏單元激活的圖塊。

對於更深層可以重複這個過程
在這裏插入圖片描述
我們分別放大這些圖片,下面是第二層:
在這裏插入圖片描述
看起來第2層在檢測更加複雜的形狀和模式,有尋找垂直紋理的,有尋找圓形的,還有尋找非常細的直線的。

那第3層呢
在這裏插入圖片描述
第三層就更加複雜,有的單元對汽車輪子比較感興趣,有的對人物上半身比較感興趣。

那下一層呢
在這裏插入圖片描述
第4層看起來比第3層還要複雜,左上角的9個格子好像說的是這個單元已經實現了一個狗檢測器了。

我們經歷了很長的過程從檢測相對簡單的東西到複雜的物體,比如從第1層的邊到第2層的紋理,再到更深層中檢測的非常複雜的物體。

神經風格轉換代價函數

要構建一個神經風格轉換系統,需要定義一個生成圖像的代價函數,來判斷生成圖像的好壞。

在這裏插入圖片描述
那麼怎麼判斷生成圖像的好壞呢,我們把這個函數定義爲兩部分。第一部分稱爲內容代價,用來度量生成的圖片和內容圖片CC有多相似。第二部分是風格代價函數,用來度量圖片GG的風格和圖片SS有多相似。 最後用兩個超參數來確定兩部分之間的權重。

爲了生成一個新圖像,接下來要做的是,
在這裏插入圖片描述
隨機初始化生成圖像GG

在這裏插入圖片描述
使用梯度下降法來最小化J(G)J(G) ,這一步實際上更新的是圖像的像素值。
舉個例子,這裏是想要轉換的圖片和藝術圖片。
在這裏插入圖片描述
假設第一步隨機生成的是這種像素點:
在這裏插入圖片描述
接下來運行梯度下降法最小化代價函數JJ,逐步處理相似度,慢慢得到下面這樣一個圖片:
在這裏插入圖片描述
最後用越來越像的風格畫出下面的圖片
在這裏插入圖片描述
下面我們來看下如何定義內容代價函數。

內容代價函數

在這裏插入圖片描述
我們整個代價函數是這樣的,我們來看下內容代價函數是如何定義的。

假設你用隱藏層ll來計算內容代價,如果ll很小,比如用隱藏層11,這樣這個代價函數就會使你的生成圖片,像素上非常接近於你的內容圖片;如果用很深的層,如我們之前看到的,可能會變成判斷內容圖片中是否含有狗。這樣它就會生成一個狗的圖片。

在實際中,我們不會選的太深,也不會選的太淺,通常會選網絡的中間層。

假設使用的是一個預訓練的卷積模型。

現在你需要衡量一個內容圖片和一個生成圖片它們在內容上的相似度。

a[l](C)a^{[l](C)}a[l](G)a^{[l](G)}分別表示這兩個圖像ll層的激活值。

如果這兩個激活值很接近,那麼就認爲這兩張圖像在內容上也很接近。
所以可以這樣定義內容損失函數:
在這裏插入圖片描述
這是按元素將這兩個激活值的差異平方進行求和。

所以之後你對J(G)J(G)使用梯度下降法來求GG,這樣使這個算法找到一個圖像GG使得這些隱藏層的激活值和你的內容圖像比較接近。

下面我們來看看風格代價函數的定義。

風格代價函數

圖片的風格是什麼意思呢
在這裏插入圖片描述
假設你使用第ll層的激活值來衡量風格。
我們要做的是將風格定義爲層中不同激活通道之間的相關係數,假設選擇了激活層ll,它的激活矩陣是這樣的。
在這裏插入圖片描述
我們想知道的是不同的激活通道間的相關性有多大,在這個激活矩陣上,我們用不同的顏色來表示不同的通道。

在這裏插入圖片描述

假設我們有5個通道,我們先看下前兩個通道,即紅色和黃色通道,看這兩個激活通道的相關性多大,

在這裏插入圖片描述
具體的做法是遍歷這兩個通道對應位置的激活值,組成一些成對的數。然後看當你遍歷所有這些位置,這些成對的數之間的相關性有多大。那爲什麼這能表示風格呢

在這裏插入圖片描述
假設紅色通道對應於上圖紅線框出的9個圖像塊,而黃色通道對應於黃線框出的9個圖像塊。

相關係數描述的是當圖片某處出現紅線框出的這種垂直紋理時,改處同時又是橙色的可能性。

如果我們在通道之間使用相關係數來描述通道的風格,你能做的就是測量你的生成圖像中,第一個通道是否與第二個通道有關,
在這裏插入圖片描述
通過測量,你能知道在生成的圖像中,垂直紋理和橙色同時或不同時出現的頻率。這樣就能測量生成圖像的風格和輸入的風格圖像的相似程度。

對於也就是風格圖像和生成圖像,你需要計算一個風格矩陣,就是用ll層來測量風格。
在這裏插入圖片描述
接着我們定義風格圖像,設這個關於ll層的風格圖像GG如下

在這裏插入圖片描述
這裏的kkkk^{\prime}表示同一位置不同通道。然後再對生成圖像做同樣的定義
在這裏插入圖片描述
現在要做的就是計算出這張圖像的風格矩陣,以便能測量出剛纔所說的這些相關係數。

最後我們將SSGG的損失函數定義爲,

在這裏插入圖片描述
上圖看不清楚可以看下面這個圖片:
在這裏插入圖片描述
這就是對ll層定義的風格代價函數。
如果你對各層都使用風格代價函數,會讓結果變得更好。

從一維到三維的推廣

在這裏插入圖片描述
我們之前學過二維卷積,其實類似的思路可以應用於一維數據。

在這裏插入圖片描述
比如上圖左邊是一個心電圖,每個峯值與心跳相一致 ,比如你想要用心電圖去做醫學診斷,你會有一維的數據。如上面心電圖下方的數字所示,這是一個按照時間順序顯示每次電壓的序列。

這種情況下需要與5維的過濾器進行卷積,而不是5×55 \times 5的過濾器。

在一維過濾器中,需要用到你的5維過濾器,應用到這維信號的每個不同位置。

在這裏插入圖片描述
那3維數據是怎樣的呢,假設接受CT掃描,它可以得到你身體的三維模型的X光掃描。

在這裏插入圖片描述
可以得到人體軀幹的不同切面
在這裏插入圖片描述
所以3維數據通常除了高度和寬度外還有一個深度:
在這裏插入圖片描述

在這裏插入圖片描述
注意3維圖像中還是會有一個通道數的,這裏假設是黑白圖片,所以通道數爲1。

另一個可以作爲3維數據的例子是視頻數據,不同的幀在視頻中是按時間順序排列的。你可以用來檢測視頻中人的運動。

參考

  1. 吳恩達深度學習 專項課程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章