AI研习图书馆,发现不一样的世界
风格迁移图像风格化迁移是一个很有意思的研究领域,它可以将一张图的风格迁移到另外一张图像上,由此还诞生了Prisma和Ostagram这样的商业化产品。本文,我们将介绍谷歌大脑团队的一篇很有影响力的论文: Exploring the structure of a real-time, arbitrary neural artistic stylization network,该论文提出了一种任意内容、任意风格的图像风格化迁移算法。大佬已经将算法demo整合进了aizoo.com,欢迎进入网址在线体验。
在深度学习引进图像风格迁移之前,图像风格化一般称作图像纹理合成或者图像纹理迁移。在2015年,Leon Gatys等学者开始将深度学习引入到图像风格合成领域,从那时起,图像风格化迁移这个名字才开始用起来。从2015年到2017年,图像风格化迁移领域经过了火箭般的发展。其发展路线主要有以下三个阶段:
- 单内容单风格模型
- 任意内容单风格模型
- 任意内容、任意风格模型
有意思的是,图像风格迁移领域基本是沿着这三个阶段一脉相承的发展下来的,每一代算法都有借鉴前一个阶段的算法成果。真正做到了前人的成果,后人的阶梯。
虽然本文写作于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,更多好玩的人工智能算法,在里面等你哦。参考文献:- Image Style Transfer Using Convolutional Neural Networks
- A Learned Representation For Artistic Style
- Neural Style Transfer: A Review
- Porting Arbitrary Style Transfer to the Browser
- 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研习图书馆,发现不一样的精彩世界