当前位置:   article > 正文

图像风格迁移实战

图像风格迁移

最近看了一些基于深度学习的Style Transfer, 也就是风格迁移相关的paper,感觉挺有意思的。

所谓风格迁移,其实就是提供一幅画(Reference style image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Content)。之前比较火的修图软件Prisma就提供了这个功能

一、图像风格迁移(Neural Style)简史

可以参考文章:

图像风格迁移(Neural Style)简史

二、实战

所谓风格迁移,其实就是提供一幅画(Reference tye image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Conent。之前比较火的修图软件Prisma就提供了这个功能。我觉得这一说法可以改成风格迁移,将一张图的风格迁移到另一张图片上,也可以理解为生成问题,根据两种图片,生成第三种(风格)图片,具体看怎么理解怎么做吧《(不喜勿喷,纯个人观点)。比如下图,把一张图片的风格"迁移"到另一张图片上。论文地址:thtp slani oag odi1508.065762.pd然而,原始的风格迁移的速度是非常慢的。在GPU上,生成一张图片都需要10分钟左右,而如果只使用CPU而不使用GPU运行程序,甚至需要几个小时。这个时间还会驰着图片尺寸的增大而迅速增大。这其中的原因在于,在原始的风格迁移过程中,把生成图片的过程当做一个训练的过程。每生成一张图片,都相当于要训练一次模型,这中间可能会迭代几百几千次。如果你了解过一点机器学习的知识,就会知道,从头训练一个模型要比执行一个已经训练好的模型要责时太多。而这也正是原始的风格迁移速度缓慢的原因。(出处: https://zhuanlan.zhihu.com/p/24383274 )
 

下面就开始我们的风格迁移:

首先我们要引入一些工具包:

这些工具包都可以通过pycharm直接安装或者通过pip install来安装。

  1. import tensorflow_hub as hub
  2. import tensorflow as tf
  3. import matplotlib.pyplot as plt
  4. import numpy as np

 接下来,我们要确定我们的风格迁移的步骤,首先是我们要拿到一个原始图片(记得修改一下路径):

  1. #原始图片
  2. img=plt.imread('./picture/xxx证件照.jpg')
  3. img=img/255.
  4. #plt.imshow(img)
  5. #plt.show()
  6. #print(img)

 这里随便拿一张网络证件照为例子:

 接下来需要拿到风格图片,同样我们可以在网络上下载:

这里需要注意,我们的网络模型对输入的图像的初始大小(像素)有要求,所以使用了resize方法。

  1. #风格图片
  2. style_img=plt.imread('./picture/彩色.jpg')
  3. style_img=style_img/255.
  4. style_img = tf.image.resize(style_img, (256, 256))

 同样我们从网上下载几张图片:

 

 很出名的星空和向日葵。

接下来就需要到最关键的风格迁移部分:

  1. #风格迁移
  2. hub_model = hub.load("C:\\Users\\Administrator\\Desktop\\imagenet")

 诶,很多小伙伴就要问了,怎么最难的部分最简单啊,就一行代码,哈哈哈哈,那是因为我们已经把需要的东西下载到本地了,就是很厉害的风格迁移的模型(别人已经做好了)。其实真实的代码应该是:

hub_model = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')

 但是,很多小伙伴翻不了墙,加载不了模型,而且,即使你可以翻墙,程序运行时候加载模型真的会很慢很慢,所以这里推荐大家直接下载好模型,直接去用就行了!记得修改本地地址就行。

下载的东西我已经准备好了,在这里,大家直接去下载就行了:

tensorflowhub中的风格迁移模型-机器学习文档类资源-CSDN下载

下面是官网的界面:

而你需要的是复制下面那一行绿色的:

 好的,加载完模型,我们就可以训练,然后输出了:

  1. # 把输入规范一下,
  2. # 改变维度
  3. before_img_ = before_img[np.newaxis,:,:,:]
  4. style_img_ = style_img[np.newaxis,:,:,:]
  5. # 传入的是Tensor对象
  6. before_img_ = tf.convert_to_tensor(before_img_,dtype=tf.float32)
  7. style_img_ = tf.convert_to_tensor(style_img_,dtype=tf.float32)
  8. outputs = hub_model(before_img_,style_img_)
  9. # 输出有趣的图片[[[]]]
  10. # print(outputs[0][0])
  11. # 创建子图
  12. plt.subplot(1,3,1)
  13. plt.xlabel('before')
  14. plt.xticks([])
  15. plt.yticks([])
  16. plt.imshow(before_img)
  17. plt.subplot(1,3,2)
  18. plt.xlabel('style')
  19. plt.xticks([])
  20. plt.yticks([])
  21. plt.imshow(style_img)
  22. plt.subplot(1,3,3)
  23. plt.xlabel("after")
  24. plt.xticks([])
  25. plt.yticks([])
  26. plt.imshow(outputs[0][0])
  27. plt.show()
  28. # 图片的保存
  29. X = (outputs[0][0]) * 255
  30. print(X)
  31. # 将X转化为Tensor对象
  32. img = tf.cast(X,dtype=tf.uint8)
  33. # 编码回图片,二进制
  34. img = tf.image.encode_png(img)
  35. print(img)
  36. # 图片保存的路径
  37. save_path = './data/1.jpg'
  38. # 文件的保存
  39. with tf.io.gfile.GFile(save_path,'wb') as file:
  40. file.write(img.numpy())

 最后得到的图片:

哈哈哈哈,是不是很好玩,还有点好看嘞! 

喜欢的小伙伴点赞加关注哦! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/709430
推荐阅读
相关标签
  

闽ICP备14008679号