天天看點

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

1 What Is Face Recognition

首先簡單介紹一下人臉驗證(face verification)和人臉識别(face recognition)的差別。

  • 人臉驗證:輸入一張人臉圖檔,驗證輸出與模闆是否為同一人,即一對一問題。
  • 人臉識别:輸入一張人臉圖檔,驗證輸出是否為K個模闆中的某一個,即一對多問題。

一般地,人臉識别比人臉驗證更難一些。因為假設人臉驗證系統的錯誤率是1%,那麼在人臉識别中,輸出分别與K個模闆都進行比較,則相應的錯誤率就會增加,約K%。模闆個數越多,錯誤率越大一些。

2 One Shot Learning

One-shot learning就是說資料庫中每個人的訓練樣本隻包含一張照片,然後訓練一個CNN模型來進行人臉識别。若資料庫有K個人,則CNN模型輸出softmax層就是K維的。

但是One-shot learning的性能并不好,其包含了兩個缺點:

  • 每個人隻有一張圖檔,訓練樣本少,建構的CNN網絡不夠健壯。
  • 若資料庫增加另一個人,輸出層softmax的次元就要發生變化,相當于要重新建構CNN網絡,使模型計算量大大增加,不夠靈活。

為了解決One-shot learning的問題,我們先來介紹相似函數(similarity function)。相似函數表示兩張圖檔的相似程度,用d(img1,img2)來表示。若d(img1,img2)較小,則表示兩張圖檔相似;若d(img1,img2)較大,則表示兩張圖檔不是同一個人。相似函數可以在人臉驗證中使用:

  • d(img1,img2)≤τ : 一樣
  • d(img1,img2)>τ : 不一樣

對于人臉識别問題,則隻需計算測試圖檔與資料庫中K個目标的相似函數,取其中d(img1,img2)最小的目标為比對對象。若所有的d(img1,img2)都很大,則表示資料庫沒有這個人。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

3 Siamese Network

若一張圖檔經過一般的CNN網絡(包括CONV層、POOL層、FC層),最終得到全連接配接層FC,該FC層可以看成是原始圖檔的編碼encoding,表征了原始圖檔的關鍵特征。這個網絡結構我們稱之為Siamese network。也就是說每張圖檔經過Siamese network後,由FC層每個神經元來表征。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

4 Triplet Loss

建構人臉識别的CNN模型,需要定義合适的損失函數,這裡我們将引入Triplet Loss。

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

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

我們希望上一小節建構的CNN網絡輸出編碼f(A)接近f(D),即||f(A)−f(D)||^2盡可能小,而||f(A)−f(N)||^2盡可能大,數學上滿足:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

根據上面的不等式,如果所有的圖檔都是零向量,即f(A)=0,f(P)=0,f(N)=0,那麼上述不等式也滿足。但是這對我們進行人臉識别沒有任何作用,是不希望看到的。我們希望得到||f(A)−f(P)||^2遠小于||f(A)−F(N)||^2。是以,我們添加一個超參數α,且α>0,對上述不等式做出如下修改:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

順便提一下,這裡的αα也被稱為邊界margin,類似與支援向量機中的margin。舉個例子,若d(A,P)=0.5,α=0.2,則d(A,N)≥0.7。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

關于訓練樣本,必須保證同一人包含多張照片,否則無法使用這種方法。例如10k張照片包含1k個不同的人臉,則平均一個人包含10張照片。這個訓練樣本是滿足要求的。

然後,就可以使用梯度下降算法,不斷訓練優化CNN網絡參數,讓J不斷減小接近0。

同一組訓練樣本,A,P,N的選擇盡可能不要使用随機選取方法。因為随機選擇的A與P一般比較接近,A與N相差也較大,畢竟是兩個不同人臉。這樣的話,也許模型不需要經過複雜訓練就能實作這種明顯識别,但是抓不住關鍵差別。是以,最好的做法是人為選擇A與P相差較大(例如換發型,留胡須等),A與N相差較小(例如發型一緻,膚色一緻等)。這種人為地增加難度和混淆度會讓模型本身去尋找學習不同人臉之間關鍵的差異,“盡力”讓d(A,P)d(A,P)更小,讓d(A,N)d(A,N)更大,即讓模型性能更好。

下面給出一些A,P,N的例子:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

值得一提的是,現在許多商業公司建構的大型人臉識别模型都需要百萬級别甚至上億的訓練樣本。如此之大的訓練樣本我們一般很難擷取。但是一些公司将他們訓練的人臉識别模型釋出在了網上,可供我們使用。

5 Face Verification and Binary Classification

除了構造triplet loss來解決人臉識别問題之外,還可以使用二分類結構。做法是将兩個siamese網絡組合在一起,将各自的編碼層輸出經過一個邏輯輸出單元,該神經元使用sigmoid函數,輸出1則表示識别為同一人,輸出0則表示識别為不同人。結構如下:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

6 What Is Neural Style Transfer

神經風格遷移是CNN模型一個非常有趣的應用。它可以實作将一張圖檔的風格“遷移”到另外一張圖檔中,生成具有其特色的圖檔。比如我們可以将畢加索的繪畫風格遷移到我們自己做的圖中,生成類似的“大師作品”,很酷不是嗎?

下面列出幾個神經風格遷移的例子:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

一般用C表示内容圖檔,S表示風格圖檔,G表示生成的圖檔。

7 What Are Deep ConvNets Learning

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

典型的CNN網絡如下所示:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

首先來看第一層隐藏層,周遊所有訓練樣本,找出讓該層激活函數輸出最大的9塊圖像區域;然後再找出該層的其它單元(不同的濾波器通道)激活函數輸出最大的9塊圖像區域;最後共找9次,得到9 x 9的圖像如下所示,其中每個3 x 3區域表示一個運算單元。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

可以看出,第一層隐藏層一般檢測的是原始圖像的邊緣和顔色陰影等簡單資訊。

繼續看CNN的更深隐藏層,随着層數的增加,捕捉的區域更大,特征更加複雜,從邊緣到紋理再到具體物體。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

8 Cost Function

神經風格遷移生成圖檔G的cost function由兩部分組成:C與G的相似程度和S與G的相似程度。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

神經風格遷移的基本算法流程是:首先令G為随機像素點,然後使用梯度下降算法,不斷修正G的所有像素點,使得J(G)不斷減小,進而使G逐漸有C的内容和G的風格,如下圖所示。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

9 Content Cost Function

我們先來看J(G)的第一部分Jcontent(C,G),它表示内容圖檔C與生成圖檔G之間的相似度。

使用的CNN網絡是之前訓練好的模型,例如Alex-Net。C,S,G共用相同模型和參數。首先,需要選擇合适的層數ll來計算Jcontent(C,G)。根據上一小節的内容,CNN的每個隐藏層分别提取原始圖檔的不同深度特征,由簡單到複雜。如果l太小,則G與C在像素上會非常接近,沒有遷移效果;如果l太深,則G上某個區域将直接會出現C中的物體。是以,ll既不能太淺也不能太深,一般選擇網絡中間層。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

10 Style Cost Function

什麼是圖檔的風格?利用CNN網絡模型,圖檔的風格可以定義成第l層隐藏層不同通道間激活函數的乘積(相關性)。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

例如我們選取第l層隐藏層,其各通道使用不同顔色标注,如下圖所示。因為每個通道提取圖檔的特征不同,比如1通道(紅色)提取的是圖檔的垂直紋理特征,2通道(黃色)提取的是圖檔的橙色背景特征。那麼計算這兩個通道的相關性大小,相關性越大,表示原始圖檔及既包含了垂直紋理也包含了該橙色背景;相關性越小,表示原始圖檔并沒有同時包含這兩個特征。也就是說,計算不同通道的相關性,反映了原始圖檔特征間的互相關系,從某種程度上刻畫了圖檔的“風格”。

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!

11 1D and 3D Generalizations

我們之前介紹的CNN網絡處理的都是2D圖檔,舉例來介紹2D卷積的規則:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
  • 輸入圖檔次元:14 x 14 x 3
  • 濾波器尺寸:5 x 5 x 3,濾波器個數:16
  • 輸出圖檔次元:10 x 10 x 16

将2D卷積推廣到1D卷積,舉例來介紹1D卷積的規則:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
  • 輸入時間序列次元:14 x 1
  • 濾波器尺寸:5 x 1,濾波器個數:16
  • 輸出時間序列次元:10 x 16

對于3D卷積,舉例來介紹其規則:

成為梵高、畢加索?你最喜歡的人臉識别與神經風格遷移來啦!
  • 輸入3D圖檔次元:14 x 14 x 14 x 1
  • 濾波器尺寸:5 x 5 x 5 x 1,濾波器個數:16
  • 輸出3D圖檔次元:10 x 10 x 10 x 16