·其实这是一个选修课的present,整理一下作为一篇博客,希望对你有用。讲解风格迁移的博客蛮多的,我就不过多的赘述了。讲一点几个关键的地方吧,当然最后的代码和ppt也希望对你有用。

1.引入:

风格迁移四个字直观理解很简单,就是将一张图像在保存原图大致的纹理结构的同时,具有别的图像的风格。说白了,就是对图像加了一个风格滤镜。就像下面这几幅图。

  

 下面是对一个动态图,进行毕加索风格处理后的结果。

2.过程介绍:

现在我们来看看具体的实现过程。这是论文[3]给出的实现框架。首先我们来理解一下这个框架,懂了这个框架你就懂了风格迁移的实现过程了。我们可以看到有三个框架和三个输入图片。论文中使用的框架是VGG19,也有用VGG16的,我们在实验中使用的是VGG16。a是风格图,p是内容图,x是随机生成的噪声图。该过程的总体思想就是通过对噪声图像进行约束,使其不断的同时趋近于内容图也趋近于风格图。这个约束怎么实现的呢?本论文中使用的是两种(风格和内容)损失来进行约束。首先看内容损失Lcontent,是由内容图和随机噪声图经过卷积滤波后,在第四层分别的feature map的距离的平方和。这里存在一个问题,为什么是第四层?后面有讲,先不纠结。再看风格损失Lstyle求取过程。先对风格图和噪声图的每一层滤波feature map分别求gram矩阵,再求其距离的平方和,再将5层的结果加权求和。此时我们获得了风格损失。最后将两种损失加权求和求得总的损失Ltotal。在这里又存在两个问题:1.什么是gram矩阵,为啥要用gram矩阵?2.为啥风格损失要将前几层的损失求和,而内容损失确只是第四层?先不纠结,后面有讲。现在对x噪声图的约束产生了,也就是总的损失。利用反向传播算法,迭代更新权重和偏置参数,从而更新输入图像。由于现存的框架比如TensorFlow内含优化函数,所以迭代过程我们就不关心了。好了,整个过程大致就是这样。

现在让我们来回答上面三个问题:
1.什么是gram矩阵,为啥要用gram矩阵?

    Gram矩阵就是每一层滤波后的feature map, 后将其转置并相乘得到的矩阵,如下图所示。其实就是不同滤波器滤波结果feature map两两之间的相关性。譬如说,(如下图)某一层中有一个滤波器专门检测尖尖的塔顶这样的东西,另一个滤波器专门检测黑色。又有一个滤波器负责检测圆圆的东西,又有一个滤波器用来检测金黄色。对梵高的原图做Gram矩阵,谁的相关性会比较大呢?如上图所示,“尖尖的”和“黑色”总是一起出现的,它们的相关性比较高。而“圆圆的”和“金黄色”都是一起出现的,他们的相关性比较高。因此在风格转移的时候,其实也在风景图里去寻找这种“匹配”,将尖尖的渲染为黑色,将圆圆的渲染为金黄色。如果我们承认“图像的艺术风格就是其基本形状与色彩的组合方式” ,这样一个假设,那么Gram矩阵能够表征艺术风格就是理所当然的事情了。(这段对gram矩阵的理解参考:https://zhuanlan.zhihu.com/p/23479658)。

2.为什么风格损失要用多层的损失加权求和,而内容损失只用第四层的损失?

    我们都知道,随着卷积网络层数增加,获得的特征映射更加抽象。论文[3]中做了这样的实验,可以看出,层数增高的时候,内容重构图可变化性增加,具有更大的风格变化能力。而风格随着使用的层数越多,风格迁移的稳定性越强。我们也做了实验来证明。

下面的两行图是我们自己,对不同层的风格和内容的重构图。上面一行是不同层内容作为损失的内容重构。下面一行是多层组合风格损失的重构图。具体的层数,在每一幅图的下面有注明。结果表明确实层数增高的时候,内容重构图可变化性增加,具有更大的风格变化能力。而风格随着使用的层数越多,风格迁移的稳定性越强。所以,前面论文[3]做出了这样的选择。同样,这个过程中,还有很多权重参数的设置,都是实验验证出来的。所以没有什么为什么,就是这样实验出来的效果好罢了。到这里,整个过程也就讲完了。

Conv1_2                                 Conv2_2                                    Conv3_3                                    Conv4_3

Conv1_2,Conv2_2                       Conv1_2,Conv2_2,Conv3_3       Conv1_2,Conv2_2,Conv3_3,Conv4_3

3. 结果展示

下面是对台北101图像不同风格的迁移结果。

  当然我们也做了一些改进,比如,两种风格迁移到一副图像会是什么样的结果呢?

参考文献:

1. Gatys L, Ecker A S, Bethge M. Texture synthesis using convolutional neural networks[C]//Advances in Neural Information Processing Systems. 2015: 262-270.
2. Gatys L A, Ecker A S, Bethge M. A neural algorithm of artistic style[J]. arXiv preprint arXiv:1508.06576, 2015.
3. Gatys L A, Ecker A S, Bethge M. Image style transfer using convolutional neural networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2414-2423.

4. https://zhuanlan.zhihu.com/p/23479658

Image Style Transfer:多风格 TensorFlow 实现的更多相关文章

  1. fast neural style transfer图像风格迁移基于tensorflow实现

    引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...

  2. 项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)

    1.项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一.它合并两个图像, 即 内容图像 C(content image) 和 样式图像S(style image), 以生成图像 G(ge ...

  3. 神经风格转换Neural Style Transfer a review

    原文:http://mp.weixin.qq.com/s/t_jknoYuyAM9fu6CI8OdNw 作者:Yongcheng Jing 等 机器之心编译 风格迁移是近来人工智能领域内的一个热门研究 ...

  4. DeepLearning.ai-Week4-Deep Learning & Art: Neural Style Transfer

    1 - Task Implement the neural style transfer algorithm Generate novel artistic images using your alg ...

  5. 课程四(Convolutional Neural Networks),第四 周(Special applications: Face recognition & Neural style transfer) —— 2.Programming assignments:Art generation with Neural Style Transfer

    Deep Learning & Art: Neural Style Transfer Welcome to the second assignment of this week. In thi ...

  6. [C4W4] Convolutional Neural Networks - Special applications: Face recognition & Neural style transfer

    第四周:Special applications: Face recognition & Neural style transfer 什么是人脸识别?(What is face recogni ...

  7. Art: Neural Style Transfer

    Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...

  8. (转) Supercharging Style Transfer

      Supercharging Style Transfer Wednesday, October 26, 2016 Posted by Vincent Dumoulin*, Jonathon Shl ...

  9. 《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》论文笔记

    参考 http://blog.csdn.net/u011534057/article/details/55052304 代码 https://github.com/yusuketomoto/chain ...

随机推荐

  1. [国嵌攻略][077][Linux时间编程]

    时间类型 Coordinated Universal Time(UTC):世界标准时间,也就是格林威治时间(Greenwich Mean Time, GMT). Calendar Time:日历时间, ...

  2. 织梦CMS首页调用分类信息栏目及列表方法

    不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlelen='24' orderby='pubdate' channel ...

  3. 刚装上最新node,npm install报这个错误!求ndoe大神解答!!!

    npm -v和node-v都可以打印出来但是 npm install就报错! 解决方法:网络问题,建议使用cnpm install命令安装npm,再运行npm run dev 命令

  4. Android 基础:常用布局 介绍 & 使用(附 属性查询)

    Android 基础:常用布局 介绍 & 使用(附 属性查询)   前言 在 Android开发中,绘制UI时常需各种布局 今天,我将全面介绍Android开发中最常用的五大布局 含 Andr ...

  5. linux_操作系统

    如何查询操作系统版本? cat /etc/redhat-release 什么是操作系统? -- win10,linux都是os,应用软件和硬件打交道中间桥梁软件,管理 硬件+软件 资源,计算机系统基础 ...

  6. Django_注册全局消息

    需求: 对于登录用户,无论他在哪个页面,我都需要给他全局发送一个消息提示,Django中request就是一个全局变量 那,如何做? 在models 中urser表,继承user的表类中写上一个函数, ...

  7. js_1_变量类型

    js中有哪些变量类型? 数字(包括int和float),字符串,数组(字典,js没有字典类型,把字典看成一个对象) 如何把字符转成数字呢? obj.parseInt()         //  转化成 ...

  8. 【Python3之迭代器,生成器】

    一.可迭代对象和迭代器 1.迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: ...

  9. Android更新主线程UI的两种方式handler与runOnUiThread()

    在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题.如果在主线程之外的线程中直接更新页面显示常会报错.抛 ...

  10. nodejs模块引用

    模块的引用是后端语言非常重要的一部分,那么在nodejs中,如何做到这一点呢. 在引用其他模块时,常用的就是两种方法:exports,module.exports. 接下来,我们写一个demo来分辨其 ...