App下載

Python簡(jiǎn)單實(shí)現(xiàn)圖像風(fēng)格遷移

猿友 2018-08-07 17:41:35 瀏覽數(shù) (8574)
反饋

本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄

下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解

導(dǎo)語(yǔ)

T_T之前似乎發(fā)過(guò)類似的文章,那時(shí)候是用Keras實(shí)現(xiàn)的,現(xiàn)在用的PyTorch,而且那時(shí)候發(fā)的內(nèi)容感覺(jué)有些水,于是我決定。。。

好吧我確實(shí)只是為了寫點(diǎn)PyTorch練手然后順便過(guò)來(lái)水一篇美文~~~

利用Python實(shí)現(xiàn)圖像風(fēng)格的遷移?。?!

不喜歡過(guò)程同學(xué)的依舊可以直接下拉到最后看結(jié)果~

Let's Go!


參考資料

鏈接:

http://pytorch.org/tutorials/advanced/neural_style_tutorial.html#

是的,這又是來(lái)自于PyTorch官網(wǎng)的一個(gè)教程。

在相關(guān)文件中我依舊提供了我翻譯好的版本~~~

以及涉及到的論文~~~


相關(guān)文件

網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1eDOTzd0uzNzzQDRbpDEd2A

密碼: tv5i


開(kāi)發(fā)工具

Python版本:3.6.4

相關(guān)模塊:

torch模塊;

PIL模塊;

matplotlib模塊;

torchvision模塊;

以及一些Python自帶的模塊。

torch版本:

0.3.0


環(huán)境搭建

安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。

補(bǔ)充說(shuō)明:

PyTorch暫時(shí)不支持直接pip安裝。

有兩個(gè)選擇:

(1)安裝anaconda3后在anaconda3的環(huán)境下安裝(直接pip安裝即可);

(2)使用編譯好的whl文件安裝,下載鏈接為:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch

額外說(shuō)明

T_T相關(guān)文件中提供了所需的預(yù)訓(xùn)練模型,若嫌棄官網(wǎng)的下載速度,可以下載我的。

下載之后放到類似下圖路徑的文件夾中:


原理簡(jiǎn)介

作為一個(gè)純正的非藝術(shù)生,抱歉我真的沒(méi)法解釋什么叫圖像的藝術(shù)風(fēng)格。反正齊白石和梵高的畫肯定不是一個(gè)style的就是了。

那么我來(lái)嘗試解釋一下風(fēng)格遷移吧:

風(fēng)格遷移的實(shí)質(zhì)是保留原畫內(nèi)容的基礎(chǔ)上,用另外一種style來(lái)呈現(xiàn)原畫。

那么如何量化呢?

簡(jiǎn)單而言大概是這樣的:

利用CNN逐層提取圖像的特征(層越靠后提取出的特征越高級(jí)和穩(wěn)定,即更能表現(xiàn)圖片的高級(jí)語(yǔ)義信息),并且將某一層或某幾層輸出的Gram矩陣作為損失函數(shù),來(lái)衡量?jī)煞鶊D像之間的內(nèi)容/風(fēng)格差異(T_T就是兩幅圖像分別經(jīng)過(guò)相同的卷積神經(jīng)網(wǎng)絡(luò),比較某一層或者某幾層輸出的Gram矩陣的差異)。

Gram矩陣是啥???

具體而言,其計(jì)算方式為:

我們都知道,一張圖片在某個(gè)卷積層的輸出特征為一個(gè)形如(batch_size, channels, width, height)的四階張量,顯然batch_size為1。

我們將類似下圖的特征:

轉(zhuǎn)換為(batch_size*channels, width*height)大小的矩陣,這個(gè)矩陣和它的轉(zhuǎn)置相乘就可以得到一個(gè)大小為(batch_size*channels, batch_size*channels)的矩陣,這個(gè)矩陣即為Gram矩陣。

其實(shí)這就算是定義了圖像風(fēng)格和圖像內(nèi)容這兩個(gè)概念了,接下來(lái)我們就可以實(shí)現(xiàn)風(fēng)格遷移了。

其流程大概是這樣的:

具體的實(shí)現(xiàn)細(xì)節(jié)詳見(jiàn)源代碼吧~~~

相關(guān)文件中也有官網(wǎng)教程的個(gè)人翻譯版以及相關(guān)的論文供感興趣者參考。

使用方式

修改下圖所示處的圖片路徑為自己的圖片路徑:

在cmd窗口運(yùn)行Neural_Transfer.py文件即可。

由于資源和時(shí)間有限,下面展示的結(jié)果我都只跑了幾百輪左右,圖像大小為256*256。

梵高筆下的皮卡丘

原圖像:

生成的圖像:

梵高筆下的老北京

原圖像:

生成的圖像:

畢加索筆下的愛(ài)因斯坦

原圖像:

生成的圖像:

齊白石筆下的西湖

原圖像:

生成的圖像:


更多

利用其他庫(kù)實(shí)現(xiàn)的圖像風(fēng)格遷移:

1.基于python深度學(xué)習(xí)庫(kù)DeepPy的實(shí)現(xiàn):

https://github.com/andersbll/neural_artistic_style

2.基于python深度學(xué)習(xí)庫(kù)Caffe的實(shí)現(xiàn):

https://github.com/fzliu/style-transfer

3.基于python深度學(xué)習(xí)庫(kù)TensorFlow的實(shí)現(xiàn):

https://github.com/log0/neural-style-painting

感興趣的朋友自己去實(shí)現(xiàn)一下吧~~~

0 人點(diǎn)贊