成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!
AI有道
不可錯過的AI技術(shù)公眾號
關(guān)注
1
What Is Face Recognition
首先簡單介紹一下人臉驗(yàn)證(face verification)和人臉識別(face recognition)的區(qū)別。
人臉驗(yàn)證:輸入一張人臉圖片,驗(yàn)證輸出與模板是否為同一人,即一對一問題。
人臉識別:輸入一張人臉圖片,驗(yàn)證輸出是否為K個模板中的某一個,即一對多問題。
一般地,人臉識別比人臉驗(yàn)證更難一些。因?yàn)榧僭O(shè)人臉驗(yàn)證系統(tǒng)的錯誤率是1%,那么在人臉識別中,輸出分別與K個模板都進(jìn)行比較,則相應(yīng)的錯誤率就會增加,約K%。模板個數(shù)越多,錯誤率越大一些。
2
One Shot Learning
One-shot learning就是說數(shù)據(jù)庫中每個人的訓(xùn)練樣本只包含一張照片,然后訓(xùn)練一個CNN模型來進(jìn)行人臉識別。若數(shù)據(jù)庫有K個人,則CNN模型輸出softmax層就是K維的。
但是One-shot learning的性能并不好,其包含了兩個缺點(diǎn):
每個人只有一張圖片,訓(xùn)練樣本少,構(gòu)建的CNN網(wǎng)絡(luò)不夠健壯。
若數(shù)據(jù)庫增加另一個人,輸出層softmax的維度就要發(fā)生變化,相當(dāng)于要重新構(gòu)建CNN網(wǎng)絡(luò),使模型計(jì)算量大大增加,不夠靈活。
為了解決One-shot learning的問題,我們先來介紹相似函數(shù)(similarity function)。相似函數(shù)表示兩張圖片的相似程度,用d(img1,img2)來表示。若d(img1,img2)較小,則表示兩張圖片相似;若d(img1,img2)較大,則表示兩張圖片不是同一個人。相似函數(shù)可以在人臉驗(yàn)證中使用:
d(img1,img2)≤τ?: 一樣
d(img1,img2)>τ?: 不一樣
對于人臉識別問題,則只需計(jì)算測試圖片與數(shù)據(jù)庫中K個目標(biāo)的相似函數(shù),取其中d(img1,img2)最小的目標(biāo)為匹配對象。若所有的d(img1,img2)都很大,則表示數(shù)據(jù)庫沒有這個人。
3
Siamese Network
若一張圖片經(jīng)過一般的CNN網(wǎng)絡(luò)(包括CONV層、POOL層、FC層),最終得到全連接層FC,該FC層可以看成是原始圖片的編碼encoding,表征了原始圖片的關(guān)鍵特征。這個網(wǎng)絡(luò)結(jié)構(gòu)我們稱之為Siamese network。也就是說每張圖片經(jīng)過Siamese network后,由FC層每個神經(jīng)元來表征。
具體網(wǎng)絡(luò)構(gòu)建和訓(xùn)練參數(shù)方法我們下一節(jié)再詳細(xì)介紹。
4
Triplet Loss
構(gòu)建人臉識別的CNN模型,需要定義合適的損失函數(shù),這里我們將引入Triplet Loss。
Triplet Loss需要每個樣本包含三張圖片:靶目標(biāo)(Anchor)、正例(Positive)、反例(Negative),這就是triplet名稱的由來。顧名思義,靶目標(biāo)和正例是同一人,靶目標(biāo)和反例不是同一人。Anchor和Positive組成一類樣本,Anchor和Negative組成另外一類樣本。
我們希望上一小節(jié)構(gòu)建的CNN網(wǎng)絡(luò)輸出編碼f(A)接近f(D),即||f(A)?f(D)||^2盡可能小,而||f(A)?f(N)||^2盡可能大,數(shù)學(xué)上滿足:
根據(jù)上面的不等式,如果所有的圖片都是零向量,即f(A)=0,f(P)=0,f(N)=0,那么上述不等式也滿足。但是這對我們進(jìn)行人臉識別沒有任何作用,是不希望看到的。我們希望得到||f(A)?f(P)||^2遠(yuǎn)小于||f(A)?F(N)||^2。所以,我們添加一個超參數(shù)α,且α>0,對上述不等式做出如下修改:
順便提一下,這里的αα也被稱為邊界margin,類似與支持向量機(jī)中的margin。舉個例子,若d(A,P)=0.5,α=0.2,則d(A,N)≥0.7。
接下來,我們根據(jù)A,P,N三張圖片,就可以定義Loss function為:
相應(yīng)地,對于m組訓(xùn)練樣本,cost function為:
關(guān)于訓(xùn)練樣本,必須保證同一人包含多張照片,否則無法使用這種方法。例如10k張照片包含1k個不同的人臉,則平均一個人包含10張照片。這個訓(xùn)練樣本是滿足要求的。
然后,就可以使用梯度下降算法,不斷訓(xùn)練優(yōu)化CNN網(wǎng)絡(luò)參數(shù),讓J不斷減小接近0。
同一組訓(xùn)練樣本,A,P,N的選擇盡可能不要使用隨機(jī)選取方法。因?yàn)殡S機(jī)選擇的A與P一般比較接近,A與N相差也較大,畢竟是兩個不同人臉。這樣的話,也許模型不需要經(jīng)過復(fù)雜訓(xùn)練就能實(shí)現(xiàn)這種明顯識別,但是抓不住關(guān)鍵區(qū)別。所以,最好的做法是人為選擇A與P相差較大(例如換發(fā)型,留胡須等),A與N相差較小(例如發(fā)型一致,膚色一致等)。這種人為地增加難度和混淆度會讓模型本身去尋找學(xué)習(xí)不同人臉之間關(guān)鍵的差異,“盡力”讓d(A,P)d(A,P)更小,讓d(A,N)d(A,N)更大,即讓模型性能更好。
下面給出一些A,P,N的例子:
值得一提的是,現(xiàn)在許多商業(yè)公司構(gòu)建的大型人臉識別模型都需要百萬級別甚至上億的訓(xùn)練樣本。如此之大的訓(xùn)練樣本我們一般很難獲取。但是一些公司將他們訓(xùn)練的人臉識別模型發(fā)布在了網(wǎng)上,可供我們使用。
5
Face Verification and Binary Classification
除了構(gòu)造triplet loss來解決人臉識別問題之外,還可以使用二分類結(jié)構(gòu)。做法是將兩個siamese網(wǎng)絡(luò)組合在一起,將各自的編碼層輸出經(jīng)過一個邏輯輸出單元,該神經(jīng)元使用sigmoid函數(shù),輸出1則表示識別為同一人,輸出0則表示識別為不同人。結(jié)構(gòu)如下:
每組訓(xùn)練樣本包含兩張圖片,每個siamese網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù)完全相同。這樣就把人臉識別問題轉(zhuǎn)化成了一個二分類問題。引入邏輯輸出層參數(shù)w和b,輸出y^表達(dá)式為:
其中參數(shù)wk和b都是通過梯度下降算法迭代訓(xùn)練得到。
y^的另外一種表達(dá)式為:
6
What Is Neural Style Transfer
神經(jīng)風(fēng)格遷移是CNN模型一個非常有趣的應(yīng)用。它可以實(shí)現(xiàn)將一張圖片的風(fēng)格“遷移”到另外一張圖片中,生成具有其特色的圖片。比如我們可以將畢加索的繪畫風(fēng)格遷移到我們自己做的圖中,生成類似的“大師作品”,很酷不是嗎?
下面列出幾個神經(jīng)風(fēng)格遷移的例子:
一般用C表示內(nèi)容圖片,S表示風(fēng)格圖片,G表示生成的圖片。
7
What Are Deep ConvNets Learning
在進(jìn)行神經(jīng)風(fēng)格遷移之前,我們先來從可視化的角度看一下卷積神經(jīng)網(wǎng)絡(luò)每一層到底是什么樣子?它們各自學(xué)習(xí)了哪些東西。
典型的CNN網(wǎng)絡(luò)如下所示:
首先來看第一層隱藏層,遍歷所有訓(xùn)練樣本,找出讓該層激活函數(shù)輸出最大的9塊圖像區(qū)域;然后再找出該層的其它單元(不同的濾波器通道)激活函數(shù)輸出最大的9塊圖像區(qū)域;最后共找9次,得到9 x 9的圖像如下所示,其中每個3 x 3區(qū)域表示一個運(yùn)算單元。
可以看出,第一層隱藏層一般檢測的是原始圖像的邊緣和顏色陰影等簡單信息。
繼續(xù)看CNN的更深隱藏層,隨著層數(shù)的增加,捕捉的區(qū)域更大,特征更加復(fù)雜,從邊緣到紋理再到具體物體。
8
Cost Function
神經(jīng)風(fēng)格遷移生成圖片G的cost function由兩部分組成:C與G的相似程度和S與G的相似程度。
神經(jīng)風(fēng)格遷移的基本算法流程是:首先令G為隨機(jī)像素點(diǎn),然后使用梯度下降算法,不斷修正G的所有像素點(diǎn),使得J(G)不斷減小,從而使G逐漸有C的內(nèi)容和G的風(fēng)格,如下圖所示。
9
Content Cost Function
我們先來看J(G)的第一部分Jcontent(C,G),它表示內(nèi)容圖片C與生成圖片G之間的相似度。
使用的CNN網(wǎng)絡(luò)是之前訓(xùn)練好的模型,例如Alex-Net。C,S,G共用相同模型和參數(shù)。首先,需要選擇合適的層數(shù)ll來計(jì)算Jcontent(C,G)。根據(jù)上一小節(jié)的內(nèi)容,CNN的每個隱藏層分別提取原始圖片的不同深度特征,由簡單到復(fù)雜。如果l太小,則G與C在像素上會非常接近,沒有遷移效果;如果l太深,則G上某個區(qū)域?qū)⒅苯訒霈F(xiàn)C中的物體。因此,ll既不能太淺也不能太深,一般選擇網(wǎng)絡(luò)中間層。
10
Style Cost Function
什么是圖片的風(fēng)格?利用CNN網(wǎng)絡(luò)模型,圖片的風(fēng)格可以定義成第l層隱藏層不同通道間激活函數(shù)的乘積(相關(guān)性)。
例如我們選取第l層隱藏層,其各通道使用不同顏色標(biāo)注,如下圖所示。因?yàn)槊總€通道提取圖片的特征不同,比如1通道(紅色)提取的是圖片的垂直紋理特征,2通道(黃色)提取的是圖片的橙色背景特征。那么計(jì)算這兩個通道的相關(guān)性大小,相關(guān)性越大,表示原始圖片及既包含了垂直紋理也包含了該橙色背景;相關(guān)性越小,表示原始圖片并沒有同時包含這兩個特征。也就是說,計(jì)算不同通道的相關(guān)性,反映了原始圖片特征間的相互關(guān)系,從某種程度上刻畫了圖片的“風(fēng)格”。
接下來我們就可以定義圖片的風(fēng)格矩陣(style matrix)為:
值得一提的是,以上我們只比較計(jì)算了一層隱藏層l。為了提取的“風(fēng)格”更多,也可以使用多層隱藏層,然后相加,表達(dá)式為:
根據(jù)以上兩小節(jié)的推導(dǎo),最終的cost function為:
使用梯度下降算法進(jìn)行迭代優(yōu)化。
11
1D and 3D Generalizations
我們之前介紹的CNN網(wǎng)絡(luò)處理的都是2D圖片,舉例來介紹2D卷積的規(guī)則:
輸入圖片維度:14 x 14 x 3
濾波器尺寸:5 x 5 x 3,濾波器個數(shù):16
輸出圖片維度:10 x 10 x 16
將2D卷積推廣到1D卷積,舉例來介紹1D卷積的規(guī)則:
輸入時間序列維度:14 x 1
濾波器尺寸:5 x 1,濾波器個數(shù):16
輸出時間序列維度:10 x 16
對于3D卷積,舉例來介紹其規(guī)則:
輸入3D圖片維度:14 x 14 x 14 x 1
濾波器尺寸:5 x 5 x 5 x 1,濾波器個數(shù):16
輸出3D圖片維度:10 x 10 x 10 x 16
薦號
「邏輯熊貓」
該公眾號領(lǐng)域包括了「面向 Python 基礎(chǔ),進(jìn)階和有趣應(yīng)用」的一站式技術(shù)分享,挖掘?qū)W習(xí)者在學(xué)習(xí)當(dāng)中遇到的各類問題并分享經(jīng)驗(yàn),關(guān)注實(shí)用技能和有趣新聞,感興趣的推薦關(guān)注。
號主是一個愛讀書的碼農(nóng),致力于打造一個有用、良心、走心的公眾號,是我見過最務(wù)實(shí)、最認(rèn)真的公眾號作者之一,。
喜歡就請贊賞或轉(zhuǎn)發(fā)分享一下吧
往 期 推 薦
【1】吳恩達(dá)《卷積神經(jīng)網(wǎng)絡(luò)》精煉筆記(1)-- 卷積神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
【2】吳恩達(dá)《卷積神經(jīng)網(wǎng)絡(luò)》精煉筆記(2)-- 深度卷積模型:案例研究
【3】吳恩達(dá)《卷積神經(jīng)網(wǎng)絡(luò)》精煉筆記(3)-- 目標(biāo)檢測
【4】干貨 | 神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)精選文章匯總
【5】深入淺出機(jī)器學(xué)習(xí)技法(一):線性支持向量機(jī)(LSVM)
【6】干貨 | 機(jī)器學(xué)習(xí)基石精選文章鏈接
【7】機(jī)器學(xué)習(xí)中的維度災(zāi)難
長按二維碼掃描關(guān)注
AI有道
ID:redstonewill
紅色石頭
個人微信 : WillowRedstone
新浪微博:@RedstoneWill
總結(jié)
以上是生活随笔為你收集整理的成为梵高、毕加索?你最喜欢的人脸识别与神经风格迁移来啦!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习Enroll例程
- 下一篇: 传闻中“日进斗金”的程序员,你真的了解吗