0
雷鋒網(wǎng)按:本文作者phunter,文章來(lái)源大數(shù)據(jù)雜談。文中只要介紹了如何使用MXnet做出具有藝術(shù)風(fēng)格的照片。
Neural art:用機(jī)器模仿梵高
Neural art是個(gè)讓機(jī)器模仿已有畫作的繪畫風(fēng)格來(lái)把一張照片重新繪畫的算法,比如給一張貓的照片和一張梵高的自畫像,我們就可以得到用梵高風(fēng)格畫出來(lái)的貓,比如這個(gè)樣子(圖二為梵高在1889年的自畫像,引用自wikipedia):
Neural art算法來(lái)自于這篇論文 “A Neural Algorithm of Artistic Style” by Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge,鏈接在http://arxiv.org/abs/1508.06576 有興趣的觀眾朋友們可以閱讀。
它的基本想法是,利用一個(gè)多層的卷積網(wǎng)絡(luò)(CNN)抽象出給定繪畫作品里一些高級(jí)的隱藏特征用來(lái)模仿繪畫風(fēng)格,并把這個(gè)繪畫風(fēng)格應(yīng)用到一個(gè)新的圖片上。這類的圖像生成模型是深度學(xué)習(xí)的一個(gè)方向,比如谷歌的Inception把一個(gè)羊的圖片和一個(gè)云的圖片生成羊形狀的云之類的“迷幻類”圖像也是類似模型的一種。Facebook也有類似的生成模型,他們基于這篇http://arxiv.org/abs/1406.2661由DMLC作者@antinucleon等人合作的文章。
Neural art算法模型有多種實(shí)現(xiàn)方式,比如這里和這里是兩個(gè)Lua/Torch版的實(shí)現(xiàn),這片論文的gitxiv下面也包含了五花八門的各種實(shí)現(xiàn),他們都是實(shí)現(xiàn)論文中的VGG模型并用caffe描述,下面的示例是用MXnet來(lái)實(shí)現(xiàn)。
MXnet的neural art范例在mxnet/example/neural-style/目錄下。因?yàn)檫@個(gè)例子需要大量的計(jì)算,推薦安裝GPU版的mxnet。安裝mxnet GPU版的教程參見(jiàn)前一集 http://phunter.farbox.com/post/mxnet-tutorial1 這里就不再重復(fù)。當(dāng)然了,mxnet的CPU和GPU無(wú)縫連接,如果沒(méi)有GPU可以使用CPU版本,只是需要每張圖耐心等待約40-50分鐘。
選擇安裝:mxnet可選使用cuDNN加速。對(duì)Neural art的例子,cuDNN v3和v4均可運(yùn)行,v4在我的GTX 960上比v3稍微快約2-3秒??梢院?jiǎn)單的執(zhí)行這幾步:
如果之前沒(méi)有編譯安裝cuDNN版的mxnet,請(qǐng)?jiān)趍ake/config.mk里把USE_CUDNN = 0修改為1重新編譯,并更新安裝對(duì)應(yīng)的python包。
如果你沒(méi)有安裝mxnet GPU版本的條件,也可以訪問(wèn)以下這些網(wǎng)站或app玩一下Neural art。這個(gè)算法需要大量的GPU計(jì)算,以下這些免費(fèi)或收費(fèi)的實(shí)現(xiàn)都需要排隊(duì)。
Deepart:網(wǎng)址 https://deepart.io/ 用戶可以免費(fèi)提交,平均等待時(shí)間為1周左右,如果想插隊(duì)到24小時(shí)之內(nèi),可以捐款給網(wǎng)站。
Pikazo App:網(wǎng)址 http://www.pikazoapp.com/ 它相當(dāng)于把deepart這個(gè)網(wǎng)站做成app,需要收費(fèi)$2.99,也需要排隊(duì)。
AI Painter: 網(wǎng)址 https://www.instapainting.com/ai-painter 這是instapainting的一個(gè)業(yè)務(wù),免費(fèi),也是需要排隊(duì)。
觀眾朋友們?nèi)绻糜幸粋€(gè)裝了GPU版mxnet的機(jī)器的話,那我們就開(kāi)始用mxnet自己動(dòng)手豐衣足食,還可以幫朋友們生成有藝術(shù)感的微博頭像喲。以下例子中我用我妹 @dudulee的浪里格朗 家的美貓“破狗”的照片為例講解具體生成藝術(shù)圖的步驟。
mxnet使用的是論文中描述的VGG模型,在第一次使用的時(shí)候需要執(zhí)行download.sh下載該模型,mxnet的模型版本占約幾十MB的空間。下載模型完畢之后,可以把需要繪畫的原始圖片和模仿的圖片放到input目錄里,比如說(shuō)破狗的照片和梵高的圖像,然后執(zhí)行:
耐心等待1-2分鐘,就可以看到結(jié)果保存在output目錄里,比如是這樣的:
如果給另外一張現(xiàn)代藝術(shù)油畫 'Blue Horse' Modern Equine Art Contemporary Horse Daily Oil Painting by Texas Artist Laurie Pace (鏈接https://www.pinterest.com/pin/407223991276827181/) 替代梵高的畫作讓機(jī)器學(xué)習(xí)風(fēng)格,破狗可以畫成這樣的:
run.py里有一些可以調(diào)整的參數(shù),如果想調(diào)試輸出效果可以按照如下解釋調(diào)整:
--model 指定模型。例子里暫時(shí)只有vgg這一個(gè)模型,以后可能添加前面提到的inception等其他模型。暫時(shí)先不用改。
--content-image 內(nèi)容圖片,比如上面的“破狗”的照片
--style-image 輸入的繪畫原作的路徑,比如上面的的“梵高自畫像”。
--stop-eps 模型里用eps值代表兩幅圖的風(fēng)格相似度,在訓(xùn)練的過(guò)程里會(huì)看到這個(gè)值逐漸收斂,值越小相似度越高。stop-eps參數(shù)指定的是收斂的終止值,一般越小就代表畫的越像,但如果太小了會(huì)需要很多的計(jì)算時(shí)間來(lái)收斂,默認(rèn)0.005已經(jīng)可以得到不錯(cuò)的效果,可適當(dāng)減小到0.004等。
--content-weight --style-weight 內(nèi)容圖片和繪畫原作的相對(duì)權(quán)值,默認(rèn)是10:1,如果發(fā)現(xiàn)繪畫風(fēng)格過(guò)于強(qiáng)烈涂抹一片,可適當(dāng)修改為20:1或者30:1,反之改小。
--max-num-epochs 最大收斂步數(shù),默認(rèn)是1000步。不過(guò)一般畫作在200步左右就能找到差不多合適的eps風(fēng)格相似值,這個(gè)最大收斂步數(shù)不需要修改。
--max-long-edge 長(zhǎng)邊最大邊長(zhǎng)。程序會(huì)自動(dòng)把輸入圖片按照這個(gè)值等比例縮放,比如上面的圖就是縮放到高度為512像素。程序運(yùn)行時(shí)間及內(nèi)存消耗約和圖片面積成正比,因?yàn)榫矸e網(wǎng)絡(luò)的計(jì)算量每個(gè)像素相關(guān),700像素的圖片差不多比500像素的圖片多一倍內(nèi)存和運(yùn)行時(shí)間。在接下來(lái)的對(duì)比測(cè)試?yán)锩婵梢钥吹剑?12像素的圖差不多需要1.4GB顯存,適合2G顯存的顯卡比如nvidia顯卡的macbook pro等娛樂(lè)一下就足夠了,4GB的顯卡差不多最高可以處理到850-900像素的圖片,要想上1080p就得有Titan X的12GB了。同樣的,計(jì)算時(shí)間也會(huì)相應(yīng)拉長(zhǎng),它也和顯卡的CUDA核心數(shù)約成反比。現(xiàn)在你基本上明白了為什么上面提到的免費(fèi)版都需要排隊(duì)幾個(gè)小時(shí)到幾周不等了。
--lr logistic regression的梯度下降(SGD)學(xué)習(xí)率,用來(lái)尋找既在內(nèi)容上滿足“像破狗”又在風(fēng)格上“像梵高”的生成圖像。較大的eta收斂較快,節(jié)省計(jì)算時(shí)間但會(huì)在最小值附近跳躍。默認(rèn)值0.1,可以調(diào)整到0.2和0.3都可以。
--gpu 使用第幾個(gè)GPU,默認(rèn)是0號(hào)GPU,適合只有一塊顯卡的用戶(比如我家里的機(jī)器)。如果沒(méi)有GPU并能忍耐40分鐘左右算一張圖,--gpu -1也可以指定為純CPU計(jì)算。
--output 輸出文件名。
--save-epochs 是否保存中間結(jié)果,默認(rèn)每50步保存一下結(jié)果。
-remove-noise 降噪?yún)?shù),默認(rèn)0.2,可以降低一些為0.15,這就是高斯降噪的半徑。程序在學(xué)習(xí)模仿畫作的過(guò)程里會(huì)使用兩個(gè)白噪聲圖片逼近風(fēng)格圖和內(nèi)容圖,在最終生成的圖片里面可能殘留一些不必要的噪聲點(diǎn),程序里面可以降噪處理。
這個(gè)問(wèn)題的答案在原論文里也語(yǔ)焉不詳,作者也沒(méi)有想解釋清楚。以下的討論均按我個(gè)人根據(jù)原文以及reddit和知乎上的相關(guān)討論在這里概述一下,更多討論詳情請(qǐng)參閱:reddit 知乎 這里一并感謝上述鏈接里的作者和評(píng)論者。
“繪畫風(fēng)格”是一個(gè)抽象定型的詞語(yǔ),它可能和圖像的某種高階統(tǒng)計(jì)量相關(guān),但不同的繪畫風(fēng)格有不同的表示,對(duì)于一個(gè)沒(méi)有具體定義風(fēng)格的一般性問(wèn)題,它很難用人工設(shè)計(jì)算法去完成。幸運(yùn)的是,我們知道卷積網(wǎng)絡(luò)CNN可以通過(guò)多層卷積提取物體的抽象特征完成物體識(shí)別(請(qǐng)參考Yann Lecun的深度學(xué)習(xí)教程),這一點(diǎn)“提取抽象特性”的能力被作者借用來(lái)描述“風(fēng)格”。也就是說(shuō),經(jīng)過(guò)多層CNN抽象之后的圖片丟棄了像素級(jí)的特征,而保留了高級(jí)的繪畫風(fēng)格。下圖引用自原論文圖1。在文章里,作者定義了一個(gè)5層的CNN網(wǎng)絡(luò),梵高的星空在通過(guò)第一二三層的時(shí)候保留了一些原圖的細(xì)節(jié),但是在第四第五層的時(shí)候,就變成了“看起來(lái)是梵高星空的樣子”這樣的抽象特征:
這時(shí)候作者機(jī)智的想到了,如果把一張梵高一張其他照片同時(shí)都放到這個(gè)CNN網(wǎng)絡(luò)里,經(jīng)過(guò)合適的調(diào)整讓第二張照片在第四五層接近梵高,而第一二三層保持和原來(lái)差不多,那就可以模仿梵高了!細(xì)節(jié)上,作者為了沿用了CNN的特征抽象能力使用了CNN作物體識(shí)別的VGG模型。
于是讓機(jī)器模仿繪畫風(fēng)格并生成圖片成了一個(gè)優(yōu)化問(wèn)題:生成的圖像要像原內(nèi)容圖,比如我給一張貓的圖片最終還是要像貓;生成的圖像要像是由風(fēng)格圖畫的,比如我給了個(gè)梵高的圖,我生成的貓的圖片要看起來(lái)有梵高的風(fēng)格。也就是說(shuō)要找到這樣一個(gè)中間結(jié)果,它的內(nèi)容表示(第一二三層CNN)接近于破狗,它的風(fēng)格的表示(第四第五層CNN)接近于梵高。在文章里,作者用一個(gè)白噪聲圖片通過(guò)梯度下降生成一個(gè)接近內(nèi)容圖的圖片,以及另一個(gè)白噪聲圖片生成一個(gè)接近繪畫圖風(fēng)格的圖片,并定義了神奇的描述紋理的gram matrix定義了這兩個(gè)圖的損失函數(shù)并加權(quán)平均當(dāng)作優(yōu)化目標(biāo)函數(shù),在mxnet的實(shí)現(xiàn)里通過(guò)梯度下降(SGD)完成收斂找到這樣一個(gè)內(nèi)容和風(fēng)格都搭配中間結(jié)果。舉例來(lái)說(shuō),“破狗”和“梵高自畫像”的生成過(guò)程的200多步的循環(huán)里,圖像的變化依次如下圖所示:
我們可以看到,在剛開(kāi)始的幾十步里,圖片更像是原圖和繪畫的簡(jiǎn)單紋理的疊加,而隨著循環(huán)步數(shù)增加,程序慢慢學(xué)習(xí)到了配色和筆觸的風(fēng)格,在150步左右基本成型,最終把破狗的照片繪畫成梵高的風(fēng)格。
事實(shí)上不是的,很多計(jì)算圖形學(xué)的論文已經(jīng)針對(duì)各種方向做出了一些成果,只是這篇文章利用了深度學(xué)習(xí)和CNN的方法,其他類似學(xué)習(xí)風(fēng)格的論文可以參考相關(guān)閱讀:
"A Parametric Texture Model Based on Joint Statistics of Complex Wavelet Coefficient" http://www.cns.nyu.edu/pub/lcv/portilla99-reprint.pdf這片文章用小波變換的方式提取了圖片紋理“風(fēng)格”所對(duì)應(yīng)的二階統(tǒng)計(jì)量,和本文提到的論文想法是一致的。
“Style Transfer for Headshot Portraits”
https://people.csail.mit.edu/yichangshih/portrait_web/ 這篇文章針對(duì)頭像照片的風(fēng)格做到了很快的風(fēng)格學(xué)習(xí),并且可以實(shí)時(shí)轉(zhuǎn)換視頻,對(duì)于這個(gè)有嚴(yán)格限制的問(wèn)題,它的速度比Neural art高到不知道哪里去了。
作為深度學(xué)習(xí)和CNN的例子,Neural art確實(shí)很好玩,觀眾朋友們可以自己用MXnet給自己和朋友們生成有意思的藝術(shù)圖片,記得發(fā)到微博上加#mxnet#話題分享。值得提醒的是,如果原圖是半身人像類,建議也使用一些人像的畫作來(lái)學(xué)習(xí)風(fēng)格,比如“破狗”+“梵高”的組合;相對(duì)應(yīng)的,風(fēng)景圖片最好用風(fēng)景畫作風(fēng)格學(xué)習(xí)。因?yàn)轱L(fēng)景的表現(xiàn)重點(diǎn)和人像不同,強(qiáng)行把風(fēng)格畫到人像的照片上并不適合,它會(huì)看起來(lái)像是兩幅圖簡(jiǎn)單疊加,這個(gè)即使是人類畫家也不好畫在一起。
雷鋒網(wǎng)注:本文轉(zhuǎn)自大數(shù)據(jù)雜談,如需轉(zhuǎn)載請(qǐng)聯(lián)系原作者。
更多:AI修圖藝術(shù):Prisma背后的奇妙算法 | 深度
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。