Image Style Transfer:多风格 TensorFlow 实现
·其实这是一个选修课的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 实现的更多相关文章
- fast neural style transfer图像风格迁移基于tensorflow实现
引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...
- 项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)
1.项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一.它合并两个图像, 即 内容图像 C(content image) 和 样式图像S(style image), 以生成图像 G(ge ...
- 神经风格转换Neural Style Transfer a review
原文:http://mp.weixin.qq.com/s/t_jknoYuyAM9fu6CI8OdNw 作者:Yongcheng Jing 等 机器之心编译 风格迁移是近来人工智能领域内的一个热门研究 ...
- DeepLearning.ai-Week4-Deep Learning & Art: Neural Style Transfer
1 - Task Implement the neural style transfer algorithm Generate novel artistic images using your alg ...
- 课程四(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 ...
- [C4W4] Convolutional Neural Networks - Special applications: Face recognition & Neural style transfer
第四周:Special applications: Face recognition & Neural style transfer 什么是人脸识别?(What is face recogni ...
- Art: Neural Style Transfer
Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...
- (转) Supercharging Style Transfer
Supercharging Style Transfer Wednesday, October 26, 2016 Posted by Vincent Dumoulin*, Jonathon Shl ...
- 《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》论文笔记
参考 http://blog.csdn.net/u011534057/article/details/55052304 代码 https://github.com/yusuketomoto/chain ...
随机推荐
- 三分钟使用webpack-dev-sever搭建一个服务器
webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...
- c++中的overload、overwrite、override
作为初学者,本文只从语法和简单的使用角度对overload.overwrite.override进行了区分,不曾涉及原理,记录下来以供查阅. 1.verload(重载) 1.1 基本要求: c++中的 ...
- HDU 5914 Triangle(打表——斐波那契数的应用)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whos ...
- 数据结构与算法(c++)——双缓存队列
"双缓存队列"是我在一次开发任务中针对特殊场景设计出来的结构.使用场景为:发送端持续向接收端发送数据包--并且不理会接收端是否完成业务逻辑.由于接收端在任何情况下停止响应即可能产生 ...
- P1361 小M的作物
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...
- ie、firefox、chrome中关于style="display:block" 引发的页面布局错乱的解决办法
ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:b ...
- SpringMvc4.x--@ControllerAdvice注解
通过@ControllerAdvice.我们可以将对于控制器的全局配置放置在同一个位置,注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler,@InitBind ...
- crontab执行带参数的php脚本,并取得参数[转]
现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多. 比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报 ...
- redis 安装实战(10步完成安装)
1 下载zip :https://redis.io/download ---->redis-4.0.6 2 上传:利用wcp 上传到/usr/local/soft/ 3 解压:tar -zv ...
- relative 和 absolute 定位关系
问题: relative 和 absolute 之间的关系是什么?有什么区别? 那,答案呢? relative 相对定位, 以自己没有设置relative 属性之前的位置来定位,占用没有设置rela ...