优达学城《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
![](/assets/blank.gif)
显示目标图像
备注一下原始风格图像:
优达学城《DeepLearning》2-5:风格迁移相关推荐
- 优达学城《DeepLearning》大纲和学习愿景
目的: 查漏补缺深度学习体系,精益求精的深刻理解体系中各种核心的技术原理,感受技术思想背后的精髓魅力,做到能够脱口而出. 计划: 2021年5月.6月,完成课程中所有核心知识的深刻理解(通过撰写博客, ...
- python人工智能入门优达视频_看优达学城python入门视频学习C++
在如今这个时代,计算机领域中,各种技术瞬息万变,不断更新迭代.随着人工智能.机器学习等先进技术的兴起,近年来,python入门视频是很多人关注的,Python程序员的数量已经大大超过C++程序员.然而 ...
- 优达学城 深度学习 任务1
这几天刚好有环境,打算学习一下深度学习 看了一圈介绍,发现优达学城的深度学习课程作为入门课程还是不错的 今天看了第一章节的视频,顺便做了任务1 任务1难度不大,按照网站上的说明可以完成下载.打包等工作 ...
- 优达学城计算机视觉pkl,优达学城机器学习工程师纳米学位项目介绍
本文由 meelo 原创,请务必以链接形式注明 本文地址,简书同步更新地址 一对一的项目辅导是优达学城纳米学位的一大亮点.本文将简要介绍优达学城机器学习工程师纳米学位的6个项目.项目覆盖了机器学习的主 ...
- 无人驾驶8: 粒子滤波定位(优达学城项目)
优达学城无人车定位的项目实现: 粒子滤波算法流程图 粒子滤波的伪代码: step1:初始化 理论上说,当粒子数量足够多时,能准确地呈现贝叶斯后验分布,如果粒子太少,可能漏掉准确位置,粒子数量太多,会拖 ...
- 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解
优达学城<无人驾驶入门>的第二个项目是实现矩阵类,要求通过python编写一个用来计算矩阵的类Matrix.编写这个类并不难,涉及到的线性代数方面的知识也不多,比如矩阵的加法.减法.乘法, ...
- 优达学城无人驾驶工程师——P5车辆检测功能
这次讲的是优达学城无人驾驶工程师第一期的最后一个项目,车辆检测功能,代码如下. 导包 import cv2 import numpy as np import matplotlib.pyplot as ...
- 优达学城无人驾驶工程师——P4车道线检测功能
这次讲的是优达学城的无人驾驶工程师的P4项目,利用车前方的摄像头检测车道线,下面开始我们的代码部分. import numpy as np import cv2 import glob import ...
- 【多传感融合】优达学城多传感融合学习笔记(二)——将激光雷达点云俯视图映射到二维图像
将激光雷达点云俯视图映射到二维图像 目录 将激光雷达点云俯视图映射到二维图像 简介 实现方法 参考代码 简介 本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云 ...
- 零基础如何学习优达学城的《无人驾驶入门》?
因为感兴趣,而且看好无人驾驶行业,我学习了优达学城的<无人驾驶入门>课程.最近整理了无人驾驶领域的资料,写成文章分享给大家. 作为系列文章的第一篇,我想介绍一下<无人驾驶入门> ...
最新文章
- Python数据挖掘1:创建一位数组和二维数组,取最大最小值,切片
- python 字符串输入时间_Python input()函数:获取用户输入的字符串
- iOS中定时器NSTimer的使用
- 【填坑】博客搬家造成的博客重复问题
- python stdin和stdout_stdin似乎比stdout(python)慢得多.为什么?
- 前台文件PHP完善步骤,ThinkPHP使用步骤
- ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
- 蓝桥杯 ADV-181 算法提高 质因数2
- 马尔可夫随机场数学原理理解
- curl post json_Go Web编程--解析JSON请求和生成JSON响应
- 热敏打印机的工作原理
- 学术之声 | 专访北航教授洪晟:区块链应该管也能够管,而且要学会管
- Mac Zoc设置
- 为什么谷歌会从零开始构建一个全新的操作系统?
- pytesseract 测试获取查策网编码字体
- 郁闷,做了很多无用功
- 青少年学习机器人教育的收获
- 闪动的文字图片怎么制作?教你一招闪图在线制作
- Lisp for Small Prices
- python协程处理多个文件_python:多任务(线程、进程、协程)
热门文章
- Android 保存崩溃日志到本地目录下
- Android Activity从右边到左边跳转(overridePendingTransition)
- Day 33 并发编程3
- bash中case的用法
- python关于字典的操作
- MAC和windows开发操作系统环境,解决Maven工程中报 Missing artifact jdk.tools:jdk.tools
- 公用表达式 CTE with as 用法总结
- 验证环境中的program为什么必须是automatic
- 从零开始学习springboot之springboot搭建
- 物联网兴起 嵌入式系统安全日益受关注