这次我们将学习一种风格转换方法,该方法具体原来可见论文《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


显示目标图像

备注一下原始风格图像:

优达学城《DeepLearning》2-5:风格迁移相关推荐

  1. 优达学城《DeepLearning》大纲和学习愿景

    目的: 查漏补缺深度学习体系,精益求精的深刻理解体系中各种核心的技术原理,感受技术思想背后的精髓魅力,做到能够脱口而出. 计划: 2021年5月.6月,完成课程中所有核心知识的深刻理解(通过撰写博客, ...

  2. python人工智能入门优达视频_看优达学城python入门视频学习C++

    在如今这个时代,计算机领域中,各种技术瞬息万变,不断更新迭代.随着人工智能.机器学习等先进技术的兴起,近年来,python入门视频是很多人关注的,Python程序员的数量已经大大超过C++程序员.然而 ...

  3. 优达学城 深度学习 任务1

    这几天刚好有环境,打算学习一下深度学习 看了一圈介绍,发现优达学城的深度学习课程作为入门课程还是不错的 今天看了第一章节的视频,顺便做了任务1 任务1难度不大,按照网站上的说明可以完成下载.打包等工作 ...

  4. 优达学城计算机视觉pkl,优达学城机器学习工程师纳米学位项目介绍

    本文由 meelo 原创,请务必以链接形式注明 本文地址,简书同步更新地址 一对一的项目辅导是优达学城纳米学位的一大亮点.本文将简要介绍优达学城机器学习工程师纳米学位的6个项目.项目覆盖了机器学习的主 ...

  5. 无人驾驶8: 粒子滤波定位(优达学城项目)

    优达学城无人车定位的项目实现: 粒子滤波算法流程图 粒子滤波的伪代码: step1:初始化 理论上说,当粒子数量足够多时,能准确地呈现贝叶斯后验分布,如果粒子太少,可能漏掉准确位置,粒子数量太多,会拖 ...

  6. 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解

    优达学城<无人驾驶入门>的第二个项目是实现矩阵类,要求通过python编写一个用来计算矩阵的类Matrix.编写这个类并不难,涉及到的线性代数方面的知识也不多,比如矩阵的加法.减法.乘法, ...

  7. 优达学城无人驾驶工程师——P5车辆检测功能

    这次讲的是优达学城无人驾驶工程师第一期的最后一个项目,车辆检测功能,代码如下. 导包 import cv2 import numpy as np import matplotlib.pyplot as ...

  8. 优达学城无人驾驶工程师——P4车道线检测功能

    这次讲的是优达学城的无人驾驶工程师的P4项目,利用车前方的摄像头检测车道线,下面开始我们的代码部分. import numpy as np import cv2 import glob import ...

  9. 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像

    将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...

  10. 零基础如何学习优达学城的《无人驾驶入门》?

    因为感兴趣,而且看好无人驾驶行业,我学习了优达学城的<无人驾驶入门>课程.最近整理了无人驾驶领域的资料,写成文章分享给大家. 作为系列文章的第一篇,我想介绍一下<无人驾驶入门> ...

最新文章

  1. Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片
  2. python 字符串输入时间_Python input()函数:获取用户输入的字符串
  3. iOS中定时器NSTimer的使用
  4. 【填坑】博客搬家造成的博客重复问题
  5. python stdin和stdout_stdin似乎比stdout(python)慢得多.为什么?
  6. 前台文件PHP完善步骤,ThinkPHP使用步骤
  7. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
  8. 蓝桥杯 ADV-181 算法提高 质因数2
  9. 马尔可夫随机场数学原理理解
  10. curl post json_Go Web编程--解析JSON请求和生成JSON响应
  11. 热敏打印机的工作原理
  12. 学术之声 | 专访北航教授洪晟:区块链应该管也能够管,而且要学会管
  13. Mac Zoc设置
  14. 为什么谷歌会从零开始构建一个全新的操作系统?
  15. pytesseract 测试获取查策网编码字体
  16. 郁闷,做了很多无用功
  17. 青少年学习机器人教育的收获
  18. 闪动的文字图片怎么制作?教你一招闪图在线制作
  19. Lisp for Small Prices
  20. python协程处理多个文件_python:多任务(线程、进程、协程)

热门文章

  1. Android 保存崩溃日志到本地目录下
  2. Android Activity从右边到左边跳转(overridePendingTransition)
  3. Day 33 并发编程3
  4. bash中case的用法
  5. python关于字典的操作
  6. MAC和windows开发操作系统环境,解决Maven工程中报 Missing artifact jdk.tools:jdk.tools
  7. 公用表达式 CTE with as 用法总结
  8. 验证环境中的program为什么必须是automatic
  9. 从零开始学习springboot之springboot搭建
  10. 物联网兴起 嵌入式系统安全日益受关注