深度学习实践:如何使用Tensorflow实现快速风格迁移?-阿里云开发者社区

开发者社区> 云栖大讲堂> 正文

深度学习实践:如何使用Tensorflow实现快速风格迁移?

简介:
+关注继续查看

一、风格迁移简介

风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“迁移”到另一张图片上:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

然而,原始的风格迁移(点击查看论文)的速度是非常慢的。在GPU上,生成一张图片都需要10分钟左右,而如果只使用CPU而不使用GPU运行程序,甚至需要几个小时。这个时间还会随着图片尺寸的增大而迅速增大。

这其中的原因在于,在原始的风格迁移过程中,把生成图片的过程当做一个“训练”的过程。每生成一张图片,都相当于要训练一次模型,这中间可能会迭代几百几千次。如果你了解过一点机器学习的知识,就会知道,从头训练一个模型要比执行一个已经训练好的模型要费时太多。而这也正是原始的风格迁移速度缓慢的原因。

二、快速风格迁移简介

那有没有一种方法,可以不把生成图片当做一个“训练”的过程,而当成一个“执行”的过程呢?答案是肯定的。可看快速风格迁移(fast neural style transfer):Perceptual Losses for Real-Time Style Transfer and Super-Resolution

快速风格迁移的网络结构包含两个部分。一个是“生成网络”(原文中为Transformation Network),一个是“损失网络”(Loss Network)。生成网络接收一个图片当做输入,然后输出也是一张图片(即风格迁移后的结果)。如下图,左侧是生成网络,右侧为损失网络:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

训练阶段:首先选定一张风格图片。训练的目标是让生成网络可以有效生成图片。目标由损失网络定义。

执行阶段:给定一张图片,将其输入生成网络,输出这张图片风格迁移后的结果。

我们可以发现,在模型的“执行”阶段我们就可以完成风格图片的生成。因此生成一张图片的速度非常块,在GPU上一般小于1秒,在CPU上运行也只需要几秒的时间。

三、快速风格迁移的Tensorflow实现

话不多说,直接上我的代码的Github地址(点击可看)

还有变换效果如下。

原始图片:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

风格迁移后的图片:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

深度学习实践:如何使用Tensorflow实现快速风格迁移?

深度学习实践:如何使用Tensorflow实现快速风格迁移?

深度学习实践:如何使用Tensorflow实现快速风格迁移?

以上图片在GPU(Titan Black)下生成约需要0.8s,CPU(i7-6850K)下生成用时约2.9s。

关于快速风格迁移,其实之前在Github上已经有了Tensorflow的两个实现:

但是第一个项目只提供了几个训练好的模型,没有提供训练的代码,也没有提供具体的网络结构。所以实际用处不大。

而第二个模型做了完整的实现,可以进行模型的训练,但是训练出来的效果不是很好,在作者自己的博客中,给出了一个范例,可以看到生成的图片有很多噪声点:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

我的项目就是在OlavHN/fast-neural-style的基础上做了很多修改和调整。

四、一些实现细节

1、与Tensorflow Slim结合

在原来的实现中,作者使用了VGG19模型当做损失网络。而在原始的论文中,使用的是VGG16。为了保持一致性,我使用了Tensorflow Slim对损失网络重新进行了包装。

Slim是Tensorflow的一个扩展库,提供了很多与图像分类有关的函数,已经很多已经训练好的模型(如VGG、Inception系列以及ResNet系列)。

下图是Slim支持的模型:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

使用Slim替换掉原先的网络之后,在损失函数中,我们不仅可以使用VGG16,也可以方便地使用VGG19、ResNet等其他网络结构。具体的实现请参考源码。

2、改进转置卷积的两个Trick

原先我们需要使用网络生成图像的时候,一般都是采用转置卷积直接对图像进行上采样。

这篇文章指出了转置卷积的一些问题,认为转置卷积由于不合理的重合,使得生成的图片总是有“棋盘状的噪声点”,它提出使用先将图片放大,再做卷积的方式来代替转置卷积做上采样,可以提高生成图片的质量,下图为两种方法的对比:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

对应的Tensorflow的实现:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

以上为第一个Trick。

第二个Trick是文章 Instance Normalization: The Missing Ingredient for Fast Stylization 中提到的,用 Instance Normalization来代替通常的Batch Normalization,可以改善风格迁移的质量。

3、注意使用Optimizer和Saver

这是关于Tensorflow实现的一个小细节。

在Tensorflow中,Optimizer和Saver是默认去训练、保存模型中的所有变量的。但在这个项目中,整个网络分为生成网络和损失网络两部分。我们的目标是训练好生成网络,因此只需要去训练、保存生成网络中的变量。在构造Optimizer和Saver的时候,要注意只传入生成网络中的变量。

找出需要训练的变量,传递给Optimizer:

深度学习实践:如何使用Tensorflow实现快速风格迁移?

五、总结

总之是做了一个还算挺有趣的项目。代码不是特别多,如果只是用训练好的模型生成图片的话,使用CPU也可以在几秒内运行出结果,不需要去搭建GPU环境。建议有兴趣的同学可以自己玩一下。

关于训练,其实也有一段比较坎(dan)坷(teng)的调参经历,下次有时间再分享一下,今天就先写到这儿。谢谢大家!

本文作者:何之源

本文转自雷锋网禁止二次转载,原文链接

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用Keras进行深度学习:(三)使用text-CNN处理自然语言(上)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识! 上一篇文章中一直围绕着CNN处理图像数据进行讲解,而CNN除了处理图像数据之外,还适用于文本分类。
1460 0
如何使用VC6编译sqlite3(版本:sqlite-source-3_6_22)
如何使用VC6编译sqlite-source-3_6_22 引言: 小老虎多多使用VC6编译sqlite-source-3_6_22的编译方法。 一.创建Win32动态链接库工程 1.打开VC新建一个“Win32 Dynamic-Link Library”工程,命名为:sqlite3; ...
698 0
《白话深度学习与TensorFlow》——3.4 如何选择好的框架
本节书摘来自华章计算机《白话深度学习与TensorFlow》一书中的第3章,第3.4节,作者:高扬,卫峥著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1147 0
使用Keras进行深度学习:(三)使用text-CNN处理自然语言(下)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识! 在上一篇文章中,已经介绍了Keras对文本数据进行预处理的一般步骤。
1769 0
沃尔玛如何使用OneOps、Jenkins、Nexus和Kubernetes管理200+配送中心
本文讲的是沃尔玛如何使用OneOps、Jenkins、Nexus和Kubernetes管理200+配送中心【编者的话】本文介绍了沃尔玛公司针对全球200+配送中心云化升级的具体情况,包括使用的方案、如何处理原来的虚拟机资源以及改造后的成效。
1532 0
看深度学习框架排名第一的TensorFlow如何进行时序预测!
2017年深度学习框架关注度排名tensorflow以绝对的优势占领榜首,本文通过一个小例子介绍了TensorFlow在时序预测上的应用。
1512 0
RoadFlow工作流使用快速入门
RoadFlow工作流使用快速入门
1599 0
《白话深度学习与TensorFlow》——3.3 其他特点
本节书摘来自华章计算机《白话深度学习与TensorFlow》一书中的第3章,第3.3节,作者:高扬,卫峥著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1924 0
《白话深度学习与TensorFlow》——3.1 简介
本节书摘来自华章计算机《白话深度学习与TensorFlow》一书中的第3章,第3.1节,作者:高扬,卫峥著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1139 0
+关注
云栖大讲堂
擅长前端领域,欢迎各位热爱前端的朋友加入我们( 钉钉群号:23351485)关注【前端那些事儿】云栖号,更多好文持续更新中!
3918
文章
1754
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载