谷歌keras作者推荐:使用「风格迁移」合成高分辨率多尺度神经纹理

来源:互联网 发布:电脑随机抽奖软件 编辑:程序博客网 时间:2024/05/22 15:39


原文来源: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{Snelgrove:2017:ROD:3145749.3149449,

 author = {Snelgrove, Xavier},

 title = {High-Resolution Multi-Scale Neural Texture Synthesis},

 booktitle = {SIGGRAPH ASIA 2017 Technical Briefs},

 series = {SA '17},

 year = {2017},

 isbn = {978-1-4503-5406-6/17/11}

 location = {Bangkok},

 url = {http://doi.acm.org/10.1145/3145749.3149449},

 doi = {10.1145/3145749.3149449}

 acmid = {3005379},

 publisher = {ACM},

 address = {New York, NY, USA},

}



论文简介

论文概述


我们引入了一种新颖的多尺度方法,用于使用经过图像分类任务训练的卷积神经网络来合成高分辨率的自然纹理。以前的突破性进展是基于观察到网络中间层特征之间的相关性是强大的纹理表示,然而,网络神经元的固定感受野限制了可以合成的纹理特征的最大尺寸。

 

我们表明,与其在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 {valid,same}] [--join-mode {average,max}]

                     [--count COUNT] [--mul MUL] [--if-weight IF_WEIGHT]

                     [--if-shift IF_SHIFT] [--if-order IF_ORDER]

                     [--seed {random,symmetric}] [--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 {valid,same}, -p {valid,same}

                        What boundary condition to use for convolutions

                        (default: valid)

  --join-mode {average,max}, -j {average,max}

                        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 {random,symmetric}

                        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


回复「转载」获得授权,微信搜索「ROBO_AI」关注公众号


中国人工智能产业创新联盟于2017年6月21日成立,超200家成员共推AI发展,相关动态:

中新网:中国人工智能产业创新联盟成立

ChinaDaily:China forms 1st AI alliance

证券时报:中国人工智能产业创新联盟成立 启动四大工程搭建产业生态“梁柱”

工信部网站:中国人工智能产业创新联盟与贵阳市政府、英特尔签署战略合作备忘录


点击下图加入联盟


关注“雷克世界”后不要忘记置顶

我们还在搜狐新闻、雷克世界官网、腾讯新闻、网易新闻、一点资讯、天天快报、今日头条、雪球财经……

↓↓↓点击阅读原文查看中国人工智能产业创新联盟手册

阅读全文
0 0