目录
- 整体思路
- 原理理解
- 实际操作
2015年,Gatys等人发表了文章《A Neural Algorithm of Artistic Style》,首次使用深度学习进行艺术画风格学习。为普通照片 "赋予" 名画风格。犹如两个不同物体的灵魂和肉体的重组。本文将基于这篇论文和一些大佬的文章说下我的拙见。
一、整体思路
艺术风格转换的主要目的是将一张参考图片的风格应用到另一张原始图片上,最后的生成图片能既保留原始图片的大体内容,又展现出参考图片的风格(style) 。这里得风格 指狭义上一张图片的纹理、色彩、视觉模式等等,比如纹理有个特点是和所在位置无关,基于这个特点,只要是和位置无关的统计信息,都可以试着来表示纹理的特征。而内容 (content) 则指的是图片的宏观构造。
大致的流程是:输入为白噪声图像, 通过不断修正输入图像的像素值来优化损失函数,最终得到的图像即输出结果
说明
内容图:普通图片,需要进行风格迁移得主题图片;
风格图:具有风格的图片,一般用名画或者纹理的图片;
白噪声图:生成图的初始化图片
VGG:预训练模型,即别人已经训练好的模型
步骤
- 生成目标图片:先将内容图和风格图输入"喂给"VGG,然后生成目标内容图和目标风格图(仅一次输入),用作后面Loss的计算。
- 初始化合成图片:这里内容图上添加白噪声的方式来初始化合成图,我们将白噪声图片"喂给"VGG,就得到了合成图片。
- 载入预训练模型:Content信息捕捉,得到content loss,Style信息捕捉,得到style loss
- 计算总Loss值:这里我们分别采用内容损失+风格损失得出总的loss,两者配置一定权值
- 优化函数:这里优化函数采用AdamOptimizer
- 训练模型
二、原理理解
卷积操作(convolution)是一个有效的局部特征抽取操作。深度学习之所以能"深",原因之一便是前面的卷积层用少量的参数完成了高效的特征萃取。作为imagenet 13年的冠军,vgg模型的特征提取能力毋庸置疑。原版 Style Transfer 算法的第一步便是将风格图(Style)和内容图(Content)图输入vgg网络,并将conv1~conv5的结果分别保存下来。效果如下图,可以看到越后面的结果越抽象。
上图也可以看出:网络不同层次描述了图像不同层次的信息:低层次描述小范围的边角、曲线,中层次描述方块、螺旋,高层次描述内容。
有了不同层次的抽象特征后,下一步是糅合。对于生成的图片,我们希望它"骨架"接近内容图(content),"画风"接近接近风格图(style),具体如下:
2.1 总体loss定义:
上式的意思是我们希望参考图片与生成图片的风格越接近越好,同时原始图片与生成图片的内容也越接近越好,这样总体损失函数越小则最终的结果越好。原文中的函数表达式如下:
其中的内容和风格具体情况请看下面:
2.2 内容的损失Content Loss
图片的内容主要指其宏观架构和轮廓,而卷积神经网络的层数越深则越能提取图片中全局、抽象的信息,因而论文中使用卷积神经网络中高层激活函数的输出来定义图片的内容,那么衡量目标图片和生成图片内容差异的指标就是其欧氏距离 (即 contentlosscontentloss ):
其中,等式左侧表示在第l层中,原始图像(P)和生存图像(F)的举例,右侧是对应的最小二乘法表达式。Fij表示生存图像第 i 个feature map 的第 j 个输出值。
最小二乘法使用求导得出最小值,让在改l层上生存的图片F逼近改层的原始图片P。
2.3 风格损失 Style Loss
"风格" 本来就是个比较虚的东西,没有固定的表示方法,论文中采用的是同一隐藏层中同 feature map 之间的 Gram 矩阵来表示风格,因而又称为 "风格矩阵" 。也是其算法核心所在,正是因为这个矩阵很好的模拟texture,训练出的效果才如此优秀。若想深入了解这块,推荐读 Naiyan Wang 的 [1701.01036] Demystifying Neural Style Transfer 。这里简单描述一下G矩阵:
其中左侧Gl代表第l层响应图对应的Gram矩阵,Fij代表该层第i个卷积核对应的响应图(通常是二位的)的第K各元素。所以Gram矩阵的每一个元素就是求了个内积,把两个响应图之间,和位置无关的一种相关性给求了出来,故能体现风格特征。
接下来的套路就和上一小节一样了,把每层Gram矩阵作为特征,让重建图像的Gram矩阵尽量接近原图的Gram矩阵,也是个优化问题:
同样是使用最小二乘方式,但是前面带上系数,其中E表示该层的一个损失;N*N是G矩阵的大小,M*M是生存G矩阵的F矩阵大小,故都要作为分母。G表示生成,A表示风格图像在该层的矩阵。
同样的,也是根据梯度下降的方式来优化目标。
根据之前的表达式,对每层进行加权求值。得到风格的总体损失。
当然论文中还对这些超参数做了调整,并比较了各个不同超参数生成出来的效果进行了比较。
三、实际操作
过程中,可以分成以下几步:
A. 图像预处理(内容图、画风图)、生成图占位符定义
B. 预训练模型加载
C. 三张图跑网络
D. 内容损失计算
E.格拉姆矩阵计算
F. 风格损失计算
G. 损失和梯度汇总
H. 设置迭代计算图
I.选择生成图优化方法
J. 开始迭代