写点什么

AIGC 背后的技术分析 | 图像风格迁移

作者:TiAmo
  • 2023-05-25
    江苏
  • 本文字数:1762 字

    阅读完需:约 6 分钟

AIGC背后的技术分析 | 图像风格迁移

1、图像风格迁移


VGG 模型是由 Simonyan 等人于 2014 年提出的图像分类模型,这一模型采用了简单粗暴的堆砌 3×3 卷积层的方式构建模型,并花费了大量的时间逐层训练,最终斩获了 2014 年 ImageNet 图像分类比赛的亚军。这一模型的优点是结构简单,容易理解,便于利用到其他任务当中。


VGG-19 网络的卷积部分由 5 个卷积块构成,每个卷积块中有多个卷积(convolution)层,结尾处有一个池化(pooling)层,如图 1 所示。



■ 图 1VGG-19 的网络结构

卷积层中的不同卷积核会被特定的图像特征激活,图 2 展示了不同卷积层内卷积核的可视化(通过梯度上升得到)。可以看到,低层卷积核寻找的特征较为简单,而高层卷积核寻找的特征比较复杂。



■ 图 2VGG 网络中部分卷积层内卷积核的可视化

2、图像风格迁移介绍


图像风格迁移是指将一张风格图 Is 的风格与另一张内容图 Ic 的内容相结合并生成新的图像。Gatys 等人于 2016 年提出了一种简单而有效的方法,利用预训练的 VGG 网络提取图像特征,并基于图像特征组合出了两种特征度量,一种用于表示图像的内容,另一种用于表示图像的风格。他们将这两种特征度量加权组合,通过最优化的方式生成新的图像,使新的图像同时具有一幅图像的风格和另一幅图像的内容。


图 3 对风格迁移的内部过程进行了可视化。上面的一行中,作者将 VGG 网络不同层的输出构建风格表示,再反过来进行可视化,得到重构的风格图片;下面的一行中,作者将 VGG 网络不同层的输出构建内容表示,再反过来进行可视化,得到重构的内容图片。可以看到,低层卷积层提取的风格特征较细节,提取的内容特征较详细;高层卷积层提取的风格特征较整体,提取的内容特征较概括。



■ 图 3 风格迁移中使用的风格数学表示和内容数学表示

3、内容损失函数

1●内容损失函数的定义

内容损失函数用于衡量两幅图像之间的内容差异大小,其定义如下。



其中,Xl 和 Yl 分别是两幅图片由 VGG 网络某一卷积层提取的特征图(feature map),l 表示卷积层的下标,i 和 j 表示矩阵中行与列的下标。可见两幅图像的内容损失函数是由特征图对位求差得到的。低层卷积特征图对图片的描述较为具体,高层卷积特征图对图片的描述较为概括。Gatys 等人选择了第 4 个卷积块的第 2 层(conv4_2)用于计算内容损失,因为我们希望合成的图片的内容与内容图大体相近,但不是一笔一画都一模一样。

2●内容损失模块的实现

模块在初始化时需要将内容图片的特征图传入,通过 detach()方法告诉 AutoGrad 优化时不要变更其中的内容。forward()方法实现上面的公式即可。

class ContentLoss(nn, Module) :def _init__(self, target) :super(ContentLoss, self)._ init__()self. target = target. detach( )def forward( self,input) :self.loss = torch.sum((input - self.target) *x 2) / 2.0return input
复制代码

4、风格损失函数

1●风格损失函数的定义

风格损失函数用于衡量两幅图像之间的风格差异大小。首先需要通过计算特征图的 Gram 矩阵得到图像风格的数学表示。给定 VGG 在一幅图像中提取的特征图 Xl,与之对应的 Gram 矩阵 Gl 定义如下。



Gram 矩阵本质上是特征的协方差矩阵(只是没有减去均值),表示的是特征与特征(卷积核与卷积核)的相关性。



设由以上方式获得 Xl 和 Yl 对应的 Gram 矩阵 Gl 和 Hl,风格损失函数定义如下。



其中,Nl 和 Ml 分别为特征图的通道数与边长,ωl 为权重。Gatys 等选择了 conv1_1,conv2_1, conv3_1, conv4_1, conv5_1 用于计算风格损失。

2●计算 Gram 矩阵函数的实现

因为 PyTorch 传入数据必须以批的形式,传入的 input 的大小为[batch_size, channels, height, width]。计算 Gram 矩阵时,先用 view 方法改变张量的形状,然后再将它与它自己转置进行点积即可。

def gram matrix( input) :a,b,c, d = input.size( )features = input.view(a x b,c x d)G = torch.mm( features, features.t()return G
复制代码

3●风格损失模块的实现

模块在初始化时需要将风格图片的特征图传入并计算其 Gram 矩阵,通过 detach()方法告诉 AutoGrad 优化时不要变更其中的内容。forward()方法实现上面的公式即可。

class StyleLoss(nn. Module) :def __init__(self, target feature) :super(StyleLoss,self).  init ()self.target = gram matrix(target feature) . detach( )def forward( self,input) :a, b,c,d = input.size( )G = gram matrix( input)self.loss = torch.sum((G- self,target) x* 2) / (4.0 * b x b * c x d)return input
复制代码


发布于: 刚刚阅读数: 2
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

评论

发布
暂无评论
AIGC背后的技术分析 | 图像风格迁移_AIGC_TiAmo_InfoQ写作社区