成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!
AI有道
不可錯過的AI技術公眾號
關注
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。
接下來,我們根據A,P,N三張圖片,就可以定義Loss function為:
相應地,對于m組訓練樣本,cost function為:
關于訓練樣本,必須保證同一人包含多張照片,否則無法使用這種方法。例如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則表示識別為不同人。結構如下:
每組訓練樣本包含兩張圖片,每個siamese網絡結構和參數完全相同。這樣就把人臉識別問題轉化成了一個二分類問題。引入邏輯輸出層參數w和b,輸出y^表達式為:
其中參數wk和b都是通過梯度下降算法迭代訓練得到。
y^的另外一種表達式為:
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通道(黃色)提取的是圖片的橙色背景特征。那么計算這兩個通道的相關性大小,相關性越大,表示原始圖片及既包含了垂直紋理也包含了該橙色背景;相關性越小,表示原始圖片并沒有同時包含這兩個特征。也就是說,計算不同通道的相關性,反映了原始圖片特征間的相互關系,從某種程度上刻畫了圖片的“風格”。
接下來我們就可以定義圖片的風格矩陣(style matrix)為:
值得一提的是,以上我們只比較計算了一層隱藏層l。為了提取的“風格”更多,也可以使用多層隱藏層,然后相加,表達式為:
根據以上兩小節的推導,最終的cost function為:
使用梯度下降算法進行迭代優化。
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
薦號
「邏輯熊貓」
該公眾號領域包括了「面向 Python 基礎,進階和有趣應用」的一站式技術分享,挖掘學習者在學習當中遇到的各類問題并分享經驗,關注實用技能和有趣新聞,感興趣的推薦關注。
號主是一個愛讀書的碼農,致力于打造一個有用、良心、走心的公眾號,是我見過最務實、最認真的公眾號作者之一,。
喜歡就請贊賞或轉發分享一下吧
往 期 推 薦
【1】吳恩達《卷積神經網絡》精煉筆記(1)-- 卷積神經網絡基礎
【2】吳恩達《卷積神經網絡》精煉筆記(2)-- 深度卷積模型:案例研究
【3】吳恩達《卷積神經網絡》精煉筆記(3)-- 目標檢測
【4】干貨 | 神經網絡與深度學習精選文章匯總
【5】深入淺出機器學習技法(一):線性支持向量機(LSVM)
【6】干貨 | 機器學習基石精選文章鏈接
【7】機器學習中的維度災難
長按二維碼掃描關注
AI有道
ID:redstonewill
紅色石頭
個人微信 : WillowRedstone
新浪微博:@RedstoneWill
總結
以上是生活随笔為你收集整理的成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习Enroll例程
- 下一篇: 传闻中“日进斗金”的程序员,你真的了解吗