改进神经风格迁移

1,809 阅读6分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

改进风格迁移

神经风格迁移一经提出,便引起了业界的巨大兴趣,但随之人们也意识到了原始神经风格迁移的一些缺点。局限之一是风格迁移会获取所有风格信息,包括整个风格图像的颜色和笔触,并将其转移到整个内容图像。例如在TensorFlow2实现神经风格迁移中,样式图像中的蓝色被转移到树木中,但是有时我们希望可以选择只转移笔触而不转移颜色,而且只转移到特定区域,以进行更加精细的控制。

神经风格迁移的团队开发了一种新算法来解决这些问题。下图显示了算法可以提供的控制以及结果示例:

风格迁移示例

神经风格迁移的团队提出的控制措施如下:

  1. 空间控制:控制内容和风格图像中风格迁移的空间位置。这是通过在计算Gram矩阵之前将空间蒙版应用于风格特征来完成的。
  2. 颜色控制:可用于保留内容图像的颜色。为此,我们将RGB格式转换为色彩空间,如HCL,以将亮度与其他色彩通道分开。然后,我们仅在亮度通道中执行风格迁移,然后将其与原始风格图像中的颜色通道合并,以生成最终的风格化图像。
  3. 程度控制:管理画笔笔触的粒度。该过程涉及更多的过程,因为它需要多次运行风格迁移并选择不同层次的风格特征,以便计算Gram矩阵。

改进风格迁移的两个主要主题——提高速度、改善风格迁移,让我们仔细研究经典算法的一些变体,以为我们将要实施的下一个项目——实时任意样式转换,奠定基础。

通过前馈网络进行更快速地风格迁移

神经风格迁移基于类似于神经网络训练的优化,因此即使使用GPU,速度也很慢,通常需要花几分钟的时间才能得到风格迁移结果。这限制了其在移动设备上的应用,因此开发更快的风格迁移算法就有了实际的需求,前馈风格迁移应运而生。下图显示了采用这种架构的首批网络之一:

前馈网络架构

该体系结构实际上比上图的架构图看起来更简单。此体系结构中有两个网络:

  1. 可训练的卷积网络(通常称为风格迁移网络),用于将输入图像转换为风格化图像。可以将其实现为类似于 U-NetVAE 的类似编码器/解码器的体系结构。
  2. 固定的卷积网络,通常是预训练的 VGG ,用于测量内容和风格损失。

类似于原始的神经风格迁移,首先使用 VGG 提取内容和风格目标,但是使用此架构将不再训练输入图像,而是训练卷积网络将内容图像转换为风格化图像。通过 VGG 提取风格化图像的内容和风格特征,计算损失并将其反向传播到可训练的卷积网络。我们可以像训练其他 CNN 一样训练它。在推理阶段中,我们只需要执行一次前向计算就可以将输入图像转换为风格化图像!

虽然使用此种网络,速度问题得到了解决,但是仍然存在问题——这样的网络只能学习一种风格来进行迁移。需要为我们要执行的每种风格训练一个网络,这要比原始神经风格迁移的灵活性低得多。

控制迁移的风格特征

原始的神经风格迁移论文没有解释为什么Gram矩阵可以用于有效提取风格特征。风格迁移的许多后续改进(例如前馈样风格迁移)仍然延续使用了 Gram 矩阵作为风格特征方式。论文 Demystifying Neural Style Transfer 改变了这一点,其发现风格信息本质上由 CNN 中的激活分布表示,匹配激活 Gram 矩阵等效于最小化激活分布的最大平均差异( maximum mean discrepancy, MMD )。因此,我们可以通过将图像的激活分布与风格图像的激活分布进行匹配来执行风格迁移。

因此,Gram 矩阵不是实现风格迁移的唯一方法。我们也可以使用对抗损失,诸如 pix2pix 之类的 GAN 可以通过将生成图像的像素分布与真实图像进行匹配来执行风格迁移。不同之处在于,GAN 试图将像素分布的差异降到最低,而风格迁移会将其应用于网络层激活的分布。

后来,研究人员发现我们可以仅使用激活的均值和方差来表示风格。换句话说,如果我们将两个风格相似的图像输入到 VGG 中,则它们的网络层激活将具有相似的均值和方差。因此,我们可以通过最小化生成的图像和风格图像之间的激活均值和方差的差异来训练网络以执行风格迁移。这催生了使用归一化层控制风格的方法。

使用规范化层控制风格

控制激活统计信息的一种简单而有效的方法是通过在归一化层中更改 γγββ 。换句话说,我们可以通过使用不同的仿射变换参数( γγββ )来改变风格,批规范化和实例规范化处理时使用相同的方程式:

BN(x)=IN(x)=γ(xμ(x)σ(x))+βBN(x) = IN(x) = \gamma (\frac {x-\mu(x)}{\sigma(x)}) + \beta

不同之处在于,批规范化( batch normalization, BN )计算了 (N, H, W) 维度上的均值 µµ 和标准差 σσ ,而实例规范化( instance normalization, IN )仅根据 (H, W) 进行了计算。

但是,每个规范化层只有一个 γγββ 对,这限制了网络只能学习一种样式。那么,我们如何使网络学习多种风格?可以使用多组 γγββ 系数,其中每组学习一个样式。这正是条件实例规范化( conditional instance normalization, CIN )提出的初衷。

它建立在实例规范化的基础上,但是具有多组 γγββ 对。每个不同的 γγββ 值对都用于训练特定的风格;换句话说,它们以风格图像为条件。条件实例规范化的方程式如下:

CIN(x;s)=γS(xμ(x)σ(x))+βSCIN(x;s) = \gamma^S (\frac {x-\mu(x)}{\sigma(x)}) + \beta^S

假设我们有 S 个不同的风格图像,然后在每种风格的规范化层中都有 SγγSββ。除了内容图像外,我们还将独热编码的样式标签输入风格迁移网络。实际上, γγββ 被实现为形状为 (S×C) 的矩阵。我们通过执行独热编码标签 (1×S) 与矩阵 (S×C) 的矩阵相乘以获取每个风格 (1×C) 通道的 γSγ^SβSβ^S ,来检索该风格的 γγββ

接下来,我们就可以将风格编码到 γγββ 的嵌入空间中,然后通过内插 γγββ 来执行风格插值:

风格迁移示例

虽然上述变体都取得了一些优异的进展,但是网络仍然限于训练中使用的固定N种风格。在接下来系列博文中,我们将学习并实施允许任意样式的改进!

系列链接

TensorFlow2实现神经风格迁移