作者:元峰
来源:AIZOO
图像风格化迁移是一个很有意思的研究领域,它可以将一张图的风格迁移到另外一张图像上,由此还诞生了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模型作为风格预测网络,并将图像风格迁移网络中部分的卷积层替换为了深度可分离卷积层。从而降低了两个模型的大小。
下面我们实现的操作页面,您可以在浏览器输入aizoo.com/style-transfer.html进行体验。
我们默认使用小的模型,在图中右侧控制栏,有个“使用大模型”可选项,您可以选择大模型,大模型更‘鲜艳“一些。不过40多M的模型下载可能需要几秒钟,而且运算量也要大很多,所以相比小模型,速度会慢很多。
最后,说一下学习风格化算法和这篇论文的感悟。
因为我之前并没有深入研究过图像风格话算法,但我为了介绍这个可以跑在浏览器里的算法,仔细看了这篇文章,读了几篇其他作者写的综述性介绍文章,又阅读了几篇该论文里面提到的部分参考文献,最重要的,是看了源码,才把一些很难想通的点看明白了。所以,开始一个新的研究方向,或许以下三点是入门的一个很好的点:
1)阅读综述性的论文和博客,找出文中重点提到的经典论文;
2)阅读该方向经典的论文,以及经典论文所参考的部分高被引文献;
3)阅读部分经典论文的开源代码;
其中,阅读代码可能是理解一篇论文最重要的,就像目标检测中的SSD或者Yolo论文,如果看论文,或许有很多点是看不很明白的,只有看代码,或者真正自己通过写代码实现这个算法,才能彻底搞懂它。
最后,欢迎关注我们的公众号AIZOO,如果您想体验跑在您浏览器的图像风格化算法,敬请访问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.or...
相关文章
- Pytorch中交叉熵Loss趣解
- 如何在浏览器运行深度神经网络?以人脸口罩识别为例进行讲解
- 人脸口罩检测现开源PyTorch、TensorFlow、MXNet等五大主流深度学习框架模型和代码,及框架相互转换方法
关于作者
我是元峰,互联网+AI领域的创业者,欢迎在微信搜索“AIZOO”关注我们的公众号AIZOO。
如果您是有算法需求,例如目标检测、人脸识别、缺陷检测、行人检测的算法需求,欢迎添加我们的微信号AIZOOTech与我们交流,我们团队是一群算法工程师的创业团队,会以高效、稳定、高性价比的产品满足您的需求。
如果您是算法或者开发工程师,也可以添加我们的微信号AIXZOOTech,请备注学校or公司名称-研究方向-昵称,例如“西电-图像算法-元峰”,元峰会拉您进我们的算法交流群,一起交流算法和开发的知识,以及对接项目。
关注元峰微信号“AIZOOTech”
更多算法模型相关请关注AIZOO专栏