一、风格迁移简介

风格迁移(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实现快速风格迁移?相关推荐

  1. android中的深度学习——快速风格迁移

    ============= 这是一个图片处理APP,里面使用了Opencv.深度学习.MVVM.Databinding.RxJava.各种设计模式等等,在后面一段时间我会写一系列博客来一步步剖析这个项 ...

  2. 深度学习项目二: 图像的风格迁移和图像的快速风格迁移 (含数据和所需源码)

    图像风格迁移是指,将一幅内容图的内容,和一幅或多幅风格图的风格融合在一起,从而生成一些有意思的图片 一:传统的图像风格迁移 为了让我们生成的迁移图在风格上与风格图片尽可能相似,在内容上尽可能与内容图相 ...

  3. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移

    <python深度学习>笔记---8.3.神经风格迁移 一.总结 一句话总结: 神经风格迁移是指将参考图像的风格应用于目标图像,同时保留目标图像的内容. 1."神经风格迁移是指将 ...

  4. TensorFlow实时任意风格迁移,送女朋友的创意礼物有了

    TensorFlow实时任意风格迁移,送女朋友的创意礼物有了 前言 自适应实例规范化 风格迁移网络 编码器结构与实现 通过反射填充(reflection padding)减少块伪影 解码器结构与实现 ...

  5. 图像风格迁移与快速风格迁移的对比(感知损失)

    最近一段时间要写数字图像处理的文献综述,<深度学习在图像风格迁移中的原理与应用综述>.只能感慨自己一时选题不审,导致期末火葬场啊-- 这个问题我纠结了一天,看了N多篇文献(全是英文的-), ...

  6. 使用Tensorflow实现图片风格迁移,圆梦名画

    一,前期基础知识储备 1)Prisma - 图片风格迁移的鼻祖: 照片可以记录生活的瞬间,变成一幅幅的回忆:而 Prisma 则是可以让瞬间的回忆变成永恒的名画!我们平常用手机随意拍出来的照片效果看起 ...

  7. 使用预训练模型VGG19+Tensorflow进行神经风格迁移实战

    神经风格迁移 前言 正文 库.包.模板 图像预处理 构建神经风格迁移模型 VGG19预训练模型 基于VGG19自定义模型 代价函数 内容代价函数 风格代价函数 总代价函数 训练模型 结果展示 总结 源 ...

  8. 动手深度学习13:计算机视觉——语义分割、风格迁移

    文章目录 一.语义分割 1.1 语义分割简介 1.2 Pascal VOC2012 语义分割数据集 1.2.1下载.读取数据集 1.2.2 构建字典(RGB颜色值和类名互相映射) 1.2.3 数据预处 ...

  9. 在Python中使用Tensorflow进行神经风格迁移

    风格迁移:内容图像+风格图像=混合图像,风格迁移就是提取B的风格,然后把A用B的风格再画一遍,用的VGG19来具体定义风格和内容,VGG19模型就是在imagenet数据集上预训练的模型. 让我们从安 ...

最新文章

  1. 求职 .net程序员!
  2. linux centos安装git,centos下两种方法安装git–转载
  3. C++编程思想:C++string
  4. ActiveMQ objecmessage 无法调用问题。
  5. mysql考勤查询,查询mysql中的考勤表
  6. MATLAB:快速傅里叶变换(FFT)
  7. 纯净版VS2015安装教程(适合初次安装或者重装系统后)
  8. 搜索推荐评价指标Precision@k、Recall@k、F1@k、NDCG@k
  9. 安装create-react-app教程及简单配置
  10. Windows Internet Information Services(IIS) 与 inetpub 文件夹
  11. c++逆天改命进阶--map_set
  12. 任务卡_05-数据库_-MySql 高级任务
  13. vim 使用体会(1) Normal模式 当你启动Vim后,Vim会处于Normal模式。在Vim的Normal模式下,所有的键就是功能键,下面附上Vim快捷键分布图。 (2) Insert模
  14. [论文阅读] Structure-Consistent Weakly Supervised Salient Object Detection with Local Saliency Coherence
  15. 【程序人生】虚拟现实(VR)版霍兰德职业兴趣岛测试
  16. 如何将本地项目存入华为云
  17. 什么是协议芯片QC2.0,QC3.0,FP6601,HL6601
  18. 最全最常用的RTMP、RTSP、HTTP协议流常用直播流地址
  19. 通过UserAgent判断是手机访问还是PC访问
  20. Java数据结构03-------------链表

热门文章

  1. 计算机一级判断题2016,2016年12月计算机一级考试WPS判断题及答案
  2. 求1到30的阶乘和(Java)
  3. 文件夹的位置_win10添加网络位置向导 提示:‘输入的文件夹似乎无效。请选择另一个’解决方法...
  4. python的for语句用法_python中list循环语句用法实例
  5. vue2 构建一个旅游类WebApp
  6. 通用线程: 学习 Linux LVM
  7. 根据特殊实体业务,实现自定义排序
  8. [轉]Webdings字体图案
  9. SharePoint 补丁
  10. 古朴西安:乘汽船去机场