谷歌keras作者推薦:使用「風格遷移」合成高解析度多尺度神經紋理
原文來源:wxs.ca
作者:Xavier Snelgrove
「雷克世界」編譯:嗯~阿童木呀、多啦A亮
「機器人圈」正式更名為「雷克世界」,後台回復「雷克世界」查看更多詳情。
風格遷移(Style Transfer)是深度學習眾多應用中非常有趣的一種。這不,Xavier Snelgrove在其博客上發表一篇文章就吸引了谷歌大牛Fran?ois Chollet的注意,該論文發表在SIGGRAPH(計算機圖形圖像特別興趣小組) Asia 2017會議上。「雷克世界」將其編譯如下:
如果你正在進行神經文理合成(texture synthesis)的相關工作,那麼你可以使用多尺度高斯金字塔表示法(multi-scale Gaussian pyramid representation),這樣的話一切事情就會變得更加美好了!
來自高解析度來源Halei Laihaweadu的紋理合成演算法的演示
圖片來自於SIGGRAPH Asia 2017的論文
有關論文詳情及相關代碼下文詳述概述。
《藝術風格的神經演算法》(Gatys、Ecker 和 Bethge於2015年著作)(https://arxiv.org/abs/1508.06576)是一篇具有開創性意義的論文,特徵激活函數的「格拉姆矩陣(Gram matrix)」被用以表示紋理,總的來說,論文中有一個研究——特徵的協方差矩陣 「『條紋』特徵協同『綠色』特徵一起出現的頻率是多少」。這項工作引發了一個爆炸性的研究,即可以使用基於卷積神經網路的紋理和圖像的表示來合成新的紋理和圖像。
但這項新的研究具有一定的局限性,即在通用圖像中實用性,因為這種技術僅限於生成只有一個尺度的低解析度紋理。
在傳統的紋理合成領域中,這個問題已經用高斯金字塔(Gaussian pyramid)多尺度圖像表示的概念得以解決。
研究結果證明,將這兩種想法結合起來用以構建高解析度圖像的方法既簡單又強大。我們想要最小化的損失函數的框圖如下所示:
當源圖像具有高解析度,或包含多個有趣特徵的尺度時,它始終執行Gatys技術。
點擊鏈接獲取更多樣本圖片(包含多項解析度)
更多樣本圖片
位於多倫多巷道的塗鴉
我的貓,Meowbot
組合多個格拉姆矩陣
雖然在論文中由於空間有限沒有加以大量闡述,但對用於大量圖像的格拉姆矩陣在每個尺度上求平均值。
在75張照片中對格拉姆矩陣求平均值,圖為秋天的多倫多Dundas 西街
對平鋪圖像和煙霧圖像中的格拉姆矩陣進行組合
如果你想引用這項研究的話,請詳讀下面的內容:
@inproceedings,
title = ,
booktitle = ,
series = ,
year = ,
isbn =
location = ,
url = ,
doi =
acmid = ,
publisher = ,
address = ,
}
論文簡介
論文概述
我們引入了一種新穎的多尺度方法,用於使用經過圖像分類任務訓練的卷積神經網路來合成高解析度的自然紋理。以前的突破性進展是基於觀察到網路中間層特徵之間的相關性是強大的紋理表示,然而,網路神經元的固定感受野限制了可以合成的紋理特徵的最大尺寸。
我們表明,與其在CNN的多層匹配統計屬性,不如跨越多個高斯金字塔的尺度匹配少量網路層以獲得更好的結果,這導致了高質量合成的高解析度紋理。
最近,在訓練一個卷積神經網路進行圖像分類中,通過充分利用中間表示(intermediate representations)的優勢(Gatys等人於2015年提出),基於樣本的紋理合成技術在質量上有了很大的提升。
由格拉姆矩陣表示的這些中間層間的特徵映射之間的相關性,被證明是紋理表示的一種強有力方法。通過合成一個新的圖像,其格拉姆矩陣接近於樣本圖像(例如通過梯度下降得到),我們可以得到具有相似紋理的圖像。
然而,只有當圖像中語義顯著的特徵處於一個適用網路的正確尺度時,這種方法才會奏效,而且在實際應用中,通用CNN架構中間層的特徵接受域相對較小[Luo等人於2016年提出]。由Gatys等人使用的來自Simonyan和Zisserman [2014]的流行VGG架構是在224×224像素的圖片上進行訓練的,其中它的相關特徵會相當小。
因此,給定一個高解析度的源圖像,為了獲得最佳結果,藝術家就必須縮小圖像,直到圖像的特徵像素尺度與網路的適當語義層相匹配。這限制了渲染圖像的解析度,並會進一步分解為具有多尺度紋理的源圖像。藝術家必須選擇在以犧牲其他事物的前提下獲取紋理尺度。
在這項研究中,我們提出了一種多尺度神經紋理合成方法,在此過程中,優化的同時還匹配了高斯金字塔的每一層的紋理[Adelson 等人於1984年提出]。藝術家再也不需要在圖像解析度和紋理保真度之間做權衡,並且可以在多個尺度上對紋理進行合成。對於神經紋理合成,這個問題已經通過利用優化過程的副作用得以解決[Gatys 等人於2016年提出]。但儘管多尺度金字塔方法在紋理合成中具有悠久的歷史[Han等人於2008年、Lefebvre和Hoppe 於2005、Portilla和Simoncelli 於2000提出],據我所知,這可是第一個在神經文理合成的背景下使用這些方法的作品。
討論
這項研究顯示了使用多尺度表示與神經紋理合成相結合的能力。 Gatys等人的研究可以看作是單尺度octave S = 1研究工作的特例。因此,建立在他們方法上的大量研究也將適用於我們。
自然延伸將嘗試多尺度風格轉移(Gatys等人2015a),隨後使用我們的目標函數來代表「風格損失(style loss)」。
我們使用簡單的優化過程來合成我們的圖像。其他研究已經表明,可以訓練前饋神經網路來近似這種優化(Johnson等人於2016年提出),因此,用我們的多尺度目標來嘗試這些方法是很有意思的。對於該網路的架構可能需要一些類似的多尺度方法,否則相同的感受野問題將適用於該前饋網路。
最後,將我們的研究與其他方法結合,以便在圖像中構建更大的結構,例如通過尋找對稱性(Berger和Memisevic 於2016年提出;Sendik和Cohen-Or於2017年提出)這也是非常有趣的。
代碼實現
主觀函數
多尺度神經紋理合成
通過使用高斯金字塔,並使用金字塔中每個空間尺度的中間VGG層的Gramian提取Gatys式的「風格」描述符,我們可以在多個圖像尺度上創建更高解析度的圖像,不一定與 Gatys層的感受野(receptive field)對齊。
更多信息在研究頁面(http://wxs.ca/research/multiscale-neural-synthesis/)。
這段代碼希望有一天會有所改進。
快速入門
?安裝要求
pip3 install -r requirements.txt
在本地運行(它在GPU上運行,這樣可能會很慢)
KERAS_BACKEND=tensorflow python3 synthesize.py -s bark.jpg
在該命令創建的「輸出」目錄中查找輸出文件。
?在FloydHub中運行
在GPU上快速運行,如果你有一個FloydHub的帳戶;
floyd init subjective-functions
然後嘗試:
floyd run --gpu "python3 synthesize.py -s bark.jpg --data-dir /vgg_weights --output-dir /output" --data wxswxs/vgg-weights/1:vgg_weights
?配置
最直接有用的標誌:
-s - Path to source texture image
--output-width, --output-height, output dimensions in pixels
查看所有其他標誌的運行
python3 synthesize.py -h
在撰寫本文時,輸出:
usage: synthesize.py [-h] [--output-width OUTPUT_WIDTH]
[--output-height OUTPUT_HEIGHT] [--octaves OCTAVES]
[--layers LAYERS [LAYERS ...]] [--max-iter MAX_ITER]
[--output-prefix OUTPUT_PREFIX] [--save-every SAVE_EVERY]
[--source-scale SOURCE_SCALE]
[--source-width SOURCE_WIDTH]
[--padding-mode ] [--join-mode ]
[--count COUNT] [--mul MUL] [--if-weight IF_WEIGHT]
[--if-shift IF_SHIFT] [--if-order IF_ORDER]
[--seed ] [--data-dir DATA_DIR]
[--output-dir OUTPUT_DIR] [--tol TOL] --source SOURCE
[SOURCE ...]
Synthesize image from texture
optional arguments:
-h, --help show this help message and exit
--output-width OUTPUT_WIDTH, -ow OUTPUT_WIDTH
Pixel width of generated image (default: 512)
--output-height OUTPUT_HEIGHT, -oh OUTPUT_HEIGHT
Pixel height of generated image. If not specified,
equal to output-width. (default: None)
--octaves OCTAVES, -o OCTAVES
Number of octaves (where 1 means "Consider only 1
scale") (default: 4)
--layers LAYERS [LAYERS ...], -l LAYERS [LAYERS ...]
Which layers to match gram matrices on (default: [2,
7])
--max-iter MAX_ITER, -m MAX_ITER
Maximum iterations for the L-BFGS-B optimizer
(default: 500)
--output-prefix OUTPUT_PREFIX, -op OUTPUT_PREFIX
Prefix to append to output directory (default: out)
--save-every SAVE_EVERY, -n SAVE_EVERY
Save an in-progress optimization image every
SAVE_EVERY iterations (default: 10)
--source-scale SOURCE_SCALE, -ss SOURCE_SCALE
How much to scale the source image by (default: None)
--source-width SOURCE_WIDTH, -sw SOURCE_WIDTH
Scale source to this width. Mutually exclusive with
source-scale (default: None)
--padding-mode , -p
What boundary condition to use for convolutions
(default: valid)
--join-mode , -j
How to combine gram matrices when multiple sources
given (default: average)
--count COUNT, -c COUNT
How many images to generate simultaneously (default:
1)
--mul MUL Multiply target grams by this amount (default: 1.0)
--if-weight IF_WEIGHT
Inter-frame loss weight (default: 1.0)
--if-shift IF_SHIFT How many pixel-shift should inter-frame loss
approximate? (default: 5.0)
--if-order IF_ORDER How many frames should we 'tie' together? (default:
2.0)
--seed
How to seed the optimization (default: random)
--data-dir DATA_DIR, -d DATA_DIR
Where to find the VGG weight files (default:
model_data)
--output-dir OUTPUT_DIR
Where to save the generated outputs (default: outputs)
--tol TOL Gradient scale at which to terminate optimization
(default: 1e-09)
--source SOURCE [SOURCE ...], -s SOURCE [SOURCE ...]
List of file to use as source textures (default: None)
附開源代碼:https://github.com/wxs/subjective-functions
※雙十一大戰即將打響!科沃斯和蘇寧聯手推出的機器人能為智慧零售帶來什麼?
※Autodesk提出機器學習新演算法:使用「自動編碼器網路」探索生成3D形狀
※神經網路中的「注意力」是什麼?怎麼用?這裡有一篇詳解
※「詞嵌入」在NLP中扮演什麼角色?一文搞懂Word Embeddings背後原理
※他是吳恩達導師,被馬雲聘為「達摩院」首座
TAG:雷克世界 |