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

选自Medium

作者:Philip Meier

机器之心编译

编辑:陈萍

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

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

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

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

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

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

在深入实现之前,我们先来回顾一下 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)

内容图片

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

风格图片

神经风格迁移

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

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

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

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

  • 语义理解技术简介

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

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

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

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

  1. 图像迁移风格保存模型_图像风格迁移

    样式迁移 如果你是一位摄影爱好者,也许接触过滤镜.它能改变照片的颜色样式,从而使风景照更加锐利或者令人像更加美白.但一个滤镜通常只能改变照片的某个方面.如果要照片达到理想中的样式,经常需要尝试大量不同 ...

  2. 图像迁移风格保存模型_用TensorFlow.js在浏览器中部署可进行任意图像风格迁移的模型...

    风格迁移一直是很多读者感兴趣的内容之一,近日,网友ReiichiroNakano公开了自己的一个实现:用TensorFlow.js在浏览器中部署可进行任意图像风格迁移的模型.让我们一起去看看吧! Gi ...

  3. 图像迁移风格保存模型_一种图像风格迁移方法与流程

    本发明涉及图像处理技术领域,更为具体地,涉及一种图像风格迁移方法. 背景技术: 近年来,由深度学习所引领的人工智能技术浪潮,开始越来越广泛地应用到社会各个领域,尤其是在在计算机视觉领域,图像风格迁移作 ...

  4. 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...

    CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...

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

    易于使用的神经风格迁移框架 pystiche. 将内容图片与艺术风格图片进行融合,生成一张具有特定风格的新图,这种想法并不新鲜.早在 2015 年,Gatys. Ecker 以及 Bethge 开创性 ...

  6. r语言把两个折线图图像放到一个图里_图像相似度度量

    图像相似度度量的应用场景很多,包括以图搜图,相似图像去重等多种功能,目前在项目中的场景是针对大量重复类似的图片,需要进行筛选剔除,自然需要用到图像相似度,简单调研了下图像相似度的方法,包括传统图像方法 ...

  7. 利用colab保存模型_在Google Colab上训练您的机器学习模型中的“后门”

    利用colab保存模型 Note: This post is for educational purposes only. 注意:此职位仅用于教育目的. In this post, I would f ...

  8. 于殿泓 图像检测与处理技术_图像检测与处理技术(21世纪高等学校仪器仪表及自动化类专业规划教材)...

    导语 本书是21世纪高等学校仪器仪表及自动化类专业规划教材,从图像检测与处理技术的整体知识框架出发,让读者对图像检测与处理技术的基本内容.背景以及相关的基础理论有深刻的理解.其中包括图像检测的物理基础 ...

  9. 划痕实验 迁移面积自动统计_从Jupyter迁移到合作实验室

    划痕实验 迁移面积自动统计 If you want to use Google Colaboratory to perform your data analysis, for building dat ...

最新文章

  1. 又一所“双一流”清退超33名博士生!今年已有超1300名硕博研究生被清退
  2. 重磅直播 | 图像对齐算法
  3. FreeRTOS介绍
  4. netty服务器定时发送消息,netty+websocket+quartz实现消息定时推送
  5. 解决warning LNK1166: cannot adjust code之掩耳盗铃版
  6. opencv笔记(3):图像镜像
  7. One Order distribution logic issue - automatic BDOC creation and sent to Middleware outbound queue -
  8. 算法:把数组排成最小的数
  9. HTML中,表格中禁止换行,td的nowrap属性
  10. linux远程连接交换机,思科:路由器、交换机 ssh远程连接
  11. python等值线如何设置高度的范围和间隔_matlab 等值线间距问题
  12. plc的移位指令C语言实现,PLC中使用移位指令是如何实现移位动作的
  13. 计算机网络交换机无法ping,无法Ping通路由器交换机提示request time out修复方法
  14. 远程调用报错java.net.UnknownHostException 解决方法
  15. 湖大计算机学院博士后李晓灿,谢鲲-湖大信息科学与工程学院
  16. Android---ADB工具连接真实手机(有线连接与无线连接)
  17. NC65 查询信用余额——客户信用联查、销售订单信用联查等
  18. 北京商标权律师讲解商标使用应该注意什么事项?
  19. Pr 仿漫威片头效果~
  20. activemq、rabbitmq、kafka原理和比较

热门文章

  1. 论文学习7-Spam Review Detection with Graph Convolutional Networks(阿里巴巴)
  2. SIRIM上海,http://www.sirim-global.com
  3. Node.js对MongoDB进行增删改查操作
  4. 线上服务CPU100%问题快速定位实战
  5. [PA 2014]Kuglarz
  6. oracle 实现ID自增
  7. 页面的缓存与不缓存设置
  8. jquery获取select中的option的text值
  9. cut命令详解(转)
  10. Rejection sampling - 直观解释