本文轉(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)一下吧~~~