本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個人專欄
下載W3Cschool手機App,0基礎(chǔ)隨時隨地學(xué)編程>>戳此了解
導(dǎo)語T_T之前似乎發(fā)過類似的文章,那時候是用Keras實現(xiàn)的,現(xiàn)在用的PyTorch,而且那時候發(fā)的內(nèi)容感覺有些水,于是我決定。。。
好吧我確實只是為了寫點PyTorch練手然后順便過來水一篇美文~~~
利用Python實現(xiàn)圖像風(fēng)格的遷移?。?!
不喜歡過程同學(xué)的依舊可以直接下拉到最后看結(jié)果~
Let's Go!
參考資料
鏈接:
http://pytorch.org/tutorials/advanced/neural_style_tutorial.html#
是的,這又是來自于PyTorch官網(wǎng)的一個教程。
在相關(guān)文件中我依舊提供了我翻譯好的版本~~~
以及涉及到的論文~~~
相關(guān)文件
網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1eDOTzd0uzNzzQDRbpDEd2A
密碼: tv5i
開發(fā)工具
Python版本:3.6.4
相關(guān)模塊:
torch模塊;
PIL模塊;
matplotlib模塊;
torchvision模塊;
以及一些Python自帶的模塊。
torch版本:
0.3.0
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
補充說明:
PyTorch暫時不支持直接pip安裝。
有兩個選擇:
(1)安裝anaconda3后在anaconda3的環(huán)境下安裝(直接pip安裝即可);
(2)使用編譯好的whl文件安裝,下載鏈接為:
https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch
額外說明
T_T相關(guān)文件中提供了所需的預(yù)訓(xùn)練模型,若嫌棄官網(wǎng)的下載速度,可以下載我的。
下載之后放到類似下圖路徑的文件夾中:

原理簡介
作為一個純正的非藝術(shù)生,抱歉我真的沒法解釋什么叫圖像的藝術(shù)風(fēng)格。反正齊白石和梵高的畫肯定不是一個style的就是了。
那么我來嘗試解釋一下風(fēng)格遷移吧:
風(fēng)格遷移的實質(zhì)是保留原畫內(nèi)容的基礎(chǔ)上,用另外一種style來呈現(xiàn)原畫。
那么如何量化呢?
簡單而言大概是這樣的:
利用CNN逐層提取圖像的特征(層越靠后提取出的特征越高級和穩(wěn)定,即更能表現(xiàn)圖片的高級語義信息),并且將某一層或某幾層輸出的Gram矩陣作為損失函數(shù),來衡量兩幅圖像之間的內(nèi)容/風(fēng)格差異(T_T就是兩幅圖像分別經(jīng)過相同的卷積神經(jīng)網(wǎng)絡(luò),比較某一層或者某幾層輸出的Gram矩陣的差異)。
Gram矩陣是啥???
具體而言,其計算方式為:
我們都知道,一張圖片在某個卷積層的輸出特征為一個形如(batch_size, channels, width, height)的四階張量,顯然batch_size為1。
我們將類似下圖的特征:
轉(zhuǎn)換為(batch_size*channels, width*height)大小的矩陣,這個矩陣和它的轉(zhuǎn)置相乘就可以得到一個大小為(batch_size*channels, batch_size*channels)的矩陣,這個矩陣即為Gram矩陣。
其實這就算是定義了圖像風(fēng)格和圖像內(nèi)容這兩個概念了,接下來我們就可以實現(xiàn)風(fēng)格遷移了。
其流程大概是這樣的:

具體的實現(xiàn)細(xì)節(jié)詳見源代碼吧~~~
相關(guān)文件中也有官網(wǎng)教程的個人翻譯版以及相關(guān)的論文供感興趣者參考。
使用方式
修改下圖所示處的圖片路徑為自己的圖片路徑:

在cmd窗口運行Neural_Transfer.py文件即可。
由于資源和時間有限,下面展示的結(jié)果我都只跑了幾百輪左右,圖像大小為256*256。
梵高筆下的皮卡丘
原圖像:


生成的圖像:

梵高筆下的老北京
原圖像:


生成的圖像:

畢加索筆下的愛因斯坦
原圖像:


生成的圖像:

齊白石筆下的西湖
原圖像:


生成的圖像:

更多
利用其他庫實現(xiàn)的圖像風(fēng)格遷移:
1.基于python深度學(xué)習(xí)庫DeepPy的實現(xiàn):
https://github.com/andersbll/neural_artistic_style
2.基于python深度學(xué)習(xí)庫Caffe的實現(xiàn):
https://github.com/fzliu/style-transfer
3.基于python深度學(xué)習(xí)庫TensorFlow的實現(xiàn):
https://github.com/log0/neural-style-painting
感興趣的朋友自己去實現(xiàn)一下吧~~~