图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...

原标题:图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用

选自Medium

作者:Philip Meier

机器之心编译

编辑:陈萍

易于使用的神经风格迁移框架 pystiche。

aee05288908e9f9f31c22c503fd38da2.png

将内容图片与艺术风格图片进行融合,生成一张具有特定风格的新图,这种想法并不新鲜。早在 2015 年,Gatys、 Ecker 以及 Bethge 开创性地提出了神经风格迁移(Neural Style Transfer ,NST)。

不同于深度学习,目前 NST 还没有现成的库或框架。因此,新的 NST 技术要么从头开始实现所有内容,要么基于现有的方法实现。但这两种方法都有各自的缺点:前者由于可重用部分的冗长实现,限制了技术创新;后者继承了 DL 硬件和软件快速发展导致的技术债务。

最近,新项目 pystiche 很好地解决了这些问题,虽然它的核心受众是研究人员,但其易于使用的用户界面为非专业人员使用 NST 提供了可能。

pystiche 是一个用 Python 编写的 NST 框架,基于 PyTorch 构建,并与之完全兼容。相关研究由 pyOpenSci 进行同行评审,并发表在 JOSS 期刊 (Journal of Open Source Software) 上。

cd71efbfe853b47cb4c019149ff60e43.png

  • 论文地址:
  • 项目地址:

在深入实现之前,我们先来回顾一下 NST 的原理。它有两种优化方式:基于图像的优化和基于模型的优化。虽然 pystiche 能够很好地处理后者,但更为复杂,因此本文只讨论基于图像的优化方法。

在基于图像的方法中,将图像的像素迭代调整训练,来拟合感知损失函数(perceptual loss)。感知损失是 NST 的核心部分,分为内容损失(content loss)和风格损失(style loss),这些损失评估输出图像与目标图像的匹配程度。与传统的风格迁移算法不同,感知损失包含一个称为编码器的多层模型,这就是 pystiche 基于 PyTorch 构建的原因。

如何使用 pystiche

让我们用一个例子介绍怎么使用 pystiche 生成神经风格迁移图片。首先导入所需模块,选择处理设备。虽然 pystiche 的设计与设备无关,但使用 GPU 可以将 NST 的速度提高几个数量级。

模块导入与设备选择:

importtorch importpystiche from pystiche importdemo, enc, loss, ops, optim

print(f "pystiche=={}")

device = ( "cuda"iftorch.cuda.is_available else"cpu")

输出:

pystiche== 0.7. 0

多层编码器

content_loss 和 style_loss 是对图像编码进行操作而不是图像本身,这些编码是由在不同层级的预训练编码器生成的。pystiche 定义了 类,该类在单个前向传递中可以有效地处理编码问题。该示例使用基于 VGG19 架构的 vgg19_multi_layer_encoder。默认情况下,它将加载 torchvision 提供的权重。

多层编码器:

multi_layer_encoder = enc.vgg19_multi_layer_encoderprint(multi_layer_encoder)

输出:

VGGMultiLayerEncoder(arch=vgg19, framework=torch, allow_inplace= True(preprocessing): TorchPreprocessing(( 0): Normalize( mean=( '', '', ''), std=( '', '', '') ))(conv1_1): Conv2d( 3, 64, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu1_1): ReLU(inplace= True) (conv1_2): Conv2d( 64, 64, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu1_2): ReLU(inplace= True) (pool1): MaxPool2d(kernel_size= 2, stride= 2, padding= 0, dilation= 1, ceil_mode= False) (conv2_1): Conv2d( 64, 128, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu2_1): ReLU(inplace= True) (conv2_2): Conv2d( 128, 128, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu2_2): ReLU(inplace= True) (pool2): MaxPool2d(kernel_size= 2, stride= 2, padding= 0, dilation= 1, ceil_mode= False) (conv3_1): Conv2d( 128, 256, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu3_1): ReLU(inplace= True) (conv3_2): Conv2d( 256, 256, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu3_2): ReLU(inplace= True) (conv3_3): Conv2d( 256, 256, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu3_3): ReLU(inplace= True) (conv3_4): Conv2d( 256, 256, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu3_4): ReLU(inplace= True) (pool3): MaxPool2d(kernel_size= 2, stride= 2, padding= 0, dilation= 1, ceil_mode= False) (conv4_1): Conv2d( 256, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu4_1): ReLU(inplace= True) (conv4_2): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu4_2): ReLU(inplace= True) (conv4_3): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu4_3): ReLU(inplace= True) (conv4_4): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu4_4): ReLU(inplace= True) (pool4): MaxPool2d(kernel_size= 2, stride= 2, padding= 0, dilation= 1, ceil_mode= False) (conv5_1): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu5_1): ReLU(inplace= True) (conv5_2): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu5_2): ReLU(inplace= True) (conv5_3): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu5_3): ReLU(inplace= True) (conv5_4): Conv2d( 512, 512, kernel_size=( 3, 3), stride=( 1, 1), padding=( 1, 1)) (relu5_4): ReLU(inplace= True) (pool5): MaxPool2d(kernel_size= 2, stride= 2, padding= 0, dilation= 1, ceil_mode= False) )

感知损失

pystiche 将内容损失和风格损失定义为操作符。使用 作为 content_loss,直接与编码进行对比。如果编码器针对分类任务进行过训练,如该示例中这些编码表示内容。对于content_layer,选择 multi_layer_encoder 的较深层来获取抽象的内容表示,而不是许多不必要的细节。

content_layer= "relu4_2"encoder= (content_layer) content_loss= (encoder)

pystiche 使用 作为 style_loss 的基础,通过比较编码各个通道之间的相关性来丢弃空间信息。这样就可以在输出图像中的任意区域合成风格元素,而不仅仅是风格图像中它们所在的位置。对于 ,如果它在浅层和深层 style_layers 都能很好地运行,则其性能达到最佳。

style_weight 可以控制模型对输出图像的重点——内容或风格。为了方便起见,pystiche 将所有内容包装在 中,该操作处理在同一 multi_layer_encoder 的多个层上进行操作的相同类型操作符的情况。

style_layers = ( "relu1_1", "relu2_1", "relu3_1", "relu4_1", "relu5_1") style_weight = 1e3

def get_encoding_op(encoder, layer_weight):return (encoder, score_weight=layer_weight)

style_loss = (multi_layer_encoder, style_layers, get_encoding_op, score_weight=style_weight,)

结合了 content_loss 与 style_loss,将作为优化的标准。

criterion = (content_loss, style_loss).to(device)print(criterion)

输出:

PerceptualLoss((content_loss): FeatureReconstructionOperator(score_weight= 1,encoder= VGGMultiLayerEncoder(layer= relu4_2,arch= vgg19,framework= torch,allow_inplace= True))(style_loss): MultiLayerEncodingOperator(encoder= VGGMultiLayerEncoder(arch= vgg19,framework= torch,allow_inplace= True),score_weight= 1000(relu1_1): GramOperator(score_weight=)(relu2_1): GramOperator(score_weight=)(relu3_1): GramOperator(score_weight=)(relu4_1): GramOperator(score_weight=)(relu5_1): GramOperator(score_weight=)))

图像加载

首先加载并显在 NST 需要的目标图片。因为 NST 占用内存较多,故将图像大小调整为 500 像素。

size= 500images= demo.images content_image = images[ "bird1"].read(size=size, device=device) (content_image)

8891c7ded23fdb964a54b47d3c1332d1.png

内容图片

style_image = images[ "paint"].read(size=size, device=device) (style_image)

b7e69abb33dcb1f66c0ab455efafa8de.png

风格图片

神经风格迁移

创建 input_image。从 content_image 开始执行 NST,这样可以实现快速收敛。image_optimization 函数是为了方便,也可以由手动优化循环代替,且不受限制。如果没有指定,则使用 作为优化器。

input_image= content_image.clone output_image= optim.image_optimization(input_image, criterion, num_steps= 500)

ec236fdffefc5f51a6eed0f054219f6e.png

不氪金玩转中文超大规模预训练!

12月22日20:00, 百度自然语言处理部资深研发工程师硕环老师将在第二期直播《NLP开发利器解析:中文超大规模预训练模型精讲》 中介绍:

  • 语义理解技术简介

  • 基于预训练的语义理解技术
  • 文心(ERNIE)技术原理详解
  • 文心最新技术解读
  • 文心语义理解技术应用

扫码进群听课,还有机会赢取100元京东卡、《智能经济》实体书、限量百度鼠标垫多重好奖!

转载请联系本公众号获得授权

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vivo设置全屏后状态栏黑色_vivo手机用2年内存占满,是这3个功能捣乱,一键按下全部释放...

vivo手机用2年内存占满,是这3个功能"捣乱",一键按下全部释放经常使用手机如果没有清理习惯,那么应用一多,产生的文件就会变多,这样手机就会没用2年就出现卡顿的现象。今天来教大家怎样一键释放vivo手机内存。…

学计算机之路写一篇作文,我的学习之路作文(2篇)

我的学习之路作文(2篇)在我们平凡的日常里,大家对作文都再熟悉不过了吧,作文根据写作时限的不同可以分为限时作文和非限时作文。那要怎么写好作文呢?以下是小编整理的我的学习之路作文,仅供参考,欢迎大家阅读。我的学习…

js生日计算年龄_你知道用EXCEL可以从身份证中提取生日、性别、年龄、生肖吗?...

首先我们先了解下中国身份证号码的编排规则,中国公民身份证共18位,1~6位为省份地区信息码;7~14位为出生日期码;15~16位数字表示所在地的派出所的代码;第17位数字表示性别(奇数表示男性,偶数表示女性)&#…

docker 修改阿里镜像源_国内部署kubernetes集群的最佳实践(一)—官方教程+阿里镜像源

项目github地址:https://github.com/usualheart/install_k8s_official在国内环境下,借助阿里镜像源,按照官方的指导,使用脚本一步一步安装kubernetes。参考教程【官方】在ubuntu上安装dockerhttps://docs.docker.com/engine/insta…

html 指定对象为块元素,html内联(行内)元素、块级(块状)元素和行内块元素分类...

HTML可以将元素分类方式分为内联(行内)元素、块级(块状)元素和行内块元素三种。注:HTML是标签语言,那么既然是标签,就可以自己定义一些自己元素(如自定义的元素等),自定义元素浏览器默认解析为内联元素,为防止不同浏览…

defaultdict python_在python中怎样使用defaultdict-百度经验

defaultdict是collection模块下面的一个类,用于在执行字典的时候,遇到没有设置的属性的时候,可以设置默认的值,那么在python中怎样使用defaultdict呢?下面小编就带大家来看看详细的教程!工具/原料 python版…

微型计算机除具有计算机的一般特点外,10秋学期《计算机应用基础》第1次在线作业答案免费6/15...

10秋学期《计算机应用基础》第1次在线作业答案免费6/152011-02-17 00:02:57266有学员问关于10秋学期《计算机应用基础》第1次在线作业答案免费6/15的题目的参考答案和解析,具体如下:2010秋学期《计算机应用基础》第一次在线作业试卷总分:100 …

java面试换背景颜色_三年经验Java程序员记一次失败的面试分享:鹅厂三面让我体无完肤!...

欢迎关注专栏:里面定期分享Java架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。程序员圈内那点事​zhuanlan.zhihu.com经过半年的沉淀,加上对MySQL,redis…

git 获取最新代码_github从远程仓库获取

前面我们说明了如何将本地的代码push到远程的仓库中,现在我们将学习从远程仓库上的获取代码到本地。1,建立一个新的文件夹,以从远端获取完整的git项目命令1:git clone https://github.com/huangguojie880/git-demo.git2&#xff0…

golang 远程批量执行shell_S2061远程代码执行漏洞复现及批量检测脚本(CVE202017530)...

声明由于传播、利用此文所提供的信息或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,博鸿科技安全服务中心以及文章作者不为此承担任何责任。博鸿科技安全服务中心拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保…

准备学python用什么电脑_001-小白学python-初入python世界

计算机组成原理硬件 主机 cpu中央处理器 (运算器与控制器) 内存(只读,随机)外设 输入设备(键盘,鼠标,录影(音)机) 输出设备(屏幕&…

html 添加窗口小部件,如何:为自定义窗口小部件定义主题(样式)项

波斯汪是的,有一种方法:假设您有一个小部件的属性声明(在中attrs.xml): 声明用于样式参考的属性(在中attrs.xml): 为小部件声明一组默认属性值(在中styles.xml):声明自定义主题(在中themes.xml):将此…

excel帮助文档_可以惊艳到你的6个excel基础技巧

Excel技巧太多,也许我们一直都在学习的路上,每天掌握一点点,工作轻松一点点,今天给大家带来6个excel经常会用到的技巧,操作简单,非常实用。技巧一:给excel文件添加打开密码第一步,很…

python find 不区分大小写_学好python拿高薪系列一(5):字符串操作和python数据结构...

大家好,上一期我们分享了python函数部分的内容,那么在这一期我们将分享python中有关字符串和列表的部分。字符串字符串没有什么好说的,知道一些常用的用法就行了。#字符串操作strr "hello,world!"#1、获取字符串长度print(len(strr…

for里面调用方法 vue_Vue源码阅读连载之Vue实例

我们学习Vue都是从下面这个例子开始的new Vue({render: h > h(App), }).$mount(#app)事实上,所有的Vue项目的组成组件都是一个Vue的实例,最后由根部的Vue实例去挂载到DOM上,当然这个"挂载"的操作可以针对不同的平台而有不同的行…

计算机组装怎么备份系统,手把手教你用GHOST备份还原安装电脑系统详细图文教程...

首先我们可以利用之前安装系统时提到的带启动功能和工具的系统安装盘,比如98启动盘或番茄花园的光盘,如果你用的U盘上带有GHOST工具,那很简单,我们还是要设置由光驱为第一启动项,重新启动电脑让电脑由光驱启动&#xf…

python车牌识别系统开源代码_python利用百度云接口实现车牌识别的示例

一个小需求---实现车牌识别。 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和编译第三方库很麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始准备使用百度云文字识别C SD…

c 包含其他文件_C/C++编程笔记:C/C++的编译和链接,计算机专业大学生必备知识...

C/C文件C/C程序文件包括 .h .c .hpp .cpp,其中源文件(.c .cpp)是基本的编译单元,头文件(.h .hpp)不会被编译器编译。C/C项目构建(build)过程,分为以下几个步骤 预处理 → 编译 → 链接。预编译预编译的过程可以理解为编译器(实际上是预处理器…

python函数命名空间_Python中的函数 ​命名空间 作用域和局部函数 匿名(lambda)函数...

函数 是 Python中最重要的代码组织和复用手段函数用def关键字声明,return关键字返回: def function(x, y, z1.5): if z > 1: return z * (x y) else: return z / (x y) ##可以拥有多条return语句,如果到达函数末尾时没有遇到任何一条ret…

二建施工管理思维导图_备考二建不丢分?二建思维导图全程指导,知识点记忆快、不分散...

关键字:二建 一建 建造师考试 建造师证书 建筑 工程 建筑项目 法规 管理 市政 公路目前,距离2020年二级建造师考试的时间越来越近,很多准备参加二建考试的朋友也开始紧张起来了。二建考试分为公共科和专业科,公共科为法规和管理&a…