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

00e15ce7db57743237aec188fac6fbf8.gif点击蓝字关注我们

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

风格迁移

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

c124552762cb2a61665df88b1fdf4757.png

在深度学习引进图像风格迁移之前,图像风格化一般称作图像纹理合成或者图像纹理迁移。在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的输出的特征来计算内容损失。20bc8d2e82c476f555371ce5d668cd33.png对于图像风格损失,一般会将提取到的特征转换为Gram矩阵,用Gram矩阵来表示纹理信息。Gram矩阵计算方法就是将每个卷积层输出的特征向量(一般为WxHxC维),reshape成WHxC的矩阵,然后该二维矩阵的转置与自身相乘,得到一个CxC的矩阵,使用这个矩阵表示该层的风格。则第j层的风格损失定义如下:323560662910eb80e57713c789e32151.png总的风格损失定义如下:bf295efd497ecb719b2c79f98543c0c9.png内容损失为内容图像和生成的风格化图像的特征之间的均方误差,第j层内容损失定义为:43c33407d639f1d4de1fbff0878d91f7.png总的内容损失如下:8a31387054ffbc23178a62f3318edd3f.png最终的损失为风格损失和内容损失的一个加权和(其中λ为内容损失的权重),而网络的优化方向,就是最小化总的损失。caaff4c1fceaaa50a7bae4535d405944.png单内容、单风格模型,很明显不实用,因为我们总不能让用户每次输入一张内容图和风格图,都用GPU迭代几分钟才给出结果吧。虽然工程上并不实用,但是该类算法提出使用VGG等预训练模型的特征进而计算风格损失和内容损失,后面的风格化算法损失函数计算方式基本沿袭于此。02任意内容单风格模型这类模型是对图像风格迁移网络进行训练,图像风格迁移网络一般是自编码器架构(AutoEncoder),输入任意一张内容图,模型可以直接输出风格化的图片。该类算法需要对一张特定风格图进行训练,在推理的时候,可以对任意内容进行风格化,这类网络的推理速度也比较快。但该类模型依旧有缺陷,因为对每个风格都需要建模,如果要做成产品,假设有1千个风格图,就要训练一千个模型,这样存储、调用起来仍旧不方便。

1dc239f62d6570daed4598e0d98ae771.png

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

c8c513c5de18525d32639cd0f26f32f0.png

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

b28cc07a09072aa6b2f381d52b09011e.png

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

b6858b034c399cd6f8fdde908686e49b.png

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

734728760d2c3e445e34a0890ddcba96.png

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

734728760d2c3e445e34a0890ddcba96.png

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

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

ae0021ef30c79447a04a047decfde85e.png我们默认使用小的模型,在图中右侧控制栏,有个“使用大模型”可选项,您可以选择大模型,大模型更‘鲜艳“一些。不过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] 面试指南-算法岗如何针对性的准备校招面试

       ......

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

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

    f2b275e89587bdbb25936554998502aa.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

石子合并问题java,石子合并问题 GarsiaWachs算法

石子合并问题 GarsiaWachs算法目录引入一个较为朴素的算法GarsiaWachs算法引入在一个操场上摆放着一排 \(N\) 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 \(2\) 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法&…

Asterisk NAT

网络结构如下&#xff1a; asterisk(192.168.1.99) <--> 无线路由器&#xff08;公网IP: 55.66.77.88&#xff09; <-----------------------> 无线路由器&#xff08;公网IP: 21.31.41.51&#xff09; <--> eyeBeam(sip软电话: 192.168.12.43) 也就是说ast…

python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

本文面对三种常常遇到的情况&#xff0c;总结三种读取数据的方式&#xff0c;分别用于处理单张图片、大量图片&#xff0c;和TFRecorder读取方式。并且还补充了功能相近的tf函数。1、处理单张图片我们训练完模型之后&#xff0c;常常要用图片测试&#xff0c;有的时候&#xff…

oracle无效的关联运算符,菜鸟请教:关联操作符=>用法

定位符和命名符create or replace procedure CallMe(p_ParameterA varchar2,p_ParameterB number,p_ParameterC boolean,p_ParameterD date) asbeginnull;end CallMe;declarev_Variable1 varchar2(10);v_Variable2 number(7, 6);v_Variable3 boolean;v_Variable4 date;beginCal…

asterisk的NAT配置

【转】asterisk的NAT配置 http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html 这篇文章已经把该说的都说了&#xff0c;能理解多少是多少&#xff01; 1. sip.conf: Externip:在[general] context配置的属性&#xff0c;配置你的公网地址&…

jeecgboot前端开发_Jeecg-Boot 技术文档

## 2.4 新版本文档请移步到&#xff1a; http://doc.jeecg.com## (重要的事情说三遍&#xff0c;注意注意注意啦&#xff01;&#xff01;&#xff01;)*** --- __![输入图片说明](https://static.oschina.net/uploads/img/201905/24164523_XDhg.png "在这里输入图片标题&…

xml与oracle对比,Oracle XML DB和DB2 pure XML在XML文档存储查询性能方面的比较分析

0引言随着互联网和信息化技术的快速发展,医院在逐步完成医院信息数字化建设过程中,它的核心技术之一就是电子病历的数字化管理和应用。电子病历包括病人就诊或治疗的全部临床信息,这些信息一般由数字、文字、图形和图像等数字信息组成。本文仅对纯文本数据电子病例的存储和查询…

sip配置

sip配置 sip--会话初始协议&#xff0c;通常用于voip电话&#xff0c;进行呼叫建立、呼叫结束以及呼叫进程中的协商。基本上&#xff0c;它帮助二个端点互相通话。sip不处理媒体;当呼叫建立之后&#xff0c;它通过实时传输协议在电话之间直接传输媒体。 SIP使用UDP5060端口进行…

[leetcode]Merge Intervals

整体不难&#xff0c;一开始以为是线段树&#xff0c;后来仔细看来不需要&#xff0c;从左到右扫&#xff0c;判断是否要merge就是了。此题有几个要注意的地方&#xff1a;1.Java的Comparator要会写&#xff1b;2.循环结束后的ans.add(tmp)不要忘记&#xff1b;3.merge的时候&a…

php公交查询系统源代码,基于Smarty公交查询系统的设计与实现(PHP,MySQL)

基于Smarty公交查询系统的设计与实现(,MySQL)(任务书,开题报告,中期报告,毕业论文11000字,程序代码,MySQL数据库,答辩PPT)本系统主要分为前台页面、后台逻辑及数据库三大部分。前台页面主要由首页&#xff0c;各查询页面及管理数据页面等&#xff0c;后台逻辑则分别针对各个页面…

xilinx芯片管脚使用限制_修复焊接BGA芯片过程

我们能够享受现代电子设备小巧玲珑但又功能强大的优点&#xff0c;得益于芯片的小型封装的优势&#xff0c;其中一个最为优秀的封装形式就是锡球阵列封装(BGA)。这种封装形式芯片的管脚是分布于芯片底部的一系列点阵排列的焊盘&#xff0c;通过均匀的锡球与PCB板连接在一起。比…

ajax请求web服务返回json格式

由于.net frameword3.5以上添加了对contenttype的检查&#xff0c;当ajax发送请求时&#xff0c;如果设置了contenttype为json&#xff0c;那么请求webservice时&#xff0c;会自动将返回的内容转为json的格式&#xff0c;json的格式iruxia{"d":"webservice方法…

linux驱动中使用定时器

我的内核是2.4.18的。Linux的内核中定义了一个定时器的结构&#xff1a; #include<linux/timer.h> struct timer_list { structlist_head list; unsigned long expires; //定时器到期时间 unsigned long data; //作为参数被传入定时器处理函数 void (*function)(uns…

matlab表达式部分项求和,matlab如何得到符号表达式中某一部分项的系数

matlab如何得到符号表达式中某一部分项的系数mip版 关注:238 答案:2 悬赏:0解决时间 2021-01-19 05:05已解决2021-01-18 14:17syms t1 t2 t3;y4*sin(t1)*cos(t2)cos(t1)sin(t1)*sin(t2)5*sin(t1)*cos(t2)*sin(t3);如何得到sin(t1)*cos(t2)的系数表达式(45*sin(t3))&#xff…

bizhubc226说明书_让打印文件不再单调 柯尼卡美能达 bizhub C226为你服务

柯尼卡美能达作为一个复合机品牌&#xff0c;除了在黑白复合机上有很大的市场&#xff0c;在彩色数码多功能复合机上也有很大的优势。这款柯尼卡美能达 bizhub C226 A3彩色数码多功能复合机可以说是彩色复合机的代表&#xff0c;在性能和打印质量方面都很不错&#xff0c;并且售…

log4net在WinForm和ASP.net下的设置

下载log4net.dll&#xff0c;放到bin目录下&#xff0c;然后引用到工程。下面说明配置和调用方法。 1、AssemblyInfo.cs末尾添加  [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension "config", Watch true)] 2、App.config&#xff08;WinForm&…

A20 GPIO

1. A20的bsp给应用程序封装了gpio接口&#xff0c;其源码在bsp的位置如下&#xff1a; frameworks/base/core/java/android/os/Gpio.java frameworks/base/core/jni/android_os_Gpio.cpp 使用的时候导入javalib.jar即可 2. 下面介绍如何在驱动层操作gpio 通过搜索驱动代码&…

oracle 判断是否位汉字,js判断字符是否是汉字的两种方法小结

有时需要判断一个字符是不是汉字&#xff0c;比如在用户输入含有中英文的内容时&#xff0c;需要判断是否超过规定长度就要用到。用 Javascript 判断通常有两种方法。1、用正则表达式判断js判断字符是否是汉字.content{width:350px;overflow:hidden;border:1px solid #ddd;}fun…

git远程代码回滚_【GIT】git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚...

git branch -D br【git 删除远程分支】git push origin :br (origin 后面有空格)git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id【本地代码库回滚】&#xff1a;git reset --hard commit-id :回滚到commit-id&#xff0c;讲commit-id之后提交的commit都去除gi…

Eclipse与github整合完整版

最近朋友都推荐使用github管理自己的项目,而且免费用户可以有5个仓库,恰好我也想了解下git,借此机会学习一下.github官方指南使用独立第三方git工具来进行版本控制,并不借助于eclipse,但我觉得eclipse肯定也有插件来解决这类问题,就像subclipse一样. 安装egit egit目前应该是ec…