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 ...
随机推荐
- 【自制工具类】Java删除字符串中的元素
这几天做项目需要把多个item的id存储到一个字符串中,保存进数据库.保存倒是简单,只需要判断之前是否为空,如果空就直接添加,非空则拼接个"," 所以这个字符串的数据结构是这样的 ...
- 邓_thinkphp口试
描述php框架开发 通过提供一个开发Web程序的基本架构,PHP开发框架把PHPWeb程序开发摆到了流水线上.换句话说,PHP开发框架有助于促进快速软件开发(RAD),这节约了你的时间,有助于创建更为 ...
- dedecms====phpcms 区别==[工作]
{template "content","header"}{dede:include filename="head.htm"/} ----- ...
- webkit
HTML, 从HTML文档的开始到结束排列: <meta name="viewport" content="width=device-width, initial- ...
- 【开发技术】Eclipse插件Call Hierarchy简介及设置
Call Hierarchy 主要功能是 显示一个方法的调用层次(被哪些方法调,调了哪些方法) 在MyEclipse里Help - Software updates - Find and instal ...
- Android-第二天
1.Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器 ...
- 第一章 用HTML5中的结构元素构建网站
1.当一个容器需要直接定义样式或通过脚本定义行为时,推荐使用div元素而非section元素. 2.section是需要标题的,而nav或aside没有标题也是可以的. 3.html5轮廓工具 htt ...
- Android知识点剖析系列:深入了解layout_weight属性
摘录自:http://www.cnblogs.com/net168/p/4227144.html 前言 Android中layout_weight这个属性对于经常捣鼓UI的我们来说,肯定不会陌生.但是 ...
- _2_head_中标签
创:20_3_2017修:5_4_2017 什么是title标签? --title 页面名(双) -- 整个html的页面名字,相当于一本书的书名 <title>北门吹雪</ti ...
- 一种CListCtrl自绘效果