https://paperswithcode.com/method/adaptive-instance-normalization
Adaptive Instance Normalization在各项任务中使用情况。
近几年,各种归一化使用在文章所占比例。
(1)作者采用一个简单的编码器,解码器结构。其中编码器采用预训练VGG-19的前几个层。在特征空间对内容图像(content image)和风格图像(style image)进行编码后,将两个特征图输入到AdaIN模块,实现内容特征图和风格特征图的均值,方差的对齐,AdaIN输出目标特征图。
表示编码器,
分别表示输入到编码器的内容图像,风格图像,
表示AdaIN模块的输出(目标特征图)。公式9中的AdaIN模块的公式如公式8所示。
AdaIN与BN, IN, CIN不同在于,AdaIN没有可学习的仿射参数(Affine parameters),Ada自适应地从风格输入图像中计算仿射参数(Affine Parameters)。
什么是仿射参数?仿射参数有什么作用?后续分析。
其中 表示标准差(standard deviation),均值。
(2)将AdaIN输出的目标特征图输入到解码器g中,得到风格化图像(stylied image)T(c,s)。
网络结构设计
收获:作者在陈述网络结构设计的时候,都会给出一两句话解释为什么这样做。在以后写作中,也是自己所需要注意的。
》在解码器中使用最近邻上采样取代上池化,原因是减少棋盘效应(checkerboard effect)。
》在编码器,解码器中,选择reflection padding 作为填充方式,目的是避免边界伪影(border artifacts)。
》解码中是否使用规划?使用哪一种归一化?IN归一化每个样本为单一风格,BN将一批样本归一化以单一风格为中心。作者为了生成多种风格的图像,在解码器中放弃使用归一化方式。
训练方式
作者所使用的编码器是预训练的VGG-19,因此模型训练阶段不需要更新编码器参数,只需要更新解码器参数。
使用公式11,训练解码器。
其中分别是内容损失,风格损失。
可以控制风格迁移的程度,在训练过程中。除此之外,该方法允许在测试阶段内容风格君恨,通过在特征图之间进行插值,这些特征图被输入到解码器中去。
计算目标特征与模型输出图像特征之间的欧式距离。作者使用AdaIN的输出特征作为目标特征,如图2所示,原因:这样会导致模型更快速的收敛。
表示网络中某一层。
相关代码:
https://github.com/naoto0804/pytorch-AdaIN
代码实现:
(1)均值,标准差的计算方式:
def calc_mean_std(feat, eps=1e-5):
# eps is a small value added to the variance to avoid divide-by-zero.
size = feat.size()
assert (len(size) == 4)
N, C = size[:2]
feat_var = feat.view(N, C, -1).var(dim=2) + eps
feat_std = feat_var.sqrt().view(N, C, 1, 1)
feat_mean = feat.view(N, C, -1).mean(dim=2).view(N, C, 1, 1)
return feat_mean, feat_std
在每个特征图的空间维度上计算均值,标准差。
def adaptive_instance_normalization(content_feat, style_feat):
assert (content_feat.size()[:2] == style_feat.size()[:2])
size = content_feat.size()
style_mean, style_std = calc_mean_std(style_feat)
content_mean, content_std = calc_mean_std(content_feat)
normalized_feat = (content_feat - content_mean.expand(
size)) / content_std.expand(size)
return normalized_feat * style_std.expand(size) + style_mean.expand(size)