优达学城《DeepLearning》2-5:风格迁移

这次我们将学习一种风格转换方法,该方法具体原来可见论文《Image Style Transfer Using Convolutional Neural Networks》,使用卷积神经网络进行图像风格转换,作者是Gatys。

在本文中,我们使用19层的VGG网络中的特征提取层,该网络由一系列卷积层和池化层以及几个全连接层组成。在下图中,卷积层按堆栈及其在堆栈中的顺序命名。Conv1是图像在第一个堆栈中通过的第一个卷积层。Conv2_1是第二个堆栈中的第一个卷积层。网络中最深的卷积层是conv5_4。

分离样式和内容

风格传递依赖于图像内容和风格的分离。给定一个内容图像和一个样式图像,我们的目标是创建一个新的目标图像,该图像应包含我们所需的内容和样式组件:

  • 图像内容:目标对象及其排列
  • 图像风格:样式、颜色和纹理

下面是一个示例,图像内容是一只猫,图像风格是Hokusai's Great Wave。生成的目标图像仍然包含猫,但样式变为波浪、蓝色和米色,以及块打印状的纹理!

在本笔记本中,我们将使用预训练的VGG19从图像中提取内容或样式特征。然后,我们将形式化内容和样式丢失的概念,并使用它们来迭代更新目标图像,直到得到我们想要的结果。我们鼓励您使用自己的风格和内容图片,并在Twitter上与@udacity分享您的作品;我们很想看看你的想法!

加载VGG19

VGG19分为两部分:

  • vgg19特征提取层:所有的卷积层和池化层
  • vgg19分类器层:最后的三个线性分类器层

我们只需要特征提取部分,我们将在下面加载模型并“冻结”权重。

你可以加载任何你想要的图片!下面,我们提供了一个helper函数,用于加载任何类型和大小的图像。load_image函数还将图像转换为标准化的张量。

接下来,我将按文件名加载图像,并强制风格图像与内容图像的大小相同。

为了获得图像的内容和样式表示,我们必须通过VGG19网络将图像前向传播,直到到达所需的层,然后从该层获得输出。

内容和样式特征

TODO:获取特征提取层。

Gram矩阵

每个卷积层的输出都是一个张量,其维度与batch_size、depth、d以及一定的高度和宽度(h, w)有关。卷积层的Gram矩阵可以计算如下:

  • 通过batch_size, d, h, w = tensor.size()获取depth, height, width。
  • reshape张量,使其维度被拉平。
  • 通过将重构后的张量乘以它的转置来计算gram矩阵

注意:两个矩阵的乘法可以使用函数:torch.mm(matrix1, matrix2)

TODO:完成gram_matrix函数

把他们放一起

现在我们已经编写了用于提取特征和计算给定卷积层的gram矩阵的函数;让我们把所有这些碎片放在一起!我们将从图像中提取特征,并为样式表示中的每一层计算gram矩阵。

损失和权重

下面给出了在每个相关层中权重样式表示的选项。建议您使用0-1之间的范围来衡量这些层。通过对更前面的层(conv1_1和conv2_1)进行更多加权,您可以期望在结果的目标图像中得到更大的样式组件。如果您选择对后面的层进行加权,那么您将会更加强调较小的样式组件。这是因为每一层都有不同的大小,它们一起创建了一个多尺度的样式表示

就像在论文中一样,我们定义了alpha(内容权重)和beta(样式权重)。这个比例将影响你的最终图像的风格化程度。建议您保留内容权重= 1,并将样式权重设置为您想要的比例。

更新Target和计算损失

你将决定一些步骤来更新你的图像,这与你之前看到的训练循环类似,只是我们改变了我们的目标图像,没有其他关于VGG19或任何其他图像。因此,steps的数量真的由您来设置!我建议使用至少2000步来获得好的结果。但是,如果您只是测试不同的权重值或试验不同的图像,那么您可能希望从更少的步骤开始。

在迭代循环中,您将计算内容和样式损失,并相应地更新目标图像。

内容损失

内容损失是目标特征与内容特征在conv4_2层的均方差。这可以如下计算:

ontent_loss = torch.mean((target_features['conv4_2'] - content_features['conv4_2'])**2)

样式损失

样式损失以类似的方式计算,只是您必须遍历多个层,在我们的字典样式权重中通过名称指定。

  • 您将计算每一层的目标图像、target_gram和样式图的target_gram的gram矩阵,并比较这些gram矩阵,计算图层样式损失。稍后,你会看到这个值被图层的大小标准化了。

总损失

最后,您将通过将样式和内容损失相加,并将它们与指定的alpha和beta进行加权,从而创建总的损失。

我们会打印出这个损失;如果损失很大,不要惊慌。改变图像的风格需要一些时间,您应该关注目标图像的外观,而不是任loss值。但是,您应该看到这种损失会随着迭代次数的增加而减少。

TODO: Define content, style, and total losses.

结果:

Total loss at : 96257672.0

Total loss at : 15236884.0

Total loss at : 7416982.0

Total loss at : 4611283.5

Total loss at : 3088661.5


显示目标图像

备注一下原始风格图像:

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值