Neural Style Transfer Review I

Neural Style Transfer Review I

概述

在众多图像风格迁移算法中,图像被看作内容和风格的结合。图像风格迁移算法也可以看成是图像重建算法和纹理建模算法的结合。

纹理建模

  • 纹理的定义:只有比较抽象的定义,包含任意模式的图像(image containing arbitrary patterns);
  • 纹理建模的定义:生成纹理的一种方式(同样是抽象定义);
  • 纹理建模的目标:给定一个纹理样例,生成一幅新的图像使得观察到新图像的纹理特征与样例相似。

常用的方法主要有:

  • 基于统计分布的参数化纹理建模方法:将纹理建模为 N 阶统计量;
  • 基于 MRF 的非参数化纹理建模方法:用 patch 相似度匹配进行逐点合成。
  • e.g.

纹理建模的主要任务是研究如何表示图像的纹理特征,在图像风格转换中,主要用于对风格的建模和提取。

图像重建

图像重建的主要目的是利用输入的图像特征尽可能对图像进行还原。这和传统的图像特征提取其实属于相反的过程,在 CNN 中,我们也经常根据某个卷积层的特征对图像进行重建,以了解该卷积层的作用(根据图像的哪一部分建立特征)。在图像风格转换领域中,图像重建主要用于对图像内容的建模和提取。

常用的算法也可以分为两类:

  • 基于在线图像优化的慢速图像重建方法:即给定输入图片,建立 Loss,并使用梯度下降对 Loss 进行优化,最终得到输出图片,优点是效果不错,但缺点同样明显,那就是速度太慢,实时性不够;o
  • 基于离线模型优化的快速图像重建方法:即训练好一个网络,对于给定输入只需一次前向传播即可得到输出图片。优点是实时性较好,缺点是有可能不如慢速方法精细。

所以上述的方法相结合我们就可以得到 5 大类图像风格迁移算法:

  • 基于在线图像优化的慢速图像重建方法:
    • 基于统计分布的参数化纹理建模方法;
    • 基于 MRF 的非参数化纹理建模方法;
  • 基于离线模型优化的快速图像重建方法:
    • Per-style-per-model;
    • Multiple-style-per-model;
    • Arbitrary-style-per-model.

慢速图像重建

基于统计分布的参数化纹理建模方法

Image Style Transfer Using Convolutional Neural Networks

风格迁移领域开山之作,使用预训练的 VGG-19 作为特征提取器。

  • 内容表达:在第 $l$ 个卷积层,输出图像 $\vec{x}$ 和内容图像 $\vec{p}$ 的损失函数为 $\mathcal{L}_{\text {content }}(\vec{p}, \vec{x}) = \sum_{l} \mathcal{L}_{\text {content }}(\vec{p}, \vec{x}, l)=\frac{1}{2} \sum_{l} \sum_{i, j}\left(F_{i j}^{l}-P_{i j}^{l}\right)^{2}$,这里 $F_{i j}^{l}, P_{i j}^{l} \in \mathcal{R}^{N_{channels}\times(N_{height*width})}$;
  • 风格表达:在第 $l$ 个卷积层中,不同卷积核之间的 Gram 矩阵 $G_{i j}^{l}=\sum_{k} F_{i k}^{l} F_{j k}^{l}$ 可以用来表达图像风格。第 $l$ 层的风格损失为 $E_{l}=\frac{1}{4 N_{l}^{2} M_{l}^{2}} \sum_{i, j}\left(G_{i j}^{l}-A_{i j}^{l}\right)^{2}$,这里 $A^l$ 为风格图片的 style represention,$G^l$ 为待生成图片的 style represention。所有的 style loss 为 $\mathcal{L}_{\text {style }}(\vec{a}, \vec{x})=\sum_{l=0}^{L} w_{l} E_{l}$ 其中 $w_{l}$ 是对不同层的一个加权。
  • 总损失函数为:$\mathcal{L}_{\text {total }}(\vec{p}, \vec{a}, \vec{x})=\alpha \mathcal{L}_{\text {content }}(\vec{p}, \vec{x})+\beta \mathcal{L}_{\text {style }}(\vec{a}, \vec{x})$,其中 $\alpha, \beta$ 为风格和内容的权重系数。

使用 Gram Matrix 结合多层卷积层构建 style loss是其成功之处,这使得迁移后的风格特征更加平滑。至于 Gram Matrix 为什么可以用来表达特征,实际上它是同一层不同 feature 之间的偏心协方差矩阵,它衡量不同 feature 之间的相关性,哪些共同出现,哪些相互影响较小。其实是根据图片的卷积响应建模了一个二阶统计量,这也对应基于统计分布的建模。点乘是计算相关性的一种很好的方式,这点从 attention 的应用也可以得到体现。

style transfer 当中,什么是风格,存在自己特性的才叫做风格。因此如何去度量这个自己的特性勒,自己的特点越突出,别人的越不突出最好。这样我们知道:当同一个维度上面的值相乘的时候原来越小酒变得更小,原来越大就变得越大;二不同维度上的关系也在相乘的表达当中表示出来 :

存在的一些问题:

  • 速度很慢,实时性很差,对应用场景有限制;
  • 对于艺术风格的迁移看上去没有太大问题,对于风格图片也是真实场景(具有连续对称结构)的迁移,在捕捉图片的连续结构方面有缺陷,出现很多噪声,图片细节也有较多丢失,作者觉得可以适应滤波器等方法对生成的图片进一步进行降噪处理;
  • 没有考虑笔触的变化(单一油画风格,没办法一部分细致一些一部分粗糙一些);
  • 图像深层语义还是捕获有欠缺;
  • 其实问题的难点还是在于如何定义风格,以及有没有可能在完全不传递内容的情况下传递风格。

INCORPORATING LONG-RANGE CONSISTENCY IN CNN-BASED TEXTURE GENERATION

实际上是对上面的一些改进,为了捕捉到更多图片的连续信息,style loss 不是每个点和其对应位置点乘,而变成每个位置和图像进行一个位置变换之后的像素进行点乘,例如 $(i, j)$ 和 $(i, j+\delta)$ 或者 $(i, j)$ 和 $(i+\delta, j)$ 点乘,这样可以捕获到具有一定间隔的图像连续特征。

一定程度上解决了图片连续信息缺失的问题,但可以看出在一些应用场景中还是不尽人意,例如 season transfer 中,图像的像素位置信息出现了较大偏差,导致观感不太好。

Demystifying Neural Style Transfer

这篇文章从 Domain Adaptation (属于迁移学习)的角度分析风格转换。一般的机器学习方法都是假设训练数据和测试数据属于相同的分布,而 Domain Adaptation 是假设训练数据和测试数据的分布不同,我们试图根据测试数据集训练出来可以预测(符合、逼近)测试数据集分布的模型。

Domain Adaptation 中一种常用的训练方法是最小化 MMD (Maximum Mean Discrepancy),这是衡量两种不同分布差异的一个统计值,只有当两个分布 $p=q$ 时,MMD 为 0。假设训练集和测试集分别为 $X=\left\{\mathbf{x}_{i}\right\}_{i=1}^{n},Y=\left\{\mathbf{y}_{i}\right\}_{i=1}^{n}$,其中 $x, y$ 是由分布 $p,q$ 生成的。MMD 定义如下:

我们进一步限制 $f$ 可能的取值空间,选取 $f$ 只能取 Reproducing Kernel Hilbert Space 单位球中的某点作为约束,进一步推导:

其中 $\phi \in \mathcal{X} \rightarrow \mathcal{H}$,定义 Kernel Function $k(\mathbf{x}, \mathbf{y}) = \langle\phi(\mathbf{x}), \phi(\mathbf{y})\rangle$,于是有:

$k(\mathbf{x}, \mathbf{y})$ 是 kernel function。(PS:这部分理论推导没有完全看懂,需要再学习一下。)

关于 Kernel Function

Kernel function 是在机器学习中常用的一种技巧,本质上是用线性的方法去解决非线性的问题。

参考文献,kernel 的定义为 $K(x, y)=\langle\phi(x), \phi(y)\rangle$,$\phi$ 是低维向高维的映射,kernel function 为两者的点乘。其实也可以理解为,通过 $\phi$ 在更高维的角度看问题,可以在使用 kernel function 在高维衡量两者的相似性。

文章给出了由 Gram Matrix 建立的 style loss 可以 work 的理论依据,回忆 style loss 的表达式 $\mathcal{L}_{\text {style}}^{l}=\frac{1}{4 N_{l}^{2} M_{l}^{2}} \sum_{i=1}^{N_{l}} \sum_{j=1}^{N_{l}}\left(G_{i j}^{l}-A_{i j}^{l}\right)^{2}$,其中 $G_{i j}^{l}=\sum_{k=1}^{M_{l}} F_{i k}^{l} F_{j k}^{l}$。取二阶多项式 kernel $k(\mathbf{x}, \mathbf{y})=\left(\mathbf{x}^{T} \mathbf{y}\right)^{2}$,那么 style loss 可以写为:

其中 $\mathbf{f}_{. k}^{l}$ 和 $\mathbf{s}_{. k}^{l}$ 是 $\mathbf{F}^{l}$ 和 $\mathbf{S}^{l}$ 的第 k 列。

这个发现证明了 style 可以通过不同卷积层的特征分布来建模,并且 style transfer 可以看作拟合 style image 的特征分布的过程。

文章提出类似可以使用不同的 kernel function 来建模损失函数:

kernel function 可以取 linear kernel, polynomial kernel 和 gauss kernel 等,均取得很好的效果。

作者还提出在 Batch Normalization layer 也包含不同 domain 特征,可以通过 BN 层的统计特征进行 style 建模:

均取得不错的效果。

这种 Gram-based style transfer algorithm 具有不稳定性,因为有研究发现即使两张图片的均值和方差差异很大,也有可能具有相似的 Gram Matrix,所以有人提出加入直方图损失,使输出图片的像素灰度值分布尽可能接近风格图片,但这样做的计算复杂度很高。另外,针对这类算法抽取特征都是在 CNN feature space 会不可避免导致细节缺失的问题,有人提出加入 Laplacian Loss,即内容图片和输出图片都经过拉普拉斯算子卷积(常用的边缘检测的手段)之后的欧几里得距离,这样可以保留更多的细节,效果也不错。但该类算法本质的问题并没有得到完全解决。

基于 MRF 的非参数化纹理建模方法

这类方法的主要想法:使用统计量进行纹理建模大多只考虑两张图片像素级别的关联,容易丢失一些空间分布特征,而使用基于 MRF 的 patch 匹配可以更好地保留图像的空间分布信息,使生成的图像更自然。

Combining Markov Random Fields and Convolutional Neural Networks for Image Synthesis

基于 MRF:一个像素的取值分布和其周围的 $k\times k$ 个像素相关

主要想法是希望输出图片的 CNN 高层次 encoding 尽可能接近内容图片,但 local patch 和风格图片的相似度更高,以保留风格图片的连续特征

输入:style image, content image.

损失函数:

其中:

其中 style loss 的 matching 可以通过一个卷积层实现。

分析:高层次上的 matching 更能把握内容的一致性,在高层次上的融合效果更好(相比像素级别)。

缺陷:

  • 在建筑物等透视结构差异较大的风格转换时,会引入 style image 的内容导致 content image 中的内容被替换,只适用于允许结构发生形变的场景,应用场景存在局限。
  • e.g.

Arbitrary Style Transfer with Deep Feature Reshuffle

Gu et al. 2018 CVPR

主要想法是将基于统计量的风格转换和基于 patch 匹配的方法结合在一起,使风格能够具有高层的语义和底层的平滑性。

研究人员提出了基于 feature reshuffle 的方法,即希望输出图像 feature 中的某个 patch $F_o(p)$ 是由风格图片 feature 对应的 patch 打乱之后 $F_{s}(SF(p))$ 得到。

这样代入到 gram-loss 和 MRF-loss (patch size = 1) 中都会发现 loss 为 0,作者认为这样能够说明这种方法可以充分融合全局和局部的风格。

损失函数:

其中 $NNC$ 是在基于匹配的基础上,希望 style image 中的每个 patch 尽量只出现一次(因为 shuffle 本身就是每个只出现一次,这里做了一些宽松处理)。$\Gamma(p)$ 是 p 为中心的 patch 使用的次数。

训练是在 feature 空间进行,之后使用 VGG-Decoder 进行解码,输出图像的 feature 为内容和风格的线性组合 $F_{o}^{l,(i)}=\alpha F_{c}^{l}+(1-\alpha) F_{s}^{l}\left(\mathrm{NNC}^{l,(i)}\right)$。训练的过程是在多个层次上依次进行的,第 $l$ 层的输出 decode 为 $F_o^{l-1}$ 之后,第 $l-1$ 层的内容图片重写为 $F_{c}^{l-1} \leftarrow \beta \hat{F_o}^{l-1}+(1-\beta)F_c^{l-1}$ 这样能将不同层次之间的信息结合在一起。

但从效果来看,feature 层面进行 patch 交换不可避免地会引入 style image 中的内容信息。

参考文献

[1] 如何用简单易懂的例子解释格拉姆矩阵/Gram matrix?

[2] 图像风格化算法综述三部曲

[3] Neural Style Transfer: A Review

[4] Kernel Functions

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 Bowen
  • Powered by Hexo Theme Ayer

请我喝杯咖啡吧~

支付宝
微信