Style Transfer

上图是Style Transfer问题的效果图:将图片B的风格迁移到另一张图片A上。

上图是图像风格迁移所涉及的科技树。

在继续讨论之前,我们有必要指出Style Transfer和其他传统的有监督学习的CV问题之间的差异。

1.风格这种抽象的概念,该如何定义?艺术领域的很多东西,通常都是很难量化的。如果要采用有监督学习的方法的话,怎么获得学习的标签呢?

2.就算解决了第1个问题,如何生成一批同一风格的图片也是一个大问题。画家可是稀缺资源啊。

因此,Style Transfer问题的关键点就在于:如何利用仅有的1张风格图片,将其风格迁移到其他图片上。

早期方法

图像风格迁移这个领域,在2015年之前,连个合适的名字都没有,因为每个风格的算法都是各管各的,互相之间并没有太多的共同之处。

比如油画风格迁移,里面用到了7种不同的步骤来描述和迁移油画的特征。又比如头像风格迁移里用到了三个步骤来把一种头像摄影风格迁移到另一种上。以上十个步骤里没一个重样的。

可以看出这时的图像风格处理的研究,基本都是各自为战,捣鼓出来的算法也没引起什么注意。


上图是一个油画风格迁移的pipe line。

在实践过程中,人们又发现图像的纹理可以在一定程度上代表图像的风格。下文如无特指,纹理/风格均为同义词。

这又引入了和风格迁移相关的另一个领域——纹理生成。这个时期,该领域虽然已经有了一些成果,但是通用性也比较差。

早期纹理生成的主要思想:**纹理可以用图像局部特征的统计模型来描述。**然而手工建模毕竟耗时耗力。。。

CNN的纹理特征

在进行神经风格迁移之前,我们先来从可视化的角度看一下卷积神经网络每一层到底是什么样子?它们各自学习了哪些东西。

遍历所有训练样本,找出让该层激活函数输出最大的9块图像区域;然后再找出该层的其它单元(不同的滤波器通道)激活函数输出最大的9块图像区域;最后共找9次,得到9×99 \times 99×9的图像如下所示,其中每个3×33 \times 33×3区域表示一个运算单元。


可以看出随着层数的增加,CNN捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体。

Deep Visualization

上述的CNN可视化的方法一般被称作Deep Visualization。

论文:

《Understanding Neural Networks Through Deep Visualization》

这篇论文是Deep Visualization的经典之作。作者是Jason Yosinski。

Jason Yosinski,Caltech本科+Cornell博士。现为Uber AI Labs的科学家。
个人主页:
http://yosinski.com/

该文提出了如下公式:

V(Fil)=arg⁡max⁡XAil(X),X←X+η∂Ail(X)∂XV(F_i^l)=\mathop{\arg\max}_{X}A_i^l(X), X \leftarrow X + \eta\frac{\partial A_i^l(X)}{\partial X}V(Fil​)=argmaxX​Ail​(X),X←X+η∂X∂Ail​(X)​

X初始化为一张噪声图片,然后按照上述公式,优化得到激活函数输出最大的X。

Deep Visualization除了用于提取纹理之外,还可用于模型压缩。

论文:

《Demystifying Neural Network Filter Pruning》

https://github.com/yosinski/deep-visualization-toolbox

这是作者Jason Yosinski提供的Deep Visualization的工具的代码。

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/deep-visualization-toolbox

原始版本是基于python 2编写的,这是我修改的python 3版本

https://github.com/Sunghyo/revacnn

这是另一个CNN可视化工具

参考:

https://zhuanlan.zhihu.com/p/24833574

Deep Visualization:可视化并理解CNN

http://www.cnblogs.com/jesse123/p/7101649.html

Tool-Deep Visualization

https://mp.weixin.qq.com/s/dflEAOELK0f19y4KuVd_dQ

40行Python代码,实现卷积特征可视化

DL方法

受到上述事实的启发,2015年德国University of Tuebingen的Leon A. Gatys写了如下两篇论文:

《Texture Synthesis Using Convolutional Neural Networks》

《A Neural Algorithm of Artistic Style》

代码:

https://github.com/jcjohnson/neural-style

torch版本

https://github.com/anishathalye/neural-style

tensorflow版本

在第一篇论文中,Gatys使用Gramian matrix从各层CNN中提取纹理信息,于是就有了一个不用手工建模就能生成纹理的方法。

Gramian matrix(由Jørgen Pedersen Gram提出)中的元素定义如下:

Gij=⟨vi,vj⟩G_{ij}=\langle v_i, v_j \rangleGij​=⟨vi​,vj​⟩

这里的viv_ivi​表示向量,GijG_{ij}Gij​是向量的内积。可以看出Gramian matrix是一个半正定的对称矩阵。

在第二篇论文中,Gatys更进一步指出:纹理能够描述一个图像的风格。

既然第一篇论文解决了从图片B中提取纹理的任务,那么还有一个关键点就是:如何只提取图片内容而不包括图片风格?

Cost Function

神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。

J(G)=α⋅Jcontent(C,G)+β⋅Jstyle(S,G)J(G)=\alpha \cdot J_{content}(C,G)+\beta \cdot J_{style}(S,G)J(G)=α⋅Jcontent​(C,G)+β⋅Jstyle​(S,G)

其中,α,β\alpha, \betaα,β是超参数,用来调整Jcontent(C,G)J_{content}(C,G)Jcontent​(C,G)与Jstyle(S,G)J_{style}(S,G)Jstyle​(S,G)的相对比重。

神经风格迁移的基本算法流程是:首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)不断减小,从而使G逐渐有C的内容和S的风格,如下图所示:


换句话来说就是:每次迭代只更新图片G,而不更新网络的参数。

我们先来看J(G)的第一部分Jcontent(C,G)J_{content}(C,G)Jcontent​(C,G),它表示内容图片C与生成图片G之间的相似度。

使用的CNN网络是之前预训练好的模型,例如Alex-Net。C,S,G共用相同模型和参数。

首先,需要选择合适的层数l来计算Jcontent(C,G)J_{content}(C,G)Jcontent​(C,G)。

如前所述,CNN的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。如果l太小,则G与C在像素上会非常接近,没有迁移效果;如果l太深,则G上某个区域将直接会出现C中的物体。因此,l既不能太浅也不能太深,一般选择网络中间层。

若C和G在l层的激活函数输出a[l](C)a^{[l](C)}a[l](C)与a[l](G)a^{[l](G)}a[l](G),则相应的Jcontent(C,G)J_{content}(C,G)Jcontent​(C,G)的表达式为:

Jcontent(C,G)=12∣∣a[l](C)−a[l](G)∣∣2J_{content}(C,G)=\frac12||a^{[l](C)}-a^{[l](G)}||^2Jcontent​(C,G)=21​∣∣a[l](C)−a[l](G)∣∣2

接下来,我们定义图片的风格矩阵(style matrix)为:

Gkk′[l]=∑i=1nH[l]∑j=1nW[l]aijk[l]aijk′[l]G_{kk'}^{[l]}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a_{ijk}^{[l]}a_{ijk'}^{[l]}Gkk′[l]​=i=1∑nH[l]​​j=1∑nW[l]​​aijk[l]​aijk′[l]​

风格矩阵Gkk′[l]G_{kk'}^{[l]}Gkk′[l]​计算第l层隐藏层不同通道对应的所有激活函数输出和。若两个通道之间相似性高,则对应的Gkk′[l]G_{kk'}^{[l]}Gkk′[l]​较大。从数学的角度来说,这里的风格矩阵实际上就是两个tensor的互相关矩阵,也就是上面提到的Gram矩阵。

Gram矩阵描述的是全局特征的自相关,如果输出图与风格图的这种自相关相近,那么差不多是我们所理解的”风格”。当然,其实也可以用很多其他的统计信息进行描绘风格。比如有用直方图的, 甚至还可以直接简化成”均值+方差”的。

风格矩阵Gkk′[l][S]G_{kk'}^{[l][S]}Gkk′[l][S]​表征了风格图片S第l层隐藏层的“风格”。相应地,生成图片G也有Gkk′[l][G]G_{kk'}^{[l][G]}Gkk′[l][G]​。那么,Gkk′[l][S]G_{kk'}^{[l][S]}Gkk′[l][S]​与Gkk′[l][G]G_{kk'}^{[l][G]}Gkk′[l][G]​越相近,则表示G的风格越接近S。这样,我们就可以定义出Jstyle[l](S,G)J^{[l]}_{style}(S,G)Jstyle[l]​(S,G)的表达式:

Jstyle[l](S,G)=1(2nH[l]nW[l]nC[l])∑k=1nC[l]∑k′=1nC[l]∣∣Gkk′[l][S]−Gkk′[l][G]∣∣2J^{[l]}_{style}(S,G)=\frac{1}{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}\sum_{k=1}^{n_C^{[l]}}\sum_{k'=1}^{n_C^{[l]}}||G_{kk'}^{[l][S]}-G_{kk'}^{[l][G]}||^2Jstyle[l]​(S,G)=(2nH[l]​nW[l]​nC[l]​)1​k=1∑nC[l]​​k′=1∑nC[l]​​∣∣Gkk′[l][S]​−Gkk′[l][G]​∣∣2

为了提取的“风格”更多,也可以使用多层隐藏层,然后相加,表达式为:

Jstyle(S,G)=∑lλ[l]⋅Jstyle[l](S,G)J_{style}(S,G)=\sum_l\lambda^{[l]}\cdot J^{[l]}_{style}(S,G)Jstyle​(S,G)=l∑​λ[l]⋅Jstyle[l]​(S,G)

实现细节

这是原始论文的插图,其符号表示和本文有所差异。其中的A、F、P各层的output,都是使用预训练好的Alex-Net生成的。

可以看出A和P,在整个迭代过程中,只需要进行一次Alex-Net的前向计算,因此可以事先计算好。

为了在迭代过程中,不修改Alex-Net的权重,而只修改F,我们可以使用tf.constant来创建Alex-Net的各个参数,进而建立Alex-Net。这样在backward的时候,梯度就只会修正到tf.Variable,也就是F上。

缺点

Gatys的方法虽然是里程碑式的进步,但仍然有如下缺点:

1.渲染速度缓慢。渲染一张图片需要从随机噪声开始,反复迭代若干次,才能得到最终的结果。

2.需要根据风格的不同,调整不同的超参数。换句话说,就是一个Style Transfer的模型就只能用于转换一种Style,通用型不强。

因此,之后的研究主要集中在对这两方面的改进上。针对前者的改进可称作fast style transfer,而后者可称作Universal Style Transfer。

此外,不是所有的style transfer都是DL方法,很多新特效往往还是用传统的滤镜实现的。比如最近比较火的“新海诚风格”。

参考:

https://blog.csdn.net/Trent1985

一个滤镜/美颜方面的blog

https://www.zhihu.com/question/29594460

新海诚风格的画面是手绘的还是Photoshop就可以达到的?后期过程是怎样的?

深度学习(三十一)——Style Transfer相关推荐

  1. 深度学习三巨头也成了大眼萌,这个一键转换动画电影形象的网站竟因「太火」而下线...

    机器之心报道 作者:魔王.杜伟 想不想在动画电影中拥有自己的角色?这个网站一键满足你的需求,不过竟因流量太大成本过高而下线. 近期热映的电影<花木兰>总是让人回想起 1998 年上映的同名 ...

  2. 2020届 AAAI Fellow名单新鲜出炉!!!深度学习三巨头终于齐聚

    点击上方"深度学习技术前沿",选择"星标"公众号 资源干货,第一时间送达 AAAI 是国际人工智能领域最权威的学术组织,Fellow 是该学会给予会员的最高荣誉 ...

  3. 实至名归!ACM宣布深度学习三巨头共同获得图灵奖

    昨日晚间,ACM(国际计算机学会)宣布,有"深度学习三巨头"之称的Yoshua Bengio.Yann LeCun.Geoffrey Hinton共同获得了2018年的图灵奖,这是 ...

  4. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头

    文章首发于微信公众号<有三AI> [技术综述]图像与CNN发家简史,集齐深度学习三巨头 没有一个经典的发现会是突然之间横空出世,它总是需要一些积淀. 提起卷积神经网络,我们总会从LeNet ...

  5. 深度学习三(PyTorch物体检测实战)

    深度学习三(PyTorch物体检测实战) 文章目录 深度学习三(PyTorch物体检测实战) 1.网络骨架:Backbone 1.1.神经网络基本组成 1.1.1.卷积层 1.1.2.激活函数层 1. ...

  6. 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!

    推荐系统中的核心是从海量的商品库挑选合适商品最终展示给用户.由于商品库数量巨大,因此常见的推荐系统一般分为两个阶段,即召回阶段和排序阶段.召回阶段主要是从全量的商品库中得到用户可能感兴趣的一小部分候选 ...

  7. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层

    目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...

  8. 深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人...

    Yann LeCun 作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) "彻头彻尾的骗局." 2018年初,历史上首个获得公民身份的机器人索菲亚,又是上节目,又是 ...

  9. 深度学习三巨头共获 2018 年图灵奖(经典重温)!

    整理 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 2019 年 3 月 27 日,ACM 宣布,深度学习三位大牛 Yoshua Bengio.Yann LeCun.Geoffrey ...

  10. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”

    栗子 安妮 乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 深度学习三巨头成为新晋图灵奖得主! ACM刚刚官宣,Yoshua Bengio.Geoffrey Hinton.Yann Le ...

最新文章

  1. C++实现九九乘法表
  2. 2019牛客多校Monotonic Matrix
  3. 简单配置 docker swarm
  4. android学习笔记30——AndroidMainfest.xml
  5. leetcode 删除链表中的节点
  6. Oracle数据库链路
  7. 如何像高级开发人员一样思考?
  8. 9-5 一致性哈希分区
  9. struts学习笔记(一):Struts相关基础理论介绍
  10. ad采样的符号位_AD采样后数据如何在FPGA中转化为有符号数
  11. python opencv读大华摄像头视频流实时移动侦测运动检测截图拍照保存
  12. 新闻客户端纷纷内容化,微博却在强化新闻属性
  13. 我参加筑路机械专业筹建过程的回忆
  14. 【skywalking 部署测试】
  15. OpenHarmony 内核 liteos_A和lite_M
  16. 平阳县抖音平台直播运营主播带货第三期培训提升班开班啦!
  17. BeanDefinition 属性详解
  18. 关于MP4文件格式解析
  19. 基于推荐算法的电影系统——具体实现(3)
  20. Excel IF 函数多条件判断

热门文章

  1. 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值
  2. CGCTF-Web-签到2
  3. 蓝绿部署滚动部署金丝雀发布(灰度发布)A/B测试
  4. React 实现 百度搜索框(简易)
  5. linux crontab结束,linux – Crontab:有开始和结束时间的日志吗?
  6. nginx在linux下是服务吗,[Linux]如何给Nginx添加服务
  7. [Eclispe] NDK内建include路径修改
  8. 2014 Container技术大会:未来Linux Container会是PaaS平台的核心
  9. android 下滑,Android实现下滑和上滑事件
  10. php 科研,科研之路2