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

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,一经查实,立即删除!

相关文章

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

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

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

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

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…

Eclipse与github整合完整版

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

A20 看门狗驱动

任务:板子上增加了独立的复位芯片SP706S,为了在设备死机的时候重启系统。 资源:芯片使能管脚 PH13 喂狗管脚 PI16 1. 为了省事,直接在drivers/sunxi_gpio/gpio_sw.c这个文件里加了,这里有现成的操作GPIO管脚的函…

php 5.6连接sqlserver,wamp php5.6连接sqlserver

wamp php5.6连接sqlserver2018-09-28 16:05:36首先PHP5.6并未提供链接sqlserver的扩展,需要到微软下载相应版本的PHP链接sqlserver的驱动扩展,php5.6对应的是Version 3.2 supports PHP 5.6, 5.5, and 5.4 on Windows放到php文件夹下/ext扩展文件夹里.并在php.ini中将扩展启用,我…

关于非root用户配置ssh运行环境

第一步,我们创建Linux用户: 用root用户登录 A.增加用户组命令:groupadd –g 500 hadoop //此处500是手动设置groupID Linux保留前500 ID号 ; B.增加用户命令:useradd –u 500 –g 5…

linux网络设备—mdio总线

一.结构体 struct mii_bus {const char *name; //总线名char id[MII_BUS_ID_SIZE]; //idvoid *priv; //私有数据int (*read)(struct mii_bus *bus, int phy_id, int regnum); //读方法int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val); //写方法int (*rese…

linux arp 文件,LINUX 下ARP 的查找

由于内网无法正常连接网关,远程登陆网关已无法实现。因此一切操作均在网关服务器本地进行。3.1 在服务器本地端口抓包[rootRouted-Server tmp]# tcpdump -nn -i eth1 > error.networktcpdump: listening on eth12749 packets received by filter0 packets…

Android的Recovery中font_10x10.h字库文件制作

任务是要汉化Android中的Recovery,就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历,最终汉化的时候并没有自己汉字字库,用的github上现成的,但font_10x18.h来历短暂的留存在脑子里边不如记下来,这样会…

git 新建分支并切换到该分支_Git何谓分支

在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一…

linux用户恢复正常,Linux系统用户口令安全恢复方法

Linux系统用户口令安全恢复方法2007-09-07eNet&Ciweek有许多原因可能导致用户口令的遗失,这对系统管理员而言,可能不是一个问题,只要以root账号登录,再用passwd命令更改用户口令就可以了。可是,如果丢失的是root口…

hdu 4322 最大费用流

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4322 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace s…

Linux 编译 libc log,在Android的源码中添加LOG

想在Opencore代码中添加打印信息&#xff0c;但是使用OpenCore自带的PVLOGGER&#xff0c;有一定的局限&#xff0c;因为只能在创建对象调用相应的ThreadLogon()后才能使用。所以不能实现在任何函数中添加。于是通过添加Log.h的方法来添加。首先转下别人的经验我试了下还是出先…

ubuntu修改用户名、计算机名、主目录名

今天是MPI并行程序设计这门课交作业的截止日期&#xff0c;我们寝室的张佳和刘庆的本科同学来了&#xff0c;所以他们也没有时间搞&#xff0c;我就又做一回好人吧&#xff01;帮他们搞一下&#xff01;帮他们写报告的过程中最主要的问题就是跑那个MPI的程序&#xff0c;因为我…

linux redis可视化工具,几款开源的图形化Redis客户端管理软件

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 它自带一个最小化的命令行式的数据库管理工具&#xff0c;有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理工具…

linux c 将虚拟地址转化为物理地址_面试不懂 Linux 内存管理?我用 20 张图给你讲明白...

微信搜索公众号「 后端技术学堂 」回复「1024」获取50本计算机电子书&#xff0c;回复「学习路线」获取超详细后端技术学习路线思维导图&#xff0c;文章每周持续更新&#xff0c;我们下期见&#xff01;大家好&#xff0c;我是柠檬哥。分享编程学习&#xff0c;助力程序员成长…

nginx源码分析—模块及其初始化

Content 0. 序 1. nginx有哪些模块&#xff1f; 2. nginx如何描述这些模块&#xff1f; 2.1 模块数据结构 2.1.1 ngx_module_t结构 2.1.2 ngx_command_t结构 2.2 模块类图 3. nginx如何组织这些模块&#xff1f; 3.1 全局数组ngx_modules 3.2 模块组织结构图 4. nginx的模块种类…

linux 网络相关,Linux系统管理员必备的21个网络相关监控

Linux系统管理员必备的21个网络相关监控1. ntopngntopng 是 ntop 的升级版&#xff0c;它提供了一个能通过浏览器进行网络监控的图形用户界面。它还有其他用途&#xff0c;如&#xff1a;地理定位主机&#xff0c;显示网络流量和 ip流量分布并能进行分析。2. iftopiftop 类似于…

固态硬盘 linux 文件系统,SSD是否需要使用特别的文件系统?

用认真的态度与专业的情怀倾注于存储&#xff0c;欢迎关注我&#xff0c;与我交流哦&#xff01;我们常用的电脑系统主要是Windows和Linux&#xff0c;其中&#xff0c;Windows系统中常用的文件系统主要是FAT和NFTS&#xff0c;FAT是旧Windows和U盘用的较多&#xff0c;最新Win…