如何使用Pytorch生成自定义的风格迁移图

1 引言

艺术往往超越了人类的存在。回顾整个人类的历史进程,我们可以发现艺术的重要性,艺术品往往都是一个人实现表达自我对世界认知的一种手段。
传奇画物毕加索曾经说过:

“It took me four years to paint like Raphael, but a lifetime to paint like a child.”

大多数艺术创作都遵循某种模式—— 一种令人愉悦并激发我们创造性的艺术风格模式。
当我们在观察某件艺术品时,如果我们试着注意它的颜色主题变化,或者里面的笔触,我们可以从中看到某种艺术风格模式浮现出来。通常人类善于潜意识地识别这些风格模式。
现在,在神经网络的帮助下,识别并重建这种风格模式的能力也得到了快速发展。

在这里插入图片描述

在本文中,我们将构建一个轻量级的PyTorch版神经风格转换实现,如上所示,我们可以通过五个简单的步骤来将流行艺术风格转换到任何图像上。上图中,左侧为我们的内容图像,中间为我们的风格图像,最右侧为我们生成的新的艺术照,它不仅包含左侧内容图像的内容,同时具备中间风格图像的艺术风格.

闲话少说,我们直接开始吧. 😃

2 原理

Neural style transfer (NST) 是一种新的技术手段,它接受两张图像作为输入: 内容图像和艺术风格图像,生成的目标图像会将内容图像的内容进行保留,风格会替换为艺术风格图像一样的艺术风格.

该算法的核心思想为分别从内容和风格图像中提取相应的内容和风格特征,并将这两种特征重新组合生成目标图像,之后通过不断迭代重建目标图像,依据是生成的目标图像需要和内容图像具有相同的内容,和艺术风格图像具有相同的艺术风格.

我们使用以下图示进行该算法的讲解:
在这里插入图片描述

  • 我们使用预先训练好的卷积神经网络(本文为VGG19)来提取图像特征。

  • 我们观察到网络的浅层输出,主要为表示颜色和纹理等低级特征(style)。

  • 同样我们观察网络后几层的输出往往代表更高层次的特征(content)——例如,猫的眼睛和耳朵等。

  • 我们首先将我们的内容图像,通过VGG19前向传播,然后将网络后面的卷积层(conv4_2)的输出进行采样,当作我们提取到的内容特征。

  • 接着我们将我们的风格图像, 通过VGG19前向传播,在网络的前段到中段的卷积层进行多次采样,当作我们提取到的浅层特征. (conv1_1, conv2_1, conv3_1, conv4_1, conv5_1),

  • 上述特征图需要经过Gram 矩阵转换进行编码后,作为我们的风格特征.

  • 我们的目标是合成一个输出图像,这个图像由第一个图像的内容和另一个图像的风格样式组成。为此,我们计算以下损失函数:

  • content loss : 从内容图像提取到的conv4_2 和 从生成图像提取到的conv4_2 之间的L2距离
  • style loss: 从风格图像对应的五个浅层特征图的输出 和 从生成图对应的五个浅层特征图的输出 之间的L2距离之和
  • variation loss: 用于保证生成图像像素之间的平滑性,从而对其进行去噪并赋予其视觉连贯性
  • total loss: 上述三个loss的加权之和
  • 然后采用迭代优化技术(本文采用L-BFGS)来逐步最小化这些损失,以达到预期的结果。

3 实现

3.1 下载代码

你可以从这里下载对应的代码,代码结构如下:

在这里插入图片描述

其中:

  • vgg19.py 包含了VGG19模型的定义,并指定输出层用于style表示,那些输出层用于content表示。
  • NST.py 包含模型定义、优化器设置、调整和保存最终输出图像等步骤。

3.2 依赖

  • Pyhton3.6+
  • Framework: Pytorch
  • Lib: os,numpy,cv2,matplotlib,torchvision

3.3 如何训练自己的数据

  • 克隆代码仓库并进入主目录

$ git clone git@github.com:sgzqc/NST.git
$ cd NST

  • 把自己的内容图像和风格图像分别放到data目录对应的子目录下
  • 修改NST.py, 设置PATH为你放置图像的位置,同时修改CONTENT_IMAGE和STYLE_IMAGE为自己的图像路径

$ PATH = <your_path>
$ CONTENT_IMAGE = <your_content_image_name>
$ STYLE_IMAGE = <your_style_image_name>

  • 运行 NST.py

python3 NST.py

  • 查看结果. 最后你可以在output-images下查看我们生成的新的艺术风格的图像.

4 结果展示

以下输出图像是使用本文中的代码,进行训练后生成的。我建议大家可以下载下来尝试一下这个过程.

不同风格的猫:
在这里插入图片描述
不同风格的风景图:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

不同风格的机器小人:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

5 总结

本文介绍了风格迁移的原理,并针对性的讲解了相应的损失函数的含义,同时展示了不同分格迁移的效果图,最后给出了完整的代码实现.

您学废了吗?

6 参考

链接一

链接二

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。

关注公众号,后台回复 NST,即可获取源代码。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值