【风格迁移】入门

三种风格迁移方式


一、固定风格固定内容的普通风格迁移:

最原始的风格迁移的思路很简单,把图片当做可以训练的变量,通过优化图片来降低与内容图片的内容差异以及降低与风格图片的风格差异,迭代训练多次以后,生成的图片就会与内容图片的内容一致,同时也会与风格图片的风格一致。

从以下几个方面介绍:(1)VGG16;(2)内容;(3)风格;(4)噪声损失

(1)VGG16

我们首先使用预训练的 VGG16 模型对图像提取有用特征,这些特征可以帮助我们衡量两个图像的内容差异和风格差异。

(2)内容

我们进行风格迁移的时候,必须保证生成的图像与内容图像的内容一致性,不然风格迁移就变成艺术创作了。那么如何衡量两张图片的内容差异呢?很简单,通过 VGG16 输出的特征图来衡量图片的内容差异。

内容损失函数 (loss_{content})

其中 (hat{y}) 是输入图像(也就是生成的图像),(y) 是内容图像,(phi) 代表VGG16,(j) 代表第 (j) 层。

通过优化生成图像和内容图像特征图的 MSE,可以迫使生成图像的内容与内容图像在 VGG16 的特征提取层上输出相似的结果,因此生成图像和内容图像在内容上是一致的。

(3)风格

把输出变换成 (c)(hw) 列的矩阵 (X),可以将其看作由 (c) 个长度为 (hw) 的向量 (x_1, ...,x_c) 组成,其中向量 (x_i) 代表通道 (i) 上的样式特征。这些向量的格拉姆矩阵(Gram Matrix)为 (XX^T) ,因此格拉姆矩阵的高宽皆为通道数 (c) 。第 (i)(j) 列的元素 (x_{i,j}) 代表向量 (x_i) 与向量 (x_j) 的内积,表达通道 (i) 和通道 (j) 上样式特征的相关性。我们用不同通道间的相关性表达图像的样式。当 (hw) 的值较大时,格拉姆矩阵中的元素容易出现较大的值,为了让样式损失的值不受这些值的影响,可以将格拉姆矩阵除以矩阵中元素的个数,即 (chw)

风格损失函数 (loss_{style})

其中 (G_j^{phi}(x)) 指的是 (x) 图像的第 (j) 层特征图对应的 Gram 矩阵。

(4)噪声损失

学习的合成图像可能具有许多高频噪声,我们可以使用总变差损失进行降噪,即平滑图像:

[sum_{i, j}|x_{i, j}- x_{i+1, j}|+|x_{i, j}- x_{i, j+1}| ]

将图像水平和垂直平移一个像素,与原图相减,然后计算绝对值的和。

二、固定风格任意内容的快速风格迁移:

先搭建一个转换网络,然后通过优化转换网络的权值来实现快速风格迁移。由于这个转换网络可以接受任意图像,所以这是任意内容的风格迁移。

模型结构:

  1. 降维,三层卷积层,逐渐提升通道数为128,并且通过 stride 把特征图的宽高缩小为原来的八分之一;
  2. 5个 ResidualBlock 堆叠;
  3. 升维,三层卷积层,逐渐降低通道数为3,并且通过 nn.Upsample 把特征图的宽高还原为原来的大小。

先降维再升维是为了减少计算量,中间的 5 个 Residual 结构可以学习如何在原图上添加少量内容,改变原图的风格。最终模型(TransformNet)由两个基础结构组成,卷积层(ConvLayer)和残差块(ResidualBlock)。

三、任意风格任意内容的极速风格迁移:

通过输入大量风格图像和内容图像 (sum_{I_c, I_s}),可以训练出能够产出期望权值的 (MetaN),该模型可以输入任意风格图像,输出第二部分中介绍的迁移模型(即转换网络),进而实现任意风格任意内容的风格迁移。


Reference:

​ [1] 风格迁移三部曲——知乎

原文地址:https://www.cnblogs.com/xxxxxxxxx/p/11807463.html