最近看了两篇关于人物风格迁移的论文DualStyleGAN和VToonify,里面都提到了AdaIN这个算法,在此之前没有学习过相关邻域的知识,论文也是纯属硬理解,所以先学习记录一下AdaIN算法。
在做风格迁移之前我也看过换脸的一些论文,也做过相关的实验,在很多换脸的顶会论文中,在做特征融合的时候都会用到一个AdaIN模块,当时只是看懂它的数学公式,并没有去深究为什么它可以在特征融合、风格迁移的过程中发挥这么答的作用。
风格迁移
通俗理解
风格迁移,顾名思义,就是将一张图片/视频的风格嵌入到另一张图片/视频中去,被嵌入的图片/视频保持原内容,但是风格却变成了其他样式。
背景知识
AdaIN的主要与标准化有关,在深度神经网络的训练过程中有很多的标准化操作包括Batch Normalization、Instance Normalization、Conditional Instance Normalization。
Batch Normalization
对一个batch中的数据进行标准化,就是每一个值减去batch的均值,除以batch的标准差,计算公式如下:
对于全连接层(FC)或卷积层(Conv),假设其输入为
x
∈
R
m
x\in\mathbb{R}^{m}
x∈Rm,即一个
m
m
m 维向量,BN 的公式为:
x i ^ = x i − μ B σ B 2 + ϵ \hat{x_i}=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} xi^=σB2+ϵxi−μB
其中,
μ
B
=
1
m
∑
i
=
1
m
x
i
\mu_B=\frac{1}{m}\sum_{i=1}^{m}x_{i}
μB=m1i=1∑mxi
σ
B
2
=
1
m
∑
i
=
1
m
(
x
i
−
μ
B
)
2
\sigma_B^2=\frac{1}{m}\sum_{i=1}^{m}(x_i-\mu_B)^2
σB2=m1i=1∑m(xi−μB)2
ϵ \epsilon ϵ 是一个很小的数,用于避免方差为零的情况, m = N ∗ H ∗ W m = N*H*W m=N∗H∗W。
接下来,BN 通过一个线性变换将 x ^ \hat{x} x^ 映射到均值为 γ \gamma γ,方差为 β 2 \beta^2 β2 的分布上:
y i = γ x i ^ + β y_i=\gamma\hat{x_i}+\beta yi=γxi^+β
其中, γ \gamma γ 和 β \beta β 是 BN 层可学习的参数。
Instance Normalization
Ulyanov等[4]发现,将BN替换为Instance Normalization(IN),可以提升风格迁移的性能。IN的操作跟BN类似,就是范围从一个batch变成了一个instance。计算公式和Batch Normalization类似。
Conditional Instance Normalization
Conditional Instance Normalization (CIN) 是在 Instance Norm (IN) 基础上引入条件参数的一种归一化技术,用于在图像风格迁移中控制生成图像风格。
假设样本的输入张量为 X ∈ R N × C × H × W X \in \mathbb{R}^{N \times C \times H \times W} X∈RN×C×H×W,其中 N N N 表示样本数, C C C 表示通道数, H H H 和 W W W 分别为输入样本的高度和宽度,同时假设条件数据 y ∈ R M y \in \mathbb{R}^M y∈RM。给定输入和条件数据,CIN 的计算可概括为以下几个步骤:
- 对输入张量
X
X
X 进行标准化:
x ^ i = x i − μ i σ i 2 + ϵ \widehat x_{i} = \frac{x_{i} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} x i=σi2+ϵxi−μi
其中 μ i , σ i 2 \mu_i, \sigma_i^2 μi,σi2 均计算自输入张量 X X X 第 i i i 个通道, ϵ \epsilon ϵ 是一个足够小的常量,避免分母为零的情况。
- 定义逐通道的缩放系数
s
i
s_i
si 和平移参数
b
i
b_i
bi:
s i = f S ( y ) i , b i = f B ( y ) i s_i = f_S(y)_i,\quad b_i = f_B(y)_i si=fS(y)i,bi=fB(y)i
其中 f S f_S fS 和 f B f_B fB 分别是针对条件数据的可学习函数,用于生成适当的缩放和偏移参数。
- 应用缩放系数和偏移参数:
y i j = s i x ^ i + b i y_{ij} = s_i \widehat x_{i} + b_i yij=six i+bi
通过将缩放系数和偏移参数引入到标准化后的输入张量中,便可通过控制条件数据 y y y 来对风格转移进行控制。
以上就是 Conditional Instance Normalization (CIN) 的计算公式,通过引入条件参数控制缩放和偏移参数,可以实现更为灵活的图像风格迁移。
为什么Instance Normalization更适合做风格迁移
论文中提到DNN提取的特征统计特性(均值和方差)可以代表图像的风格,AdaIN这篇论文的作者做了三组实验,a、b两组实验为BN方法与IN方法分别在original images、contranormalized images上的结果,可以看出IN方法在风格转换这一方面是比BN更高效的,当在 style normalized images上实验时,二者的差距就很小了。在c实验中,作者将训练图片都迁移到同一种风格,这时候BN和IN的loss曲线差距就小了很多,这是为什么呢?
BN和IN的计算主要区别在于一个是针对batch样本,一个是针对个体样本,当训练数据都被归一到同一种风格,一个batch的统计特征和一个个体样本的统计特征会大致相同,而在这个时候,训练loss也大致相同,这侧面说明了影响风格转换的关键就是统计特征:均值和方差。
Adaptive Instance Normalization
既然均值和方差可以很大程度的影响风格转换效果,那么我想改变一张图片的风格,如果先对其进行去风格化,再进行风格嵌入,效果是不是会出奇的好呢?
AdaIN全称为Adaptive Instance Normalization,是一种图像处理技术,用于实现风格迁移。它的计算公式如下:
设输入特征图为
x
∈
R
C
×
H
×
W
x \in \mathbb{R}^{C \times H \times W}
x∈RC×H×W,风格特征图为
y
∈
R
C
×
1
×
1
y \in \mathbb{R}^{C \times 1 \times 1}
y∈RC×1×1,其中
C
C
C表示通道数,
H
H
H和
W
W
W分别表示特征图的高度和宽度。AdaIN的操作可以表达为:
AdaIN
(
x
,
y
)
=
σ
(
y
)
(
x
−
μ
(
x
)
σ
(
x
)
)
+
μ
(
y
)
\text{AdaIN}(x, y) = \sigma(y) \left(\frac{x - \mu(x)}{\sigma(x)}\right) + \mu(y)
AdaIN(x,y)=σ(y)(σ(x)x−μ(x))+μ(y)
其中
μ
\mu
μ表示均值运算,
σ
\sigma
σ表示标准差运算,它们的计算公式分别为:
μ
(
x
)
=
1
C
×
H
×
W
∑
c
=
1
C
∑
h
=
1
H
∑
w
=
1
W
x
c
,
h
,
w
\mu(x) = \frac{1}{C \times H \times W} \sum_{c=1}^C \sum_{h=1}^H \sum_{w=1}^W x_{c, h, w}
μ(x)=C×H×W1c=1∑Ch=1∑Hw=1∑Wxc,h,w
σ
2
(
x
)
=
1
C
×
H
×
W
∑
c
=
1
C
∑
h
=
1
H
∑
w
=
1
W
(
x
c
,
h
,
w
−
μ
(
x
)
)
2
\sigma^2(x) = \frac{1}{C \times H \times W} \sum_{c=1}^C \sum_{h=1}^H \sum_{w=1}^W (x_{c, h, w} - \mu(x))^2
σ2(x)=C×H×W1c=1∑Ch=1∑Hw=1∑W(xc,h,w−μ(x))2
μ
(
y
)
=
1
C
∑
c
=
1
C
y
c
,
1
,
1
\mu(y) = \frac{1}{C} \sum_{c=1}^C y_{c, 1, 1}
μ(y)=C1c=1∑Cyc,1,1
σ
(
y
)
=
1
C
∑
c
=
1
C
(
y
c
,
1
,
1
−
μ
(
y
)
)
2
+
ϵ
\sigma(y) = \sqrt{\frac{1}{C} \sum_{c=1}^C (y_{c, 1, 1} - \mu(y))^2 + \epsilon}
σ(y)=C1c=1∑C(yc,1,1−μ(y))2+ϵ
其中
ϵ
\epsilon
ϵ是一个很小的数,用于防止分母为0的情况。
σ
(
x
)
\sigma(x)
σ(x)被除以
σ
(
y
)
\sigma(y)
σ(y)表示将
x
x
x的标准差归一化到与风格特征的标准差相同。最终的结果是
σ
(
y
)
\sigma(y)
σ(y)乘以归一化后的
x
x
x再加上
μ
(
y
)
\mu(y)
μ(y)。
首先先对content image进行去风格化(减去自身均值再除以自身标准差),再风格化到style image的风格(乘style image的标准差再加均值 )。
训练时,先用VGG提取content image和style image的特征,然后在AdaIN模块进行的操作,然后用于VGG对称的Decoder网络将特征还原为图像,然后将还原的图像再输入到VGG提取特征,计算content loss和style loss,计算公式如式,style loss会对多个层的特征进行计算。VGG的参数在训练过程中是不更新的,训练的目的是为了得到一个好的Decoder。