實時風格遷移原來這麼酷!用PyTorch分分鐘搞定
GIF/1.7M
原文來源:medium
作者:CeShine Lee
「機器人圈」編譯:嗯~阿童木呀
在這篇文章中,我將結合自身經驗,簡要講解如何用Pytorch編寫並訓練實時風格遷移模型。而這項研究主要是以Abhishek Kadian的實現為基礎的,其運行效果非常完美。而我已經對它做了一些修改,一方面是為了讓它變得更加有趣,另一方面是想讓它能夠更加適用於 Pytorch的運行環境。
該模型使用的是《基於感知損失的實時風格遷移和超解析度》以及實例歸一化(Instance Normalization)(未實施超解析度)所描述那種方法。
下面就是我所添加到該模型實現中的三個主要部分:
1.使用官方預訓練的VGG模型。
2.在訓練期間輸入中級訓練結果。
3.添加論文中所描述的總變差正則化(Total Variation Regularization)。
使用官方預訓練的VGG模型
論文《基於感知損失的實時風格遷移和超解析度》中的模型架構
首先,我們需要快速瀏覽一下該模型架構。可以說該論文的主要貢獻在於,它提出將生成的圖像反饋到預先訓練的圖像分類模型,並從一些中間層中提取輸出以計算損耗,便將會產生和Gatys等人所得到的類似的結果,但這明顯具有更少的計算資源。因此,該結構的第一部分是 「圖像變換網」(Image Transform Net),它可以從輸入圖像中生成新的圖像。而第二部分只是一個「損失網路」,即前饋部分。而損失網路的權重是固定的,在訓練過程中不會更新。
Abhishek的實現使用的是具有BGR信道順序和中心信道偏移量為[-103.939,-116.779,-123.680](它似乎也是論文中所描述使用的一種方法)的傳統VGG模型。官方pytorch預訓練模型使用的是一個統一格式:
所有預訓練的模型都希望以相同的方式對輸入圖像進行歸一化,即,預先形成小批量的3通道RGB圖像(形式為3 x H x W),其中,H和W的預期值至少為224。圖像必須載入到[0,1]的範圍內,然後使用mean = [0.485, 0.456, 0.406]和std = [0.229, 0.224, 0.225]進行規範化。
以下是從官方預訓練的模型中提取輸出的代碼:
啟動:
除非明確指定,否則VGG模型中沒有批量歸一化(batch normalization)。所以,相較於之前的實現,該激活函數的值有很大的不同。一般來說,你需要放大風格損失(格拉姆矩陣)(gram matrix),因為大多數激活函數值小於1,而使用點積會使其更小。
在訓練期間中級結果的輸出
中級階段,第75200個訓練樣本
當調整內容權重與風格權重比時,將會帶來很大的幫助。你可以在訓練期間停止訓練,重新調整參數,而不必等待4個小時當完成訓練之後才開始調整。
按照本文所述添加總變差正則化
該論文在實驗部分提到了這一點——總變差正則化,但是似乎Abhishek沒有實現這一目標:
輸出圖像是通過一種強度範圍在1×10e^-6和1×10^e-4之間的總變差正則化進行正則化的, 這是由對每一種風格目標進行交叉驗證選擇得來的。
維基百科:二維信號圖像的總變差正則化公式
其實這是很容易實現的:
Pytorch autograd將為你處理反向傳播(backward propagation)。在實際上,我還沒有找到該如何以一種較為恰當的方式來調整正則化的權重。到目前為止,我使用的權重似乎在輸出圖像上並沒有太大差異。
訓練結果
該模型使用的是Microsoft COCO數據集進行訓練的。圖像的大小重新調整為256 x 256,網路在大約2個時期內進行訓練,批量大小為4(與論文所述相同)。使用GTX1070進行訓練的時間約為4至4.5小時,與論文報告中所述的用時大致相當。基於我那稍顯粗略的實驗來說,其中大量的時間用來對輸入圖像進行規範化處理。如果我們使用原始的VGG模型(未經測試),訓練可能會進行得更快。在一些手動調整之後,內容權重vs風格比通常設置為1:10e^3?10e^5。
一個示例模型
因為網路是完全卷積的,你可以在測試時間內為網路提供比256 x 256更大或更小的圖像。 與此同時,為了該模型更為有趣,我用scikit-video和ffmpeg寫了一些腳本來轉換動畫GIF和視頻
在模型中使用的一些其他風格的圖像
GIF/1.2M
一隻馬賽克風格的貓在打字
經驗總結
2.記住要使用model.train()和model.eval()。它只對包含dropout或批量歸一化層的模型有影響,但這是一個你應該保持的好習慣。如果你之前用的是Keras,就更容易忘記這一點了。
可能的改進和未來工作規劃
1.網路有時會在開放區域產生一些奇怪的補丁。我們不知道它是從哪裡來的以及該如何修復。
2.也許給relu12、relu22、relu33、relu43輸出配置不同的權重會帶來更好的結果。
3.嘗試使用不同的預訓練網路作為損失網路。
4.嘗試實現超解析度(Super-Resolution)
5.將結果與CycleGAN進行比較。我嘗試使用CycleGAN,但訓練時間過於漫長,沒有耐心等待,從而中止運行。應該再試一次。
6.規範化生成視頻時連續幀之間的變化。這應該有助於減少播放過程中的閃爍。當然,這只是我道聽途說得來的技術方法,但不知道該如何實現。
一個奇怪補丁的示例圖片
代碼資源
點擊Github repo可獲得代碼資源,另外,關於代碼的主要部分,存在於Jupyter notebooks中,點擊鏈接可查看詳情:style-transfer.ipynb 和 Video.ipynb。
※Salesforce AI最新研究,如何情境化詞向量進行翻譯
※如何使用深度神經網路進行圖像分類?其中用到的技術哪些?
※對抗樣本到底會不會對無人駕駛目標檢測產生干擾?又有人質疑了!
※AI變革傳統行業,為何人工智慧需要找到應用場景?
※目標識別很難?對於Google卷積神經網路不過是小case
TAG:機器人圈 |
※iPhone X風格的Apple Watch 你一定忍不住想買一塊
※機能風格再迎新品!這雙 Nike Air VaporMax Utility 下周發售
※Virgil Abloh設計風格再出現!這雙Nike Air VaporMax制勝細節怎麼能錯過!
※Virgil Abloh設計風格再出現!這雙Nike Air VaporMax制勝細節怎麼能錯過?!
※走下T台後的時尚新寵,看超模Kaia Gerber最真實的Off-Duty風格!
※iPhoneX se或回歸4S風格?牛人已在iPhoneX身上實現
※Low Poly 低多邊形風格!
※Nvidia 圖片風格轉換工具——FastPhotoStyle
※Surface Pro 6設計風格大變 終於能有Type-C介面了?
※風格 | Spencer Phipps 時裝如何可持續?
※極簡解構風格!adidas Y-3 Ayero White 現已發售
※符合 Python 風格的對象
※Art Deco風格珠寶,原來這麼美!
※Alexa Chung延續自我風格——打造實用品牌
※扎染風格!Kyrie 4 「All-Star」 實物釋出!
※當你還在嘲笑Louis Vuitton、Gucci狗年限定系列丑的時候,別人已經在研究用這種風格做爆款了
※潑墨風格Pharrell Hu NMD突襲曝光!這也太美了吧!
※除了現在大火的Balenciaga姥爺鞋,Gucci小白鞋,yeezy。最能hold住各種風格的還是converse
※Nike Air VaporMax 氣墊跑鞋持續變裝「FK Utility」開啟機能風格
※Deep Learning-風格遷移