点击蓝字关注我们

AI研习图书馆,发现不一样的世界

风格迁移

图像风格化迁移是一个很有意思的研究领域,它可以将一张图的风格迁移到另外一张图像上,由此还诞生了Prisma和Ostagram这样的商业化产品。本文,我们将介绍谷歌大脑团队的一篇很有影响力的论文: Exploring the structure of a real-time, arbitrary neural artistic stylization network,该论文提出了一种任意内容、任意风格的图像风格化迁移算法。大佬已经将算法demo整合进了aizoo.com,欢迎进入网址在线体验。

在深度学习引进图像风格迁移之前,图像风格化一般称作图像纹理合成或者图像纹理迁移。在2015年,Leon Gatys等学者开始将深度学习引入到图像风格合成领域,从那时起,图像风格化迁移这个名字才开始用起来。从2015年到2017年,图像风格化迁移领域经过了火箭般的发展。其发展路线主要有以下三个阶段:

  1. 单内容单风格模型
  2. 任意内容单风格模型
  3. 任意内容、任意风格模型

有意思的是,图像风格迁移领域基本是沿着这三个阶段一脉相承的发展下来的,每一代算法都有借鉴前一个阶段的算法成果。真正做到了前人的成果,后人的阶梯。

虽然本文写作于2020年2月6日,但今天我们要重点介绍的该论文是谷歌大脑团队2017年8月发布的。我们参考Reiichiro大神于2018年开源的代码和模型,我们很快的就将他部署到了我们的网站aizoo.com。但是我并不清楚该算法的原理和细节,为了弄明白这篇论文,我仔细阅读了该论文以及其参考文献中的部分经典、高被引参考论文,结合谷歌开源的代码,我才算是真正搞懂了这篇文章。对于如果要研究图像风格化迁移的新手,直接看懂这篇文章还是蛮困难的。所以本文将用清晰、简洁的方式介绍这篇论文提到核心的算法。

正如上面提到,图像风格化迁移领域的发展是一脉相承的,该论文也使用了之前两个阶段的其他论文中的很多方法,所以,我们先对图像风格迁移领域的发展历程进行简单的介绍。

01单内容单风格模型顾名思义,这种模型就是对每一张内容图片和每一张风格图片,都需要单独建模,一般是对一张随机噪声图,不断的迭代优化,使生成图的风格类似于给定的风格图,内容却与给定的内容图像一致。Gatys等学者发表的Image Style Transfer Using Convolutional Neural Networks是图像风格化迁移领域的开山之作。该论文主要使用预训练的VGG网络来提取特征,一般我们认为VGG这类图像分类网络,其浅层会更多的保存图像的纹理信息,而深层更多的是图像的语义特征。所以,如果两张图片内容相似,他们的高层特征的欧式距离会比较小;如果两张图像的纹理相似,那么它们的低阶特征有相同的空间特性。所以,多数图像风格化模型,都会使用VGG等图像识别模型的特征来计算纹理相似性和内容相似性,并且一般都会使用VGG等网络的多个卷积层提取的特征来计算风格损失,并使用一个较深的卷积层提取的特征来计算内容损失。如下图所示,对于风格图像S、内容图像C、生成的风格化迁移图像X,分别输入VGG网络,并在如图所示的四个卷积层的特征来计算风格损失,使用relu3_3的输出的特征来计算内容损失。对于图像风格损失,一般会将提取到的特征转换为Gram矩阵,用Gram矩阵来表示纹理信息。Gram矩阵计算方法就是将每个卷积层输出的特征向量(一般为WxHxC维),reshape成WHxC的矩阵,然后该二维矩阵的转置与自身相乘,得到一个CxC的矩阵,使用这个矩阵表示该层的风格。则第j层的风格损失定义如下:总的风格损失定义如下:内容损失为内容图像和生成的风格化图像的特征之间的均方误差,第j层内容损失定义为:总的内容损失如下:最终的损失为风格损失和内容损失的一个加权和(其中λ为内容损失的权重),而网络的优化方向,就是最小化总的损失。单内容、单风格模型,很明显不实用,因为我们总不能让用户每次输入一张内容图和风格图,都用GPU迭代几分钟才给出结果吧。虽然工程上并不实用,但是该类算法提出使用VGG等预训练模型的特征进而计算风格损失和内容损失,后面的风格化算法损失函数计算方式基本沿袭于此。02任意内容单风格模型这类模型是对图像风格迁移网络进行训练,图像风格迁移网络一般是自编码器架构(AutoEncoder),输入任意一张内容图,模型可以直接输出风格化的图片。该类算法需要对一张特定风格图进行训练,在推理的时候,可以对任意内容进行风格化,这类网络的推理速度也比较快。但该类模型依旧有缺陷,因为对每个风格都需要建模,如果要做成产品,假设有1千个风格图,就要训练一千个模型,这样存储、调用起来仍旧不方便。

虽然后来有学者提出了单模型多风格的模型,一个典型的论文是A Learned Representation For Artistic Style,模型结构如上图所示,一个风格迁移模型可以存储几十种不同的风格,但仍旧不能做到风格随意切换。但这篇论文提出的一个条件实例归一化方法(conditional instance normalization),对下面要重点介绍的文章是一个非常大的启发。

还记得我们经常用的Batch Normalization吗?其原理非常简单,对于每个卷积层中每个通道的特征,我们计算其均值和标准差,然后对每个通道的每个数值减去均值,除以标准差,然后乘以一个可学习的参数γ,再加上一个可学习的偏置β。该论文提出使用这个γ和β来做作为风格图像的特征向量,即使用这γ和β值来作为风格迁移网络的部分BN层的γ和β值,进而控制风格迁移网络生成符合特定风格的图像。该文章提出可以存储N个不同风格图像的γ和β矩阵,每次生成不同风格的图像时,只需要切换不同的风格对应的γ和β矩阵,就可以生成不同风格的风格迁移图。03任意内容任意风格模型后来,有学者提出了任意图像的风格化,其有多种不同的方法,下面我们介绍一下本文要重点介绍的论文,也就是谷歌大脑团队提出的——Exploring the structure of a real-time, arbitrary neural artistic stylization network.还记得上面刚提到的条件实例归一化方法吗,谷歌大脑团队提出,如果训练一个风格预测网络,让它来生成每个风格图像的特征向量(也就是要强加给风格迁移网络的γ和β),然后输送给图像生成模型不就完事了吗?只要这个风格预测网络性能足够强,就可以做到任意风格的图像生成了。这里有一定会让大家比较迷惑的地方,也是让笔者一开始自己百思不得其解的地方。我们通常所见的一个模型的结果作为另一个模型的一个输入,一般是与其他特征进行通道拼接、或者通道逐元素相加,而本篇论文,则是把一个模型的输出,作为另外一个模型的部分BN层中的γ和β参数。这是本文一个非常特别的地方。明晰了这一点,本篇文章就很好理解了。下面是论文的主体结构图:

其中风格转换网络是一个AutoEncoder架构的网络,不过这个网络只有两个下采样层。下表是风格转换网络的结构组成。

其中每个Residual block(残差块)由两个卷积层和一个shortcut组成,而Upsampling(上采样层)则是由一个最近邻差值(2倍上采样)和一个卷积层组成。但别忘了最重要的,每个卷积层的后面都有BN层,其中前三个卷积层是普通BN层,而后面5个残差块中的十个卷积层以及两个上采样中的两个卷积层,还有最后一个卷积层,都是使用上文提到的条件实例归一化的,也就是这13个归一化层的β和γ来自于风格预测网络。其中风格预测网络是Inception V3模型,不过并不是完整的Inception V3模型,而是只使用其截止到名称为“mixed 6e”的上半部分模型,该部分作为风格预测网络的Backbone网络,然后对输出进行一个全局平均池化,再使用一个1x1的卷积层将通道数降低为100,其实这个100就可以作为一个风格图像的特征了。

但是,等等,不是说风格预测网络的输出是上述13个卷积层对应的归一化参数β和γ吗?是的,所以这个100个通道的卷积层,还要分别再接出来26个1x1的卷积层(分别是13个卷积层的γ和13个卷积层的β矩阵,所以一共26个卷积层),这26个1x1卷积层的通道数目,对应风格迁移网络中相应层的通道数。26个卷积层输出的结果才是最终送到风格转换模型的β和γ向量。下表是风格生成网络的结构图,其中最后的Matrix multiply其实是1x1的卷积层,这点还是通过看源码看到的。

明白了网络的完整的拓扑结构,对这篇文章就算有个清晰的理解了。对于训练,就很容易理解了。其损失同样是上文提到的,通过VGG网络提取的特征来计算风格损失和内容损失,优化器优化这个总的加权损失就可以了。该论文在8万张艺术画和6千张视觉纹理图上训练,最后作者还验证了,风格预测网络,在网络从未见过的风格图片上,仍然具有很好的风格建模能力。这点非常类似于人脸识别模型,一个识别模型在成千上万的人脸图片上训练好了,对于未见过的人脸,也需要对其进行很好的建模,而不能瞎预测。而一旦训练好了风格预测模型以及风格生成模型,网络就可以任意输入一张内容图片,以及一张风格图片,网络就可以很快的生成一张风格化的图片了。其实文章介绍到这里,最难理解的地方就介绍完了,下面是关于将模型通过TensorFlow.js部署到浏览器里面的一些技术细节由于Inception v3模型比较大,Reiichiro将模型进行了蒸馏,使用Mobilenet v2替换Inception v3模型作为风格预测网络,并将图像风格迁移网络中部分的卷积层替换为了深度可分离卷积层。从而降低了两个模型的大小。

模型名称 模型大小(MB) 推理时间(s)
图像风格转换模型 Inception v3 36.3 0.439
Mobilenet v2 9.6 0.047
图像风格生成模型 标准卷积结构 7.9 2.51
深度可分离卷积结构 2.4 0.90

下面我们实现的操作页面,您可以在浏览器输入aizoo.com/style-transfer.html进行体验。

我们默认使用小的模型,在图中右侧控制栏,有个“使用大模型”可选项,您可以选择大模型,大模型更‘鲜艳“一些。不过40多M的模型下载可能需要几秒钟,而且运算量也要大很多,所以相比小模型,速度会慢很多。

最后,说一下学习风格化算法和这篇论文的感悟。

因为之前并没有深入研究过图像风格化算法,但我为了介绍这个可以跑在浏览器里的算法,仔细看了这篇文章,读了几篇其他作者写的综述性介绍文章,又阅读了几篇该论文里面提到的部分参考文献,最重要的,是看了源码,才把一些很难想通的点看明白了。所以,开始一个新的研究方向,或许以下三点是入门的一个很好的点:1)阅读综述性的论文和博客,找出文中重点提到的经典论文;2)阅读该方向经典的论文,以及经典论文所参考的部分高被引文献;3)阅读部分经典论文的开源代码;其中,阅读代码可能是理解一篇论文最重要的,就像目标检测中的SSD或者Yolo论文,如果看论文,或许有很多点是看不很明白的,只有看代码,或者真正自己通过写代码实现这个算法,才能彻底搞懂它。最后,欢迎关注我们的公众号,如果您想体验跑在您浏览器的图像风格化算法,敬请访问aizoo.com,更多好玩的人工智能算法,在里面等你哦。参考文献:

  1. Image Style Transfer Using Convolutional Neural Networks
  2. A Learned Representation For Artistic Style
  3. Neural Style Transfer: A Review
  4. Porting Arbitrary Style Transfer to the Browser
  5. https://magenta.tensorflow.org/blog/2018/12/20/style-transfer-js/

    推荐阅读文章

    [1] AI入门-人工智能的前世今生[2] AI入门-深度学习综述[3] AI入门-计算机视觉学习指南[附资源][4] 深度学习框架总结—国际篇[5] 深度学习-CNN结构设计技巧[6] 资源分享-深度学习及数据分析等资源合集

    [7] 今日分享—统计学习方法

    [8] 算法总结—人脸检测算法

    [9] 目标检测算法-YOLOv4

    [10] 项目总结—人脸检测

    [11] 数据结构与算法-Python语言案例实现

    [12] 深度学习基础-二十种损失函数

    [13] 深度学习-目标检测的十九个研究方向

    [14] 项目实战-车辆检测案例实现

    [15] 卷积神经网络-可变形卷积[上]

    [16] 图像识别—EfficientNet算法详细总结

    [17] 世界读书日—机器学习西瓜书|附下载链接

    [18] 面试指南-算法岗如何针对性的准备校招面试

    ......

    点击"在看"了解更多精彩内容转载是一种动力 分享是一种美德公众号 :AI研习图书馆CSDN博客:算法之美DLGitHub:statisticszhang

    关注AI研习图书馆,发现不一样的精彩世界

图像风格迁移_图像风格迁移—谷歌大脑团队任意图像风格化迁移论文详解相关推荐

  1. 谷歌大脑团队任意图像风格化迁移论文详解,模型还可以跑在您本地浏览器里...

    图像风格化迁移是一个很有意思的研究领域,它可以将一张图的风格迁移到另外一张图像上,由此还诞生了Prisma和Ostagram这样的商业化产品.本文,我们将介绍谷歌大脑团队的一篇很有影响力的论文: Ex ...

  2. 谷歌 NAS + 目标检测:SpineNet论文详解

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:bearbee 知乎链接:https://zhuanlan.zhihu.co ...

  3. 谷歌大脑团队新尝试 用奇异向量典型相关分析解释深度神经网络

    来源:ATYUN AI平台 深度神经网络(DNNs)在视觉.语言理解和语音识别等领域取得了前所未有的进展.但这些成功也带来了新的挑战.与许多以前的机器学习方法不同的是,深度神经网络可以很容易地在分类中 ...

  4. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

  5. ★核心关注点_《信息系统项目管理师考试考点分析与真题详解》

    ★核心关注点_<信息系统项目管理师考试考点分析与真题详解> 真诚感谢你选用<信息系统项目管理师考试考点分析与真题详解>作为高级项管的辅导用书.对于使用该书的读者们,在备考201 ...

  6. cnn风格迁移_简述风格迁移Neural-Style细节

    什么是风格迁移? 风格迁移是使用某些手段(合法的), 把图像从原风格转换到另外一个风格, 同时保证图像内容没有变化, 举个栗子, 下面的这类图片应该是很多人见过了 可以看到在把画风变成梵高的星夜后, ...

  7. 图像修复 图像补全_图像修复简介

    图像修复 图像补全 In practical applications, images are often corroded by noise. These noises are dust or wa ...

  8. 一部分 数据 迁移_软件测试员12小时惊魂记:数据库迁移出大事故,如何测试?...

    信息时代,随着用户数量不断增加,业务量不断增长,企业原有数据库不足以有效支撑业务的发展,在此情况下,企业更多的是寻求一款更加稳定的数据库进行替代. 本文以Sybase数据库和Oracle数据库为例.O ...

  9. python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...

    上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...

最新文章

  1. 高并发整体可用性:一文详解降级、限流和熔断
  2. C# 的Timer 在javascript中的实现--基于Typescript
  3. Different Layouts for Different Widths
  4. 适用于WinForm的一个定时器类
  5. 阶乘和(n比较大---大数乘法+大数加法)
  6. TCP queue 的一些问题
  7. 把一些表单属性封装一个JSON
  8. python多重循环的列表_Python 多重列表解析里for的顺序
  9. python 恢复删除的文件_如何恢复已删除的python文件(一看就会的恢复软件)
  10. 被面试官问到项目中的难点?是时候对自己的项目进行总结了(记一次项目问题总结)
  11. 深度强化学习(3):策略学习篇
  12. 《红色警戒3》简体中文完美整合版下载
  13. echarts 文本标签配置 label文字样式
  14. go语言程序设计学习笔记-1
  15. 进程间通讯 --- 管道(半双工通信)
  16. PreTranslateMessage和TranslateMessage区别
  17. 完全用Linux工作-王垠
  18. PVLAN 技术介绍
  19. 双离合档把上按钮作用_读者投稿:福特逐渐放弃双离合变速箱背后的秘密
  20. Big-man进军Linux系统(二)

热门文章

  1. Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例
  2. android webview 图表,Android WebView 无法正常显示网页图表
  3. hive 如何将数组转成字符串_教你如何将Power Logic的原理图转成Orcad的原理图
  4. Spring Boot----Dubbo
  5. const char *p、char const *p、char *const p
  6. javaweb基础(40)_jdbc框架
  7. 设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则
  8. 943. Find the Shortest Superstring
  9. [Leedcode][JAVA][第887题][鸡蛋掉落][谷歌面试][动态规划]
  10. vue 生命周期_Vue生命周期小白看了都会的