這是本文的Pytorch實施,由Leon A. Gatys,Alexander S. Ecker和Matthias Bethge撰寫的藝術風格的神經算法。該代碼基於賈斯汀·約翰遜(Justin Johnson)的神經風格。
該論文提出了一種算法,用於使用卷積神經網絡將一個圖像的內容與另一個圖像的樣式相結合。這是一個示例,將星空之夜的藝術風格映射到斯坦福校園的夜間照片:
將不同圖像的樣式應用於相同的內容圖像可獲得有趣的結果。在這裡,我們從論文中復制了圖2,該圖2以各種樣式為德國的Tubingen提供了一張照片:
以下是將各種藝術品的風格應用於金門大橋的這張照片的結果:
該算法允許用戶權衡樣式和內容重建項的相對權重,如本示例所示,我們將畢加索(Picasso)1907年自畫像的樣式移植到Brad Pitt:
通過在提取樣式功能之前調整樣式圖像大小,我們可以控制從樣式圖像傳輸的藝術特徵的類型;您可以使用-style_scale標誌來控制此行為。在下面,我們看到了三個例子,這些例子是以星空之夜的風格渲染金門橋。從左到右, -style_scale為2.0、1.0和0.5。
您可以使用多個樣式圖像來融合多種藝術風格。
順時針從左上方順時針方向:“星空之夜” +“尖叫”,“尖叫” +“構圖VII”,“裸體裸體” +“ coptosing vii”和“坐在裸體” +“裸體” +“星空之夜”
使用多個樣式圖像時,您可以控制它們混合的程度:
如果添加flag -original_colors 1則輸出圖像將保留原始圖像的顏色。
依賴性:
可選依賴性:
安裝依賴項後,您需要運行以下腳本才能下載VGG模型:
python models/download_models.py
這將下載原始的VGG-19型號。原始的VGG-16型號也將下載。默認情況下,使用原始VGG-19模型。
如果您的內存GPU較小,那麼使用NIN Imagenet模型會更好,並給出稍差但可比的結果。您可以從BVLC Caffe ModelZoo獲取有關模型的詳細信息。運行download_models.py腳本時,下載了NIN模型。
您可以在“安裝指南”中找到Ubuntu和Windows的詳細安裝說明。
基本用法:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
使用NIN模型使用Cudnn:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
要使用多個樣式圖像,請通過這樣的逗號分隔列表:
-style_image starry_night.jpg,the_scream.jpg 。
請注意,圖像路徑不應包含~字符來表示您的主目錄;相反,您應該使用相對路徑或完整的絕對路徑。
選項:
-image_size :生成圖像的最大側長(以像素為單位)。默認值為512。-style_blend_weights :將多種樣式圖像樣式混合的權重作為逗號分隔的列表,例如-style_blend_weights 3,7 。默認情況下,所有樣式圖像都同樣加權。-gpu :使用GPU的零索引ID;對於CPU模式集-gpu到c 。優化選項:
-content_weight :加權內容重建項多少。默認值為5E0。-style_weight :加權樣式重建術語多少。默認值為1E2。-tv_weight :總變化(電視)正則化的重量;這有助於平滑圖像。默認值為1E-3。設置為0以禁用電視正則化。-num_iterations :默認值為1000。-init :生成生成圖像的方法; random或image之一。默認值是random ,它使用紙張中的噪聲初始化; image初始化內容圖像。-init_image :用用戶指定的圖像替換初始化圖像。-optimizer :要使用的優化算法; lbfgs或adam ;默認值為lbfgs 。 L-BFG傾向於給出更好的結果,但使用更多的內存。切換到亞當將減少記憶使用量;使用亞當時,您可能需要使用其他參數來獲得良好的結果,尤其是樣式的重量,內容重量和學習率。-learning_rate :與Adam Optimizer一起使用的學習率。默認值為1E1。-normalize_gradients :如果存在此標誌,則每一層的樣式和內容梯度將進行L1標準化。輸出選項:
-output_image :輸出圖像的名稱。默認值為out.png 。-print_iter :打印進度每個print_iter迭代。設置為0以禁用打印。-save_iter :保存每個save_iter迭代的圖像。設置為0以禁用保存中間結果。層選項:
-content_layers :用於內容重建的室內層名稱的列表列表。默認值為relu4_2 。-style_layers :用於樣式重建的逗號分隔層名稱列表。默認值為relu1_1,relu2_1,relu3_1,relu4_1,relu5_1 。其他選項:
-style_scale :從樣式圖像中提取功能的擴展。默認值為1.0。-original_colors :如果將其設置為1,則輸出圖像將保留內容圖像的顏色。-model_file :VGG CAFFE模型的.pth文件的路徑。默認值是原始的VGG-19型號;您也可以嘗試原始的VGG-16型號。-pooling :要使用的合併層的類型; max或avg之一。默認值為max 。 VGG-19型號使用最大池層,但是論文提到,用平均池層代替這些層可以改善結果。我無法使用平均合併獲得良好的結果,但是選擇在這裡。-seed :可以指定可重複結果的整數值。默認情況下,此值對於每個運行都是隨機的。-multidevice_strategy :使用多個設備時拆分網絡的圖層索引列表。有關更多詳細信息,請參見Multi-GPU縮放。-backend : nn , cudnn , openmp或mkl 。默認為nn 。 mkl需要英特爾的MKL後端。-cudnn_autotune :使用Cudnn後端時,將此標誌傳遞以使用內置的Cudnn Autotuner為您的體系結構選擇最佳的捲積算法。這將使第一次迭代稍慢一點,並且可能需要更多的內存,但可能會大大加快Cudnn後端的速度。 問題:該程序耗盡內存並死亡
解決方案:嘗試減小圖像大小: -image_size 256 (或較低)。請注意,不同的圖像尺寸可能需要-style_weight和-content_weight的非默認值才能獲得最佳結果。如果您在GPU上運行,也可以嘗試使用-backend cudnn運行以減少內存使用量。
問題: -backend cudnn比默認NN後端慢
解決方案:添加標誌-cudnn_autotune ;這將使用內置的Cudnn自動持有器選擇最佳的捲積算法。
問題:獲取以下錯誤消息:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
解決方案:由於與圖層位置混合在一起,較舊的型號需要修復與較新版本的Pytorch兼容。隨附的donwload_models.py腳本將在下載模型後自動執行這些修復程序。
默認情況下, neural-style-pt使用nn後端進行卷積和L-BFG進行優化。這些可以帶來良好的結果,但都可以使用很多內存。您可以減少以下記憶使用量:
-backend cudnn以使用cudnn後端。這僅在GPU模式下工作。-optimizer adam以使用ADAM代替L -BFG。這應該大大減少內存使用情況,但可能需要調整其他參數以取得良好的結果;特別是您應該使用學習率,內容重量和样式的體重。這應該在CPU和GPU模式下起作用。-image_size 256以生成默認大小一半的圖像。在默認設置的情況下,神經風格的PT在我的系統上使用了約3.7 GB的GPU內存;切換到Adam和Cudnn將GPU內存足跡降低到約1GB。
速度可能會因後端和優化器而異。以下是在帶有不同設置的Tesla K80上使用-image_size=512運行500次迭代的時間:
-backend nn -optimizer lbfgs :117秒-backend nn -optimizer adam :100秒-backend cudnn -optimizer lbfgs :124秒-backend cudnn -optimizer adam :107秒-backend cudnn -cudnn_autotune -optimizer lbfgs :109秒-backend cudnn -cudnn_autotune -optimizer adam :91秒這是GTX 1080上的相同基準:
-backend nn -optimizer lbfgs :56秒-backend nn -optimizer adam :38秒-backend cudnn -optimizer lbfgs :40秒-backend cudnn -optimizer adam :40秒-backend cudnn -cudnn_autotune -optimizer lbfgs :23秒-backend cudnn -cudnn_autotune -optimizer adam :24秒您可以使用多個CPU和GPU設備來處理更高分辨率的圖像;網絡的不同層將在不同的設備上計算。您可以控制哪些GPU和CPU設備與-gpu標誌一起使用,並且可以控制如何使用-multidevice_strategy標誌在設備上拆分圖層。
例如,在具有四個GPU的服務器中,您可以給出flag -multidevice_strategy 3,6,12以按該順序進行GPU 0、1、2和3的處理; by also giving the flag -gpu 0,1,2,3 you indicate that the first two layers should be computed on GPU 0, layers 3 to 5 should be computed on GPU 1, layers 6 to 11 should be computed on GPU 2, and the remaining layers should be computed on GPU 3. You will need to tune the -multidevice_strategy for your setup in order to achieve maximal resolution.
如萊昂·A·蓋蒂斯(Leon A. Gatys ) ,亞歷山大·S·埃克(Alexander S.
這是在帶有八個Tesla K80 GPU的服務器上生成的4016 x 2213圖像:
用於生成此圖像的腳本可以在此處找到。
圖像用白噪聲初始化,並使用L-BFG進行了優化。
我們使用conv1_1 , conv2_1 , conv3_1 , conv4_1和conv5_1層和內容重建使用conv4_2層執行樣式重建。與本文一樣,五種樣式的重建損失具有相等的權重。
如果您發現此代碼對您的研究有用,請使用提供的引用引用。