深度学习之风格迁移(一)——Neural Style(Gatys)_Vic时代的博客-程序员秘密

技术标签: 算法  深度学习  迁移  

本文介绍一个酷炫的深度学习应用:风格迁移。作者Gatys等人在2015年提出基于神经网络的风格迁移算法[1],随后发表在CVPR 2016上[2]。斯坦福大学的Justin Johnson(cs231n课程的主讲人之一)给出了Torch实现neural-style([3])。

这里写图片描述

Figure.1. 内容重构与风格重构

内容重构content reconstruction

给定一张图片 p⃗  和训练好的卷积网络,那么在每层可以得到多个feature map,个数取决于每层滤波器的个数 Nl 。我们把个feature map向量化,得到大小为 Ml 的向量。把每一层的 Nl 个特征向量保存到矩阵 FlNl×Ml 中,其元素 Flij 表示第 l 层的第 i 个滤波器在位置 j 上的激活响应。
现在指定一层的特征表示,希望生成一张新的图片 x⃗  使其在该层的特征表示 Pl 等于原特征表示 Fl (内容匹配)。定义损失函数如下:

content(p⃗ ,x⃗ ,l)=12i,j(FlijPlij)2.(1)

文中是通过把 x⃗  初始化为白噪声图片,然后通过反向传播算法进行优化得到的。其实生成的 x⃗  可以认为是该层特征向量包含的信息的可视化。

高层的特征映射只包含了图像的内容(高层次)以及图像的空间结构信息,忽略了颜色、纹理及形状等信息。

风格重构style reconstruction

本文用Gram矩阵作为风格图片的风格。
Gram矩阵包含了图片纹理信息以及颜色信息,其定义如下:

Glij=kFikFjk(2)

于是 GlNl×Nl ,称为风格表示style representation。现在希望通过反向传播算法优化白噪声图片,使其风格特征和原风格特征一致。给定风格图片 a⃗  ,希望生成的图片为 x⃗  ,对应第 l 层的Gram矩阵分别为 Al Gl ,定义该层损失函数如下:
El=14N2lM2li,j(GlijAlij)2,(3)

总损失函数为
style=l=0LωlEl,(4)

ωl 是每层的权重,文章中取style层对应的权重是style层数目的倒数,其他层权重为0。

看到到这里不得不问两个问题:为什么Gram矩阵可以表示图片的风格?是否有其他方法表示图片风格?

风格迁移

为了生成融合图片 a⃗  的风格和图片 p⃗  的内容的图片 x⃗  ,同时最小化图片 x⃗  p⃗  的某层内容表示之间的差距和 x⃗  a⃗  的多层风格表示之间的差距。损失函数为

total(p⃗ ,a⃗ ,x⃗ )=αcontent(p⃗ ,x⃗ )+βstyle(a⃗ ,x⃗ ).(5)

实验

网络模型采用19层的VGG网络。首先以内容图片作为输入,得到内容层的特征矩阵,作为内容目标;以风格图片作为输入,得到风格层的Gram矩阵,作为风格目标。在VGG中添加内容损失层以及风格损失层,以白噪声图片作为输入,通过反向传播计算损失函数关于输入的梯度,然后更新图片。这个过程不同于一般的训练过程:并不更新中间层的参数,这是Deconvolution操作。

Johnson的复现实验[3]指定输入图片的大小默认为512*512,这个时候需要的内容大概是4.5G(通过监控实验过程中消耗的内存百分比得到的)。我的GPU内存只有3G,所以如果在GPU上运行程序,会出现内存不够的错误。所以改用较慢的CPU,为一幅图片进行风格迁移花了大概50mins。

算法存在的问题

本文算法虽然生成的图片看起来很不错,但是仍存在以下问题:

  • 由于每次迁移都要对网络进行训练,速度是非常慢的,无法实现实时迁移;
  • 应用在照片上进行风格迁移,会出现失真的情况;

针对第一个问题,Johnson提出的fast-neural -style在本文网络模型前增加一个转换网络,转换网络的输入是内容图片,输出是风格迁移图片。而本文的网络模型称为损失网络,用于计算损失。为每个风格图片训练一个网络,这样在测试时,给定一张内容图片,只需要一次前向过程即可得到生成图片。关于此改进的详细信息,请查看博客 深度学习之风格迁移(二)——Fast Neural Style(Johnson)

这对第二个问题,康奈尔大学和Adobe公司合作推出了一篇文章:Deep Photo Style Transfer,通过对损失函数进行改进,使得可以在照片之间进行风格迁移且不失真。具体请看博客 深度学习之风格迁移(三)——Deep Photo Style Transfer(Fujun Luan)

参考

[1] A Neural Algorithm of Artistic Style. Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge.
[2] Image Style Transfer Using Convolutional Neural Networks. Leon A. Gatys, Alexander S. Ecker, and Matthias Bethge. CVPR 2016.
[3] neural-style in Github by Johnson.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/VictoriaW/article/details/71663332

智能推荐

spring batch学习笔记之元数据表_spring batch元数据表_财神爷驾到了的博客-程序员秘密

作用spring batch框架通过元数据表(meta data tables)来保存每个job的执行情况。包括记录每个job的名称和参数,每个job execution的状态和执行结果,每个tasklet的状态和执行结果等。配置为了能让JAVA代码访问元数据表,需要做如下配置:(1)库表准备假设通过MySQL来存储元数据,需要确保已经安装MySQL,然后创建数据库和初

python学习笔记[2]-join 和 split_aizhi5208的博客-程序员秘密

python join 和 split方法的使用,join用来连接字符串,split恰好相反,拆分字符串的。1.join用法示例 >>>li = ['my','name','is','bob'] >>>' '.join(li) 'my name is bob' >>>'_'.join(li) 'my_...

Zbrush2021写实人物肖像雕刻学习教程_云桥网络.的博客-程序员秘密

Zbrush 2021写实人物肖像雕刻学习教程 Zbrush 2021 Character Likeness Sculpting Tutorial大小解压后:24G 持续时间32h 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确)标题:Udemy–Zbrush 2021人物肖像雕刻教程信息:安东尼·霍普金斯相似课程:你唯一需要的相似课程是让任何角色变得更像真人。你会学到什么–如何塑造照片写实的人物形象–如何将您的模型与参考相匹配。–如何在Zbrush中制..

python处理考勤数据_利用Python实现对考勤打卡数据处理的总结_weixin_39899226的博客-程序员秘密

利用Python实现对考勤打卡数据处理的总结一、背景交代二、说明三、 8种方法1. 查看文件是否存在2. 导入excel文件,并把数据保存为dataframe格式3. 计算程序运行时间4. 对格式为“年-月-日 时:分:秒”的时间进行截取5. 利用已有一列得到一个新列6. 数据聚合7. 数据合并(两个dataframe的合并)8. 程序运行完毕,自主决定关闭运行窗口四、主要参考资料五、后记一、背景...

Spring实战——Bean定义中的SpEL表达式语言支持_chengqiuming的博客-程序员秘密

一配置<?xml version="1.0" encoding="GBK"?><!-- 指定Spring配置文件的根元素和Schema 导入p:命名空间和util:命名空间的元素 --><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http:/...

随便推点

css实现右侧固定宽度,左侧宽度自适应_wyd1022的博客-程序员秘密

反过来也可以:左侧宽度固定,右侧自适应。不管是左是右,反正就是一边宽度固定,一边宽度自适应。这种布局比较常见,博客园很多默认主题就是这种。一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域是主体内容区——相信把侧边栏搞成自适应的人很少吧?要实现这种布局,也算比较简单。我们先给出html结构:12345div id="

使用Dism++安装系统(新手勿尝试)_冬小可的博客-程序员秘密

系统安装是一个简单而又复杂的活。有的仅仅为了安装系统,先把ESD转为ISO。有的因为安装器不支持ESD,而转换为WIM。还有的在解压ISO……反正各种心烦本文将通过一些实例,帮助大家驾驭Dism 。目录前言 启动Dism RE模式 Dism 添加引导支持情况传统BIOS以及UEFI支持情况 多硬盘引导支持情况隐藏启...

[快速幂] POJ-3641 Pseudoprime numbers_Derthin丶的博客-程序员秘密

Pseudoprime numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4660 Description Fermat’s theorem states that for any prime number p and for a

解决IDEA编译项目一直报java: 找不到符号 符号: 方法 getUserId()异常_client error: invalid param. serverlist is empty,p_神秘的凯的博客-程序员秘密

解决办法是发现IDEA没有走指定的maven 走的是默认C:\Users\Administrator\.m2 路径下的maven解决办法:直接删除C:\Users\Administrator\m2 默认文件夹即可 记得刷新项目哦记录解决第二个问题 :在maven构建项目时候发现跟本地Idea编译项目时不一致!表现为 . ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\...

神经网络损失值不下降,训练集准确率明显高于验证集准确率问题的解决办法_训练集损失高于验证集损失_小何同学0.0的博客-程序员秘密

查到的资料:先留着,以后出问题还可以再回过来看https://blog.csdn.net/u013249853/article/details/89393982自己的解决办法:1、emmm,数据集太杂了,一个标签里有很多有其他特征的图片,删掉就好了;????2、数据集没有充分打乱。...

JAVA数组_龙须饼是怎么做的的博客-程序员秘密

Java数组的操作数组倒置主函数:int[] arr={9,2,4,7,1,6,8,5,3,0}; Test1 t1=new Test1(); System.out.println("倒置前:"+Arrays.toString(arr)); t1.reverseArr(arr); System.out.println("倒置后:...

推荐文章

热门文章

相关标签