AdaIN 是一个经典的风格迁移方法,之后在 StyleGAN(v1) 中也以重要的组成模块出现。了解 AdaIN 也有助于了解其他图像生成工作。
原始论文:Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization
什么是风格?What is style?
在详细介绍 AdaIN 之前,我们需要明白什么是风格,风格迁移方法要迁移的是什么?
风格迁移领域一些经典的工作1将图像风格当作是不同图像特征之间的关系,通过修改不同图像特征之间的关系修改图像的风格。
假设1 图像风格是图像特征之间的关系。
基于以上的假设,我们介绍 AdaIN 方法。
AdaIN 方法 Method
AdaIN 方法分成三部分,编码 Encoder,AdaIN,以及解码 Decoder。第一部分编码 Encoder 使用了预训练的 VGG 网络作为编码器,提取图像的特征,值得注意的是 Encoder 不参与参数更新,模型参数固定;第二部分 AdaIN 为本文重点,旨在将内容图像特征
x
x
x 的均值
μ
(
x
)
\mu(x)
μ(x) 以及方差
σ
(
x
)
\sigma(x)
σ(x)
替换成风格图像特征
y
y
y 的均值
μ
(
y
)
\mu(y)
μ(y) 以及
σ
(
y
)
\sigma(y)
σ(y) 。第三部分解码器 Decoder 将变换之后的内容图像
x
^
\hat{x}
x^ 重新变换到图像空间获得风格迁移之后的图像。注意,与 Encoder 不同,Decoder 网络的参数需要进行梯度更新。
AdaIN 通过计算图像特征的均值以及方差来建模图像的风格,通过改变图像特征的均值以及方差来改变图像的风格。
具体的 AdaIN 计算公式如下
A d a I N ( x , y ) = σ ( y ) ( x − μ ( x ) σ ( x ) ) + μ ( y ) \mathsf{AdaIN}(x,y) = \sigma(y)\big(\frac{x-\mu(x)}{\sigma(x)}\big)+\mu(y) AdaIN(x,y)=σ(y)(σ(x)x−μ(x))+μ(y)
如果按照比较抽象的角度想,我们可以认为 x x x 与 y y y 分别位于“风格1空间”以及“风格2空间”,对 x x x 进行正则化 x − μ ( x ) σ ( x ) \frac{x-\mu(x)}{\sigma(x)} σ(x)x−μ(x) 是将 x x x 投影到内容空间中得到内容特征 C ( x ) C(x) C(x),之后将内容特征从内容空间投影到“风格2空间”中得到风格迁移之后的结果。
之后为了约束模型的训练,该工作提出了内容损失 Content loss L C \mathcal{L}_C LC 以及风格损失 Style loss L S \mathcal{L}_{S} LS。Content loss 使用编码器提取生成图像的特征,将其约束与之前变换得到的特征 A d a I N ( x , y ) \mathsf{AdaIN}(x,y) AdaIN(x,y) 一致,以此进行内容约束。而 Style loss 则根据编码器中的若干层提起的特征进行风格的度量(计算特征图的均值和方差),将生成的图像以及风格图像的特征风格进行约束,使得生成图像的风格与风格图像一致,实现风格约束。
根据上诉过程,AdaIN 方法只优化了 Decoder 的参数。
AdaIN 环境配置
在使用 AdaIN 进行风格迁移生成图像时,用到了 GitHub 上的源码:https://github.com/naoto0804/pytorch-AdaIN。
但在根据其提供的 requirements.txt 文件配置环境的时候,存在问题。里头的 numpy 版本号以及个别包的版本号不对,有的甚至为 0.0.0。emmmm
后来我直接使用了 openmmlab 的环境,直接搞定。该源码的运行环境不麻烦,基本 torch 版本对了就行。
写在这记录下。
参考 References
Texture Synthesis Using Convolutional Neural Networks ↩︎