点击蓝字关注我们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千个风格图,就要训练一千个模型,这样存储、调用起来仍旧不方便。





| 模型名称 | 模型大小(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研习图书馆,发现不一样的精彩世界
