【Pytorch】20. Style Transfer 风格迁移

文章目录

      • VGG19
      • 风格迁移
        • content loss
        • Gram Matrix
        • Style Loss
        • total loss

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

【Pytorch】20. Style Transfer 风格迁移_第1张图片

VGG19

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

【Pytorch】20. Style Transfer 风格迁移_第2张图片
【Pytorch】20. Style Transfer 风格迁移_第3张图片

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

风格迁移

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

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

【Pytorch】20. Style Transfer 风格迁移_第4张图片

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

【Pytorch】20. Style Transfer 风格迁移_第5张图片

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

【Pytorch】20. Style Transfer 风格迁移_第6张图片

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

【Pytorch】20. Style Transfer 风格迁移_第7张图片

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

【Pytorch】20. Style Transfer 风格迁移_第8张图片

content loss

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

【Pytorch】20. Style Transfer 风格迁移_第9张图片

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

Gram Matrix

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

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

【Pytorch】20. Style Transfer 风格迁移_第10张图片

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

【Pytorch】20. Style Transfer 风格迁移_第11张图片

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

【Pytorch】20. Style Transfer 风格迁移_第12张图片

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

【Pytorch】20. Style Transfer 风格迁移_第13张图片

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

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

【Pytorch】20. Style Transfer 风格迁移_第14张图片

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

【Pytorch】20. Style Transfer 风格迁移_第15张图片

Style Loss

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

【Pytorch】20. Style Transfer 风格迁移_第16张图片

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

【Pytorch】20. Style Transfer 风格迁移_第17张图片

total loss

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

【Pytorch】20. Style Transfer 风格迁移_第18张图片

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

代码:
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”查看

【Pytorch】20. Style Transfer 风格迁移_第19张图片

你可能感兴趣的