文章目录

  • 引言
    • 可解释性
    • 一种途径:特征可视化
    • 特征和风格,两者或许是一种东西
  • 图像纹理生成
    • 格拉姆矩阵
    • 纹理生成网络
      • 纹理损失函数
  • 从纹理合成到风格迁移
    • 内容损失函数
    • 总损失函数
  • Torch代码实战
  • 效果展示
    • 只优化风格损失函数(α = 0, β = 1e3 )
    • 只优化内容损失函数(α = 1, β = 0)
    • 风格迁移效果展示(太惊艳了)

先不急着到达最精彩的地方,在这之前,让子弹再飞一会。

引言

卷积神经网络能做什么? 不论是图像识别,物体检测,图像分割或是场景重建,CNN早已经在计算机视觉的各种任务上大放异彩。对于CV研究者而言,2012年就像一个分水岭。2012年以前,在CV任务上的研究重点倾向于如何设计更好的人工特征,2012年以后,研究方向发生了180度大转弯,人工特征被渐渐抛弃,取而代之的是越来越复杂,能够提取越来越丰富特征的深度学习算法,其中就包括卷积神经网络。各种论文,实验,竞赛早已证明了CNN在CV任务上的卓越能力。

但是,CNN,或者说深度神经网络却一直有一个通病,那就是同传统的机器学习算法相比,CNN实则是一个黑盒子,传统机器学习算法重在特征工程,人工调参。算法的可解释性强,相比之下CNN网络却一直缺乏合理的可解释性。

可解释性

相较于把可解释性描述为数学上把一个公式通过运用各种定理,加上严谨的推理证明的这一过程,我本人更倾向将可解释性针对于CNN的内部推理机制,而不是CNN的算法本身。(当然算法本身需要调参也比较玄学)

再回到CNN缺乏合理的可解释性上来,也就是说,对于某个任务而言,CNN完成的很出色,但是对于作为人类的我们来说,我们并不知道它到底是如何完成的这么出色的,相反,一个具有可解释性的算法,对于我们而言才是具有借鉴意义的,因为我们能够通过网络到底学到了什么,来有针对性的修改网络的结构,或是辅助人类发现无法观察到的特征。

正是由于CNN的可解释性差,自从AlexNet诞生以来,研究者们对于卷积神经网络的研究就分叉为两个方向,一个致力于挖掘CNN在各种任务上的应用,另一个则倾向于寻找CNN网络的潜在可解释性。

一种途径:特征可视化

最早基于可解释性研究的是2013年的一篇论文Visualizing and Understanding Convolutional Networks。作者将特定卷积层的激活值通过梯度上升的方法,利用反卷积映射回原图大小,从而可视化出不同的卷积核到底学到了什么样的特征表达。通过该可视化方法,作者发现越是底层的卷积学习到的特征越简单,越是深层次的卷积学习到的特征越复杂。

紧随其后,Google在2015年也发布了一个有意思的项目,叫做Deep Dream,即让CNN"做梦",来实现一些有意思的效果。

Deep Dream的原理和论文中的可视化方法相似,通过梯度上升的方法,在反向传播时,更新的是输入图像的参数(左图)而不是网络的参数,通过迭代将卷积某一层的激活值优化到最大,最终得到的结果(右图)在某种意义上就是该卷积核所负责提取的特征:

这里的输入图像可以是任意的,假如我们优化的卷积核恰好负责提取狗的特征,那么优化之后的图像再输入预测网络时,就会被网络大概率的预测为狗,而不是人。因为优化后的图像包含了大量的神经网络所认为的狗的特征。

特征和风格,两者或许是一种东西

对于人类而言,当你看到一幅梵高的画,或是毕加索的画,你一定会一眼就认出来。如果再问你,是依据什么进行判断的,这还不简单,这两位大师的风格明显就不一样嘛。

对于风格迁移而言,算法的核心部分就是如何提取一幅图的风格。这也是其灵魂所在。但事实上,对于风格这种东西,实则是很难通过量化去表达的。传统的风格迁移算法,其原理就是从风格图中提取出某种统计模型,这些模型就代表了图像风格的某种量化表达。但这样基于人工设计的方法耗时又费力。渐渐地,人们发现卷积神经网络天然就具有这方面的能力,因为图像的风格可以表示为图像的一种内在的特征,在风格生成这方面,上述卷积特征可视化的方法就具有借鉴意义。

当然,无论是风格还是特征,它们都有一个统称——图像的纹理(texture)

图像纹理生成

在2015年的论文 Texture Synthesis Using Convolutional Neural
Networks中,作者就提出了一种通用的算法,可以生成任意图像的纹理,方法也和前面两种类似,都是基于不更新网络参数,只更新初始噪声的梯度上升方法。一个创新之处在于,在如何量化的衡量图像风格这一问题上,作者采用了**格拉姆矩阵(Gram Matrix)**的度量方法。

格拉姆矩阵

在存数学的定义上,格拉姆矩阵被定义为n维欧式空间中任意k个向量之间两两的内积所组成的矩阵
M G r a m = M T M M_{Gram}=M^TM MGram​=MTM
我们知道,两个向量内积的值可以反映这两个向量之间的某种联系,运用在图像风格的度量上,就可以表示两种特征在原图上的“出现程度”以及“共现相关性”。

如果将一层卷积的输出作为输入,那么格拉姆矩阵就可以反映该层卷积提取的特征两两之间的关系:

如上图所示,对于某层卷积的输出,先将每个通道展平成一维张量(reshape成[C, H*W]),作为特征矩阵,再将该特征矩阵和自己的转置相乘,得到的矩阵即为特征矩阵的格拉姆矩阵,格拉姆矩阵是一个对称阵,对角线上的元素代表每个通道特征自己和自己的内积,其余的元素代表不同通道之间的两两内积。

为什么格拉姆矩阵可以反映特征之间的“出现程度”以及“共现相关性”呢,一个普遍且易于理解的解释是,卷积网络不同卷积层下每一个通道的输出实则反映了图像对于某一种特征的激活程度,图像越具有该特征,那么输出的feature map的每一个像素值就越高,将两个不同特征的激活值两两相乘,如果两个特征在原图都有出现并且特别明显,那么相乘得到的值就越高,这时候我们就认为这两个特征的共现相关性就高,相反,如果一个特征在图上比较明显而另一个特征不明显或是两个特征都不明显,那么他们相乘的值就低。这在一定的程度上就可以定义图像的风格或者说纹理。

纹理生成网络

在论文中,作者采用预训练的VGG19(去掉最后用来分类的全连接层)卷积网络来提取图像特征。网络的输入包括一张风格图和一张随机初始化的噪声图。vgg19共有5个卷积Block,在每个Block的输出部分,都会计算一个输出Feature Map的Gram矩阵:
G ^ i j L = ∑ k F ^ i k L F ^ j k L \hat{G}_{i j}^{L}=\sum_{k} \hat{F}_{i k}^{L} \hat{F}_{j k}^{L} G^ijL​=k∑​F^ikL​F^jkL​

纹理损失函数

对于每一层的损失,即通过优化风格图的Gram矩阵与初始噪声图的Gram矩阵的L2距离,来使得噪声图与风格图的纹理(风格)尽可能的接近:
E L = ∑ ( G ^ L − G L ) 2 E_{L}=\sum\left(\hat{G}^{L}-G^{L}\right)^{2} EL​=∑(G^L−GL)2
有别于梯度下降优化网络参数的方法,在图像纹理生成网络中,VGG19更像是一个先验的Encoder,在训练过程中需要冻结其内部的网络参数,与此相反,随机初始化的噪声图才是梯度下降优化的对象,对于网络的总损失,则是对每一层的损失加权求和:
L ( x ⃗ , x ⃗ ^ ) = ∑ l = 0 L w l E l \mathcal{L}(\vec{x}, \hat{\vec{x}})=\sum_{l=0}^{L} w_{l} E_{l} L(x ,x ^)=l=0∑L​wl​El​
纹理生成效果:

在论文中,作者给出了四张图像的纹理生成效果,可以发现,对于浅层的卷积,生成的比较单一,主要都是一些基础的颜色以及斑块,一定程度上反映了浅层卷积负责提取较为简单的特征;随着网络尺度的加深,越是深层的卷积提取的特征就更为复杂,具体。包含的语义和结构化信息更丰富。

在搜索资料的过程中,偶然发现了一个纹理合成网站,有兴趣的请移步:

BETHGE LAB · Texture Synthesis with deep CNNs

一些细节

在这里有一个细节不知大家是否注意,那就是对于前两张图像而言,网络合成的纹理和原始的图像几乎达到了真假难辨的程度,普通人如果不仔细观测或许很难发现右边的图像是合成的,但是对于第三张尤其是第四张图像而言,合成的图像和原始图像就具有很大差异。这个问题其实并不是网络收敛得不好,而是由网络的损失函数决定的。

在格拉姆矩阵的计算过程中,风格之间的度量采用向量点积的方式,也就意味着,如果将feature map的Instance维度调换位置,计算得到的Gram矩阵仍然是一致的。这就说明了一个问题,即图像的纹理特征和空间属性无关

而对于第四张图而言,图像具有明显的空间语义信息(人,地板,显示屏),而合成的图像把空间属性给忽略了。

从纹理合成到风格迁移

好了,讲了那么多铺垫,终于到风格迁移了吗

计算机也能成为艺术家?(基于论文A Neural Algorithm of Artistic Style的图像风格迁移)相关推荐

  1. NS之VGG(Keras):基于Keras的VGG16实现之《复仇者联盟3》灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style)

    NS之VGG(Keras):基于Keras的VGG16实现之<复仇者联盟3>灭霸图像风格迁移设计(A Neural Algorithm of Artistic Style) 导读 通过代码 ...

  2. 论文总结:基于深度学习的图像风格迁移研究

    基于深度学习的图像风格迁移研究 前言 图像风格迁移方法 基于图像迭代的图像风格迁移方法 基于模型迭代的图像风格迁移方法 卷积神经网络 生成对抗网络 CycleGAN 前言 什么是深度学习? 深度学习是 ...

  3. 【人工智能专题】基于 GAN 的艺术风格化——图像风格迁移

    原文:https://mp.weixin.qq.com/s?__biz=MzAxMzEwMDM2Mg==&mid=2652847175&idx=3&sn=51dcb41bc5c ...

  4. 基于神经网络的图像风格迁移解析与实现

    概述 最近对图像风格迁移这种技术突然非常感兴趣,大概是之前读到了一篇关于对抗生成网络生成逼真人脸的论文文献,于是对这种技术很是好奇,大致了解了一下这个领域.我大致将其分为三个研究领域: 基于传统的机器 ...

  5. 基于深度学习的图像风格迁移算法的基本介绍。

    基于神经网络的图像风格迁移算法 这个算法还是蛮有趣的,之前就有宣传说让电脑来学习梵高作画,虽然有些夸张,但是实际效果出来还是挺不错的. 接下来,我们要按照以下三个部分来进行介绍,提出,方法以及结论. ...

  6. CVPR 2021 | 澳洲国立大学提出基于模型的图像风格迁移

    ©作者|侯云钟 学校|澳洲国立大学博士生 研究方向|计算机视觉 本文从另外一个角度解读,澳洲国立大学郑良老师实验室 CVPR 2021 新工作.一般而言,我们需要同时利用两张图片完成图像的风格迁移(s ...

  7. 图像风格迁移_【论文解读】图像风格迁移中的Contextual Loss

    [08/04更新]在前几天的Commit中,Contextual Loss已经支持多GPU训练 1.Background 对于图像风格迁移,最常用的做法就是通过GAN网络实现,然而,如果你没有很强大的 ...

  8. CVPR2021 最佳论文候选—提高图像风格迁移的鲁棒性

    1 前言 该论文出自于加州大学圣地亚哥分校并收录于CVPR2021,主要是对图像风格迁移的研究.传统的方法是由预先训练的网络提取的特征之间的相关性从而捕捉图像的视觉风格,但这种风格化质量并不稳定,当应 ...

  9. 学习笔记:Controllable Artistic Text Style Transfer via Shape-Matching GAN 基于形状匹配生成对抗网络的可控艺术文本风格迁移

    [ICCV-2019] Controllable Artistic Text Style Transfer via Shape-Matching GAN 基于形状匹配生成对抗网络的可控艺术文本风格迁移 ...

最新文章

  1. Flash Builder 4.7 类模板编辑设置
  2. 【经典】5种IO模型 | IO多路复用
  3. 三十六、Scrapy 中的复写默认管道和Rule扩展
  4. SparkSQL读取文件时,数据字段类型调整
  5. cobertura_Cobertura和Sonar 5.1的问题
  6. vim常用操作技巧与配置
  7. iPhone Xs上手体验,原来用绿联的转接线就能边充电边听歌
  8. android Intent调用地图应用客户端
  9. 大疆御air2怎么看经纬度_人人都能拍大片的无人机 – 大疆御 Mavic Air 2 评测
  10. 微信接口API之长链接转短链接代码示例
  11. 计算机毕业设计Java大学生第二课堂(源码+系统+mysql数据库+lw文档)
  12. 2021数学建模国赛A题
  13. java 模板模式_java设计模式之模板方法模式详解
  14. 工程训练(第一章 关于劳动 )-江苏海洋大学-mooc 答案
  15. ADXL345实现功能全面的计步器
  16. 用EXCEL制作“倒计时器
  17. 【赠书】熊德意老师的一部不止于技术的神经机器翻译“百科全书”
  18. HTML 列表标签<ol><ul><dl>详解
  19. 谢国忠:不能因自身利益驱动而散布违背经济规律的言论
  20. python如何分割年月日_将日期拆分为年、月和日,分隔符不一致

热门文章

  1. windows服务器版本信息泄露,震惊!微软32TB Windows 10源代码在网上被泄露
  2. 微信小程序——创建组件及引用
  3. DenseNet:实现高效的ConvNet描述符金字塔技术报告
  4. Java-线程安全的计数器
  5. 矩阵向量中两两间欧式距离计算
  6. python时钟程序的设计总结_python基于Kivy写一个图形桌面时钟程序
  7. 如何利用python对股票的走势进行一个判断?
  8. 我的简历加作品,有路过的帮我评评简历。
  9. Unicode编码清单的简要说明
  10. spring注解@transactional事务传播