度学习实践:如何使用Tensorflow实现快速风格迁移?
一、风格迁移简介
风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“迁移”到另一张图片上:
然而,原始的风格迁移(点击查看论文)的速度是非常慢的。在GPU上,生成一张图片都需要10分钟左右,而如果只使用CPU而不使用GPU运行程序,甚至需要几个小时。这个时间还会随着图片尺寸的增大而迅速增大。
这其中的原因在于,在原始的风格迁移过程中,把生成图片的过程当做一个“训练”的过程。每生成一张图片,都相当于要训练一次模型,这中间可能会迭代几百几千次。如果你了解过一点机器学习的知识,就会知道,从头训练一个模型要比执行一个已经训练好的模型要费时太多。而这也正是原始的风格迁移速度缓慢的原因。
二、快速风格迁移简介
那有没有一种方法,可以不把生成图片当做一个“训练”的过程,而当成一个“执行”的过程呢?答案是肯定的。可看快速风格迁移(fast neural style transfer):Perceptual Losses for Real-Time Style Transfer and Super-Resolution
快速风格迁移的网络结构包含两个部分。一个是“生成网络”(原文中为Transformation Network),一个是“损失网络”(Loss Network)。生成网络接收一个图片当做输入,然后输出也是一张图片(即风格迁移后的结果)。如下图,左侧是生成网络,右侧为损失网络:
训练阶段:首先选定一张风格图片。训练的目标是让生成网络可以有效生成图片。目标由损失网络定义。
执行阶段:给定一张图片,将其输入生成网络,输出这张图片风格迁移后的结果。
我们可以发现,在模型的“执行”阶段我们就可以完成风格图片的生成。因此生成一张图片的速度非常块,在GPU上一般小于1秒,在CPU上运行也只需要几秒的时间。
三、快速风格迁移的Tensorflow实现
话不多说,直接上我的代码的Github地址(点击可看)
还有变换效果如下。
原始图片:
风格迁移后的图片:
以上图片在GPU(Titan Black)下生成约需要0.8s,CPU(i7-6850K)下生成用时约2.9s。
关于快速风格迁移,其实之前在Github上已经有了Tensorflow的两个实现:
junrushao1994/fast-neural-style.tf
OlavHN/fast-neural-style
但是第一个项目只提供了几个训练好的模型,没有提供训练的代码,也没有提供具体的网络结构。所以实际用处不大。
而第二个模型做了完整的实现,可以进行模型的训练,但是训练出来的效果不是很好,在作者自己的博客中,给出了一个范例,可以看到生成的图片有很多噪声点:
我的项目就是在OlavHN/fast-neural-style的基础上做了很多修改和调整。
四、一些实现细节
1、与Tensorflow Slim结合
在原来的实现中,作者使用了VGG19模型当做损失网络。而在原始的论文中,使用的是VGG16。为了保持一致性,我使用了Tensorflow Slim对损失网络重新进行了包装。
Slim是Tensorflow的一个扩展库,提供了很多与图像分类有关的函数,已经很多已经训练好的模型(如VGG、Inception系列以及ResNet系列)。
下图是Slim支持的模型:
使用Slim替换掉原先的网络之后,在损失函数中,我们不仅可以使用VGG16,也可以方便地使用VGG19、ResNet等其他网络结构。具体的实现请参考源码。
2、改进转置卷积的两个Trick
原先我们需要使用网络生成图像的时候,一般都是采用转置卷积直接对图像进行上采样。
这篇文章指出了转置卷积的一些问题,认为转置卷积由于不合理的重合,使得生成的图片总是有“棋盘状的噪声点”,它提出使用先将图片放大,再做卷积的方式来代替转置卷积做上采样,可以提高生成图片的质量,下图为两种方法的对比:
对应的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:
五、总结
总之是做了一个还算挺有趣的项目。代码不是特别多,如果只是用训练好的模型生成图片的话,使用CPU也可以在几秒内运行出结果,不需要去搭建GPU环境。建议有兴趣的同学可以自己玩一下。
关于训练,其实也有一段比较坎(dan)坷(teng)的调参经历,下次有时间再分享一下,今天就先写到这儿。谢谢大家!
度学习实践:如何使用Tensorflow实现快速风格迁移?相关推荐
- android中的深度学习——快速风格迁移
============= 这是一个图片处理APP,里面使用了Opencv.深度学习.MVVM.Databinding.RxJava.各种设计模式等等,在后面一段时间我会写一系列博客来一步步剖析这个项 ...
- 深度学习项目二: 图像的风格迁移和图像的快速风格迁移 (含数据和所需源码)
图像风格迁移是指,将一幅内容图的内容,和一幅或多幅风格图的风格融合在一起,从而生成一些有意思的图片 一:传统的图像风格迁移 为了让我们生成的迁移图在风格上与风格图片尽可能相似,在内容上尽可能与内容图相 ...
- python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移
<python深度学习>笔记---8.3.神经风格迁移 一.总结 一句话总结: 神经风格迁移是指将参考图像的风格应用于目标图像,同时保留目标图像的内容. 1."神经风格迁移是指将 ...
- TensorFlow实时任意风格迁移,送女朋友的创意礼物有了
TensorFlow实时任意风格迁移,送女朋友的创意礼物有了 前言 自适应实例规范化 风格迁移网络 编码器结构与实现 通过反射填充(reflection padding)减少块伪影 解码器结构与实现 ...
- 图像风格迁移与快速风格迁移的对比(感知损失)
最近一段时间要写数字图像处理的文献综述,<深度学习在图像风格迁移中的原理与应用综述>.只能感慨自己一时选题不审,导致期末火葬场啊-- 这个问题我纠结了一天,看了N多篇文献(全是英文的-), ...
- 使用Tensorflow实现图片风格迁移,圆梦名画
一,前期基础知识储备 1)Prisma - 图片风格迁移的鼻祖: 照片可以记录生活的瞬间,变成一幅幅的回忆:而 Prisma 则是可以让瞬间的回忆变成永恒的名画!我们平常用手机随意拍出来的照片效果看起 ...
- 使用预训练模型VGG19+Tensorflow进行神经风格迁移实战
神经风格迁移 前言 正文 库.包.模板 图像预处理 构建神经风格迁移模型 VGG19预训练模型 基于VGG19自定义模型 代价函数 内容代价函数 风格代价函数 总代价函数 训练模型 结果展示 总结 源 ...
- 动手深度学习13:计算机视觉——语义分割、风格迁移
文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...
- 在Python中使用Tensorflow进行神经风格迁移
风格迁移:内容图像+风格图像=混合图像,风格迁移就是提取B的风格,然后把A用B的风格再画一遍,用的VGG19来具体定义风格和内容,VGG19模型就是在imagenet数据集上预训练的模型. 让我们从安 ...
最新文章
- 求职 .net程序员!
- linux centos安装git,centos下两种方法安装git–转载
- C++编程思想:C++string
- ActiveMQ objecmessage 无法调用问题。
- mysql考勤查询,查询mysql中的考勤表
- MATLAB:快速傅里叶变换(FFT)
- 纯净版VS2015安装教程(适合初次安装或者重装系统后)
- 搜索推荐评价指标Precision@k、Recall@k、F1@k、NDCG@k
- 安装create-react-app教程及简单配置
- Windows Internet Information Services(IIS) 与 inetpub 文件夹
- c++逆天改命进阶--map_set
- 任务卡_05-数据库_-MySql 高级任务
- vim 使用体会(1) Normal模式 当你启动Vim后,Vim会处于Normal模式。在Vim的Normal模式下,所有的键就是功能键,下面附上Vim快捷键分布图。 (2) Insert模
- [论文阅读] Structure-Consistent Weakly Supervised Salient Object Detection with Local Saliency Coherence
- 【程序人生】虚拟现实(VR)版霍兰德职业兴趣岛测试
- 如何将本地项目存入华为云
- 什么是协议芯片QC2.0,QC3.0,FP6601,HL6601
- 最全最常用的RTMP、RTSP、HTTP协议流常用直播流地址
- 通过UserAgent判断是手机访问还是PC访问
- Java数据结构03-------------链表
热门文章
- 计算机一级判断题2016,2016年12月计算机一级考试WPS判断题及答案
- 求1到30的阶乘和(Java)
- 文件夹的位置_win10添加网络位置向导 提示:‘输入的文件夹似乎无效。请选择另一个’解决方法...
- python的for语句用法_python中list循环语句用法实例
- vue2 构建一个旅游类WebApp
- 通用线程: 学习 Linux LVM
- 根据特殊实体业务,实现自定义排序
- [轉]Webdings字体图案
- SharePoint 补丁
- 古朴西安:乘汽船去机场