一、風格遷移簡介
風格遷移(style transfer)是深度學習衆多應用中非常有趣的一種,如圖,我們可以使用這種方法把一張圖檔的風格“遷移”到另一張圖檔上:
這其中的原因在于,在原始的風格遷移過程中,把生成圖檔的過程當做一個“訓練”的過程。每生成一張圖檔,都相當于要訓練一次模型,這中間可能會疊代幾百幾千次。如果你了解過一點機器學習的知識,就會知道,從頭訓練一個模型要比執行一個已經訓練好的模型要費時太多。而這也正是原始的風格遷移速度緩慢的原因。
二、快速風格遷移簡介
快速風格遷移的網絡結構包含兩個部分。一個是“生成網絡”(原文中為transformation
network),一個是“損失網絡”(loss
network)。生成網絡接收一個圖檔當做輸入,然後輸出也是一張圖檔(即風格遷移後的結果)。如下圖,左側是生成網絡,右側為損失網絡:
訓練階段:首先標明一張風格圖檔。訓練的目标是讓生成網絡可以有效生成圖檔。目标由損失網絡定義。
執行階段:給定一張圖檔,将其輸入生成網絡,輸出這張圖檔風格遷移後的結果。
我們可以發現,在模型的“執行”階段我們就可以完成風格圖檔的生成。是以生成一張圖檔的速度非常塊,在gpu上一般小于1秒,在cpu上運作也隻需要幾秒的時間。
三、快速風格遷移的tensorflow實作
還有變換效果如下。
原始圖檔:
風格遷移後的圖檔:
以上圖檔在gpu(titan black)下生成約需要0.8s,cpu(i7-6850k)下生成用時約2.9s。
關于快速風格遷移,其實之前在github上已經有了tensorflow的兩個實作:
<a href="https://github.com/junrushao1994/fast-neural-style.tf" target="_blank">junrushao1994/fast-neural-style.tf</a>
<a href="https://github.com/olavhn/fast-neural-style" target="_blank">olavhn/fast-neural-style</a>
但是第一個項目隻提供了幾個訓練好的模型,沒有提供訓練的代碼,也沒有提供具體的網絡結構。是以實際用處不大。
而第二個模型做了完整的實作,可以進行模型的訓練,但是訓練出來的效果不是很好,在作者自己的部落格中,給出了一個範例,可以看到生成的圖檔有很多噪聲點:
四、一些實作細節
1、與tensorflow slim結合
slim是tensorflow的一個擴充庫,提供了很多與圖像分類有關的函數,已經很多已經訓練好的模型(如vgg、inception系列以及resnet系列)。
下圖是slim支援的模型:
使用slim替換掉原先的網絡之後,在損失函數中,我們不僅可以使用vgg16,也可以友善地使用vgg19、resnet等其他網絡結構。具體的實作請參考源碼。
2、改進轉置卷積的兩個trick
原先我們需要使用網絡生成圖像的時候,一般都是采用轉置卷積直接對圖像進行上采樣。
對應的tensorflow的實作:
以上為第一個trick。
3、注意使用optimizer和saver
這是關于tensorflow實作的一個小細節。
在tensorflow中,optimizer和saver是預設去訓練、儲存模型中的所有變量的。但在這個項目中,整個網絡分為生成網絡和損失網絡兩部分。我們的目标是訓練好生成網絡,是以隻需要去訓練、儲存生成網絡中的變量。在構造optimizer和saver的時候,要注意隻傳入生成網絡中的變量。
找出需要訓練的變量,傳遞給optimizer:
五、總結
總之是做了一個還算挺有趣的項目。代碼不是特别多,如果隻是用訓練好的模型生成圖檔的話,使用cpu也可以在幾秒内運作出結果,不需要去搭建gpu環境。建議有興趣的同學可以自己玩一下。
關于訓練,其實也有一段比較坎(dan)坷(teng)的調參經曆,下次有時間再分享一下,今天就先寫到這兒。謝謝大家!
本文作者:何之源