2017_ICCV_Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization

https://paperswithcode.com/method/adaptive-instance-normalization

Adaptive Instance Normalization在各项任务中使用情况。

近几年,各种归一化使用在文章所占比例。

 

(1)作者采用一个简单的编码器,解码器结构。其中编码器采用预训练VGG-19的前几个层。在特征空间对内容图像(content image)和风格图像(style image)进行编码后,将两个特征图输入到AdaIN模块,实现内容特征图和风格特征图的均值,方差的对齐,AdaIN输出目标特征图。

f表示编码器,c, s分别表示输入到编码器的内容图像,风格图像,t表示AdaIN模块的输出(目标特征图)。公式9中的AdaIN模块的公式如公式8所示。

AdaIN与BN, IN, CIN不同在于,AdaIN没有可学习的仿射参数(Affine parameters),Ada自适应地从风格输入图像中计算仿射参数(Affine Parameters)。

什么是仿射参数?仿射参数有什么作用?后续分析。

其中\sigma (y)|\sigma(x), \mu (y)|\mu(x) 表示标准差(standard deviation),均值。

(2)将AdaIN输出的目标特征图输入到解码器g中,得到风格化图像(stylied image)T(c,s)。

网络结构设计

收获:作者在陈述网络结构设计的时候,都会给出一两句话解释为什么这样做。在以后写作中,也是自己所需要注意的。

》在解码器中使用最近邻上采样取代上池化,原因是减少棋盘效应(checkerboard effect)。

》在编码器,解码器中,选择reflection padding 作为填充方式,目的是避免边界伪影(border artifacts)。

》解码中是否使用规划?使用哪一种归一化?IN归一化每个样本为单一风格,BN将一批样本归一化以单一风格为中心。作者为了生成多种风格的图像,在解码器中放弃使用归一化方式。

训练方式

作者所使用的编码器是预训练的VGG-19,因此模型训练阶段不需要更新编码器参数,只需要更新解码器参数。

使用公式11,训练解码器。

其中L_{c}, L_{s}分别是内容损失,风格损失。

\lambda可以控制风格迁移的程度,在训练过程中。除此之外,该方法允许在测试阶段内容风格君恨,通过在特征图之间进行插值,这些特征图被输入到解码器中去。

 

L_{c}计算目标特征与模型输出图像特征之间的欧式距离。作者使用AdaIN的输出特征作为目标特征,如图2所示,原因:这样会导致模型更快速的收敛。

\varnothing_{i}表示网络中某一层。

 

相关代码:

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)

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值