【Pytorch】20. Style Transfer 风格迁移


风格迁移就是将一张图片的风格迁移到另一张图片上面,比方说把浮世绘的风格迁移到猫的图片上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RoZOVoGf-1618323207632)(en-resource://database/16925:1)]

VGG19

我们需要用到VGG19的网络,这个网络长下面的样子,一张三通道的彩色图片作为输入,经过一系列的卷积和pooling层,有5个pooling层,中间夹着一组2个或者4个的卷积层,比方说第一个pooling层之前就有两个卷积层,最后一个pooling层之前有四个卷积层。最后是3个全连接层。

在这里插入图片描述
在这里插入图片描述

我们给第一个pooling层前面的两个卷积层分别起名conv1_1, conv1_2

风格迁移

为了得到最后风格迁移后的图片,我们需要先将content Image(那只猫)和style image(浮世绘风格)都通过VGG 19 的网络

对于将content Image(那只猫),我们将它送到网络之后,在最后一层卷积层,卷积层的输出就是输入图片的content representation。我们先得content representation。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31VhF4X4-1618323207640)(en-resource://database/16931:0)]

然后再将style image(浮世绘风格)通过VGG 19 的网络,并得到多个卷积层的输出,也就是style representation

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TVLxYzYq-1618323207642)(en-resource://database/16933:0)]

最后,我们就用content representation和style representation来和成最后的target图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbSWSaO9-1618323207644)(en-resource://database/16935:0)]

在论文中,content representation是从conv4_2那一层的输出得到的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04RGkERO-1618323207645)(en-resource://database/16937:0)]

我们希望content image的content表示和target image的content表示是基本一样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rqc7zdRG-1618323207646)(en-resource://database/16961:0)]

content loss

为了达到这个目的,就定义了content loss,这是为了对比content和target的representation。我们分别用Cc和Tc表示。这里我们用mean square来计算它们的loss。但是和前面我们学到的训练网络减小loss不同,我们这里不训练CNN,我们值改变target image,不断的update直到它们的表示基本一致。另外我们还要定义target和style图像的loss

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJmQi2Fs-1618323207647)(en-resource://database/16939:0)]

在这里,我们也不是正常的在使用VGG19进行训练,而是将它作为一个feature extractor,然后用反向传播来减小loss。

Gram Matrix

一张图片的style reprensentation需要查看不同层输出的feature的联系。也就是看这些features的相似性。相似性可以是color,texture等

一张风格图片进来之后,会经过五组卷积层,style representation的计算是通过每组卷积的第一个卷积层的输出来进行的。每一层的联系是用Gram matrix来计算的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jspKLzbH-1618323207648)(en-resource://database/16941:0)]

Gram matrix是这样计算的,假设我们有一个4×4的图片,要经过一个8个filter的卷积操作,形成一个4×4×8的卷积层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYdxQzgH-1618323207649)(en-resource://database/16943:0)]

从卷积层的8个feature中找到它们的关系。第一步就是将每个feature都向量化,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jgaDDGA-1618323207650)(en-resource://database/16945:0)]

每个都这样操作,最后4×4×8的三维的卷积层,就变成了8×16的2D的表示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0s7Jt9A0-1618323207650)(en-resource://database/16947:0)]

下一步就是将这个matrix乘上它的转置,得到gram matrix,这样空间信息就会不相关,这样gram matrix就是包含non-localized information,也就是说不看图像中的content,只关注color和texture等风格信息。

最后的到的就是8×8的一个矩阵,这里的8是和filter的数量一致的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvJXfysy-1618323207651)(en-resource://database/16949:0)]

这样第四行和第二列相乘得到的数字就是衡量第四个feature和第二个feature的相似程度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6Uj2Z37-1618323207652)(en-resource://database/16951:0)]

Style Loss

这里,就需要找到target image和style image的gram matrix,然后计算mean square。这里因为是五个conv层,所以计算5组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zfs4vopo-1618323207653)(en-resource://database/16953:0)]

然后用Ss表示Style图片的representation,Ts表示target图片的representation,计算loss,其中a是常数,每层的value数?w也是规定好的,表示每层的style reprensentatio对追钟的target iamge影响有多大,同样的,这里也是变Ts

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cnm9iZCJ-1618323207654)(en-resource://database/16955:0)]

total loss

然后我们就有了total loss,是两种loss相加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGyh95b4-1618323207655)(en-resource://database/16957:0)]

两种loss的权重可以不一样,这样生成的最后的图片有的是风格强一些,有的风格弱一点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9T3cSPC-1618323207655)(en-resource://database/16959:0)]

代码:
Style_Transfer_Exercise.ipynb in the style-transfer folder.
git clone https://github.com/udacity/deep-learning-v2-pytorch.git

【Pytorch】20. Style Transfer风格迁移代码分析

本系列笔记来自Udacity课程《Intro to Deep Learning with Pytorch》

全部笔记请关注微信公众号【阿肉爱学习】,在菜单栏点击“利其器”,并选择“pytorch”查看

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值