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 ...
随机推荐
- Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测
0.引言 利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑: 使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...
- OpenCV3.4两种立体匹配算法效果对比
以OpenCV自带的Aloe图像对为例: 1.BM算法(Block Matching) 参数设置如下: ) + ) & -; cv::Ptr<cv::StereoBM> b ...
- 【开发技术】 Air display的介绍与使用
原理是,通过ipad与电脑连接的同一网络,然后把你的ipad变成电脑的屏幕 安装方法:1, 2, 3,
- struts文件异常Included file cannot be found
1.命名规范,都是采用struts-xxx.xml文件,即以struts开头 2.file的路径不要以/开头,在其他版本是以/开头的 <include file="/com/bjsxt ...
- Java泛型范例
class Point<T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T getVar ...
- MySQL查询性能优化一则
公司有一套Web系统, 使用方反馈系统某些页面访问速度缓慢, 用户体验很差, 并且偶尔还会出现HTTP 502错误. 这是典型的服务器端IO阻塞引发的问题,通过对访问页面的程序逻辑进行跟踪,发现问题应 ...
- 流API--提取流+组合流
提取子流和组合流 1,limit(n)会返回一个包含n个元素的新流,如果原始流的长度小于n,则会返回原始的流.这个方法可用来裁剪指定长度的流. 2,skip(n)正好相反,它会丢弃掉前面的n个元素. ...
- 腾讯工程师教你玩转 RocksDB
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云数据库内核团队 原文标题:[腾讯云CDB]教你玩转MyRocks/RocksDB-STATISTICS与后台线程篇 0. Intro ...
- java web response提供文件下载功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- PHP判断变量是否为空的几种方法小结
1. isset功能:判断变量是否被初始化 说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过注意:当使用isset来判断数组元素是否被初始化过时,它的效率比array_key_e ...