天天看點

實時風格遷移:Style Transfer in Real-Time

  為啥最近總是翻譯呢,新年剛過,注意力不能很集中~剛好這幾篇博文的圖很漂亮~

  翻譯篇風格遷移實時計算相關的文章,原文這裡

  在前面的博文裡,已經了解風格遷移的基本思路是将一張圖的風格遷移到另一張圖内容上去。gatys方法的缺陷在于生成一張圖檔需要大量時間,每次風格遷移圖的生成都要解決一個新的優化問題。下面每張圖檔大約需要2個小時左右在CPU上疊代1000次。

  

實時風格遷移:Style Transfer in Real-Time

  問題來了, Prisma是如何做到在手機CPU上在幾秒内讓使用者可以做不同風格的遷移的呢?

Real-Time Style Transfer

  2016年3月,斯坦福大學的研究者發表了一篇文章,提出了一種近實時的風格遷移方法。他們能夠訓練一個神經網絡來對任意指定的内容圖像做單一的風格遷移,同時,也可以訓練一個網絡來搞定不同的風格。

  Johnson的這篇paper Perceptual Losses for Real-Time Style Transfer and Super-Resolution表明,對指定圖檔應用單一的風格遷移,隻需一次前向計算是可能的。

  這裡将對該方法做個概述,并展示一些用tensorflow實作時的結果。

Learning to Optimise

  Gatys的方法,将遷移問題簡化為對loss函數的尋優問題,Johnson則更進一步,如果将風格限制為單一的,那麼可以訓練一個神經網絡來解決實時優化問題,将任意指定圖檔做固定風格的遷移。該方法的示意圖如下:

  

實時風格遷移:Style Transfer in Real-Time

  該模型包括一個圖轉換網絡和一個loss計算網絡。圖轉換網絡是個多層CNN網絡,能夠将輸入内容圖檔 C C 裝換為輸出圖檔YY,圖檔 Y Y 具有CC的内容和 S S 的風格特點。loss計算網絡用來計算生成圖YY與内容圖 C C 和風格圖SS的loss。計算方式如 前文介紹,VGG網絡已經用目标檢測任務預訓練過。

  基于上述模型,我們可以訓練圖轉換網絡以降低total-loss。挑選一固定風格的圖像,用大量的不同内容的圖像作為訓練樣本。Johnson使用 Microsoft COCO dataset來訓練,使用誤差後傳方式作為優化方法。

Image Transformation Network

  Johnson所用的圖轉換結構如下:

  

實時風格遷移:Style Transfer in Real-Time

  如上所示,包含3個Conv+ReLU子產品,5個殘差子產品,3個轉置卷積,1個tanh層生成輸出。

Downsampling with Strided Convolution

  卷積層是對輸入做filter卷積,通過移動一個固定尺寸的filter限制輸入視窗,在視窗内應用卷積來計算每組像素的卷積值。不加說明時,預設filter的移動步幅stride=1個像素。

  

實時風格遷移:Style Transfer in Real-Time

  對于輸入尺寸 n×m n × m 的圖像,若filter尺寸為 k×k k × k ,且stride=1,則輸出尺寸大小為 (n−k+1)×(m−k+1) ( n − k + 1 ) × ( m − k + 1 )

  這樣得到的圖像分辨率稍低于原始圖像,如果想要獲得一樣的分辨率,可以在輸入圖像四周添加zero-value(padding-method)。

  

實時風格遷移:Style Transfer in Real-Time

  這裡的第一個卷積層是stride=1,但是緊接着的兩個卷積層是stride=2。當stride=2時,意味着filter的移動步幅是2個像素,加上padding之後,得到的輸出尺寸是 n2×m2 n 2 × m 2 。

  

實時風格遷移:Style Transfer in Real-Time

  stride=2對輸入具有downsampling的作用。

  引入具有downsampling的卷積層的主要原因是,可以增加CNN的後續層卷積核的可視域。因為輸入圖像在像素上被下采樣了,導緻卷積計算可以計算原始圖像更大範圍的像素點。在某種程度上,允許卷積核可以在不增加核尺寸的情況下接觸到更大範圍的原始輸入像素點。這一特性是很贊的,風格遷移會連續地對整個圖檔應用某種風格,是以每個filter對原始圖像越多地表達越能夠在風格遷移時更具有連貫性和一緻性。

  另外一種可以實作下采樣的方法是pooling,也能夠起到降低圖像尺寸的效果。

Upsampling with Fractionally Strided Convolution

  對圖像應用兩次stride=2的卷積,會降低size到原來的 14 1 4 ,但我們期望輸出仍然具有與輸入圖相同的分辨率。為實作這一目的,我們引入stride= 12 1 2 的卷積,有時被稱為轉置卷積和逆卷積(注意: 這個稱呼與前面的CNN的隐層可視化的轉置卷積不是一個概念,尴尬臉)。這種操作可以提升圖像的尺寸,起到Upsampling的作用。

  stride= 12 1 2 以像素步幅1/2移動視窗,這使得輸入的分辨率翻倍提高。但實際上,我們無法這麼移動半個像素點的,是以将存在的每個像素點做zero-valued padding,然後再做stride=1的卷積,如下所示:

  

實時風格遷移:Style Transfer in Real-Time

  這樣可以使圖像分辨率翻倍,進而得到與原始輸入圖像同樣分辨率的輸出圖像。

Residual Layers

  在downsampling和upsampling之間有5層的殘差層,将stride=1的Conv+ReLU 加上identity-connect如下:

  

實時風格遷移:Style Transfer in Real-Time

  使用殘差層的原因是,對确定的任務減少訓練的難度。我們的模型不需要學習如何根據輸入産生新的輸出,而是隻需要學習如何調整輸入以便産生所需輸出。殘差層之是以被叫做殘差層,是由于我們隻需要學習輸入和輸出之間的差距。

  對一個像風格遷移這樣的學習任務,使用殘差層對生成相似于輸入的圖像是說得通的,是以加入殘差層有助于學習殘差。

Constraining the Output with a Tanh Layer

  為了能夠對神經網絡的圖像做處理,第一步要将圖像表示為像素值在[0,255]之間的矩陣。神經網絡的每一層都對該層輸入做運算産生輸出(下層輸入),在這些層内并沒有對輸出值限制到[0,255]内。

  當風格遷移時我們期望産生有效的圖像,這意味着最後輸出結果要将輸出值限制到[0,255]内。為達到這一目的,我們在最後引入tanh來處理輸出值。

  

實時風格遷移:Style Transfer in Real-Time

  tanh函數可以将值限制到[-1,+1]内,然後我們将這個結果調整下得到有效的像素值。

   output(x)=255×tanh(x)+12 o u t p u t ( x ) = 255 × t a n h ( x ) + 1 2

Results

  下面是Johnson得到的部分結果:

  

實時風格遷移:Style Transfer in Real-Time

  

實時風格遷移:Style Transfer in Real-Time

  

實時風格遷移:Style Transfer in Real-Time

  我們使用來自Microsoft COCO資料集的8萬條256x256(resize後)大小的樣本來訓練圖轉換網絡,batch-size=4下疊代了4萬次。在GTX Titan XGPU上訓練每個網絡大約需要4個小時左右,平均生成一張圖檔15毫秒。

Tensorflow Implementation

  我自己實作的TF版本在這裡,我訓練了下面的三種風格圖像轉換網絡。

  

實時風格遷移:Style Transfer in Real-Time

  每個圖轉換網絡使用Microsoft COCO的8萬條256x256(resize後)大小的樣本來訓練,batch-size=4疊代訓練了10萬次,在GTX1080GPU上消耗大約12個小時。

  使用訓練好的網絡在CPU上産生一張圖檔大約需要5秒鐘,下面舉些生成的例子。

  

實時風格遷移:Style Transfer in Real-Time

繼續閱讀