图像风格迁移
图像风格迁移
1. 背景提出
图像风格迁移指的是通过某种方法, 把图像从原风格转换到另外一个风格, 同时保证图像内容没有变化。
假设没有现在的方法,让我来做的话,我可能会从两种思路下手:
- 将两幅图像叠加;这是最简洁且看上去效果还有点相似的方法,但是它个很大的问题是,图像风格改变的同时原图像的内容也改变了,并不符合图像风格迁移的定义;
- 先分析给定风格的图像,统计其像素分布的数学性质,建立数学模型,再分析要做迁移的图像,使其贴合特定的模型;这看上去可行,但是每换一种风格,就要换一种模型,并不具有应用意义;
2. 实现原理
从图像风格迁移的定义中,我们知道,风格迁移后的图像,其内容应尽量接近原图像,而风格应尽量接近风格图像。因此,作者认为可以将源图像分为风格图像和内容图像,利用卷积神经网络分别提取各自的特征。风格图像在网络中提取出风格特征,内容图像在网络中提取出内容特征,然后引入初始白噪声图像,该噪声图像在网络中训练得出特征,为内容和风格各自定义一组与噪声特征的损失函数,最后将两个损失函数合在一起进行优化,从而使得噪声图像越来越好的训练到内容和风格的特征,从而完成风格的迁移。其中使用的卷积神经网络是VGG19。
2.1 内容特征表示
其中p表示内容图像,x表示生成图像,l表示计算内容特征的层数, Fij、Pij各自表示生成图经过某一层卷积层得到的特征图、内容图经过卷积层生成的特征图。把它们两个作差并平方求和,使生成图的特征图越接近于内容图的特征图,这样就可以保留内容信息。一般来说,可选择比较浅的层数但别选第一层得到的特征图,因为这样会过于保留内容导致风格信息无法融入到特征图中。一般也只是选择两到三层作为内容损失函数
2.2 风格特征表示
之前已经有人论证过,图像经过卷积层后得到的特征图的协方差矩阵可以很好地表征图像的纹理特征,但是会损失位置信息。不过在风格迁移的任务中,我们可以忽略位置信息损失这个缺点,只需要找到一个方法可以表征图像的纹理信息,并把它这些纹理信息迁移到需要被风格迁移的图像中,完成风格迁移的任务;而现在,利用协方差矩阵可以得到纹理信息,我们就可以完成风格迁移。
协方差是一个二阶的统计信息,现在使用Gram matrix来代替协方差矩阵
格拉姆矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量,因此,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。因此,将风格损失函数定义如下,其中Gij和Aij均依照Gram计算公式
分母上是一个归一化项,目的是防止风格损失的数量级相比内容损失过大。在实际应用中,常利用多层而非一层的风格损失,多层的风格损失是单层风格损失的加权累加。
2.3 损失函数定义
-
其中α和β分别代表内容和风格损失的权重,其和为1。如果需要在合成图像中突出内容图像,则给予α较大权值;如果需要突出风格图像,则给予β较大权值。换种表达,α/β越大,合成的图片越具体,越小合成的图片风格化越严重(抽象)
-
卷积层中不同层次的feature map会提取出不同的特征,因此其对合成图片会产生不同的影响。在风格特征的提取中,层次越高的feature map保持局部图像结构的规模越来越大,从而实现的更加平滑、连续;在内容特征的提取中,层次越低的feature map保留的内容越详细。
3. 实现细节
与之前训练神经网络更新权重不同,在这里,我们是固定参数,更新输入的底图(或者叫生成图,也就是我们最后要得到的图片)。其算法步骤应为:
1)初始化一个高斯白噪声的图片作为生成图(大小和内容图一致);
2)将内容图、风格图、生成图都经过VGG网络,生成特征图;
3)计算内容损失和风格损失,按照一定比例计算最终的loss
4)梯度下降使loss最小,以此来更新生成图像
代码解读参见图像风格迁移原始论文实现细节
4. 后续发展
原始的风格迁移的速度是非常慢的,其时间甚至会随着图片尺寸的增大而迅速增大。这其中的原因在于,在原始的风格迁移过程中,把生成图片的过程当做一个“训练”的过程。每生成一张图片,都相当于要训练一次模型,这中间可能会迭代几百几千次。所以,后面又提出了一种快速风格迁移。其核心思想主要是将风格迁移的训练和应用分离,不使用优化的方法来逐步迭代生成迁移后的图片,而是使用一个神经网络直接生成迁移后的图片。
快速风格迁移的网络结构包含两个部分。一个是“生成网络”(Transformation Network),一个是“损失网络”(Loss Network)。生成网络接收一个图片当做输入,然后输出也是一张图片(即风格迁移后的结果)。如下图,左侧是生成网络,右侧为损失网络:
- 训练阶段:首先选定一张风格图片。训练的目标是让生成网络可以有效生成图片。目标由损失网络定义。损失网络实际上是VGGNet,这与原始的风格迁移是一致的。利用损失网络来定义内容损失、风格损失。这个损失用来训练图像生成网络。
- 执行阶段:给定一张图片,将其输入生成网络,输出这张图片风格迁移后的结果。由于生成图像只需要在生成网络中计算一遍,所以速度比原始图像风格迁移快很多。
5. 其他领域发展
- 文本风格迁移:其主要思路也是将语言的风格和内容分离开,进行语言的分析和表征,通过训练一定的数据集,让计算机能实现将源风格的句子转换为另一种风格特征的句子,但是由于中文文本的歧义性、需要进行分词的特点,再加上缺少足够的训练数据,使得这一进展比较缓慢;另外,文本中的情感分析、句子的平滑度、辞藻等都给这一工作带来了很大的阻碍,目前的一些方法执行得并不太理想。
相关的算法、论文可参见[文本风格迁移总结] - 音频风格迁移:语音的风格迁移,是指将某一说话者的音色、副语言(情绪及语调)等特点赋予到合成的语音中。虽然我们在图像风格迁移上取得了很大的成功,但是在音频领域却表现不佳,这主要是因为语音所具有的信息,难以编码到高维隐空间。一段语音时间序列中,混杂着以下方面的信息:说话人特征(如一个人的音色,音调等);语言学内容(语音表述的内容);副语言特征(如情感等)。
相关的算法和进展可参见 [语音风格迁移]