实践中的图像风格迁移

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

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

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

你可以参考这篇文章:

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

2.实战

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

实践中的图像风格迁移

让我们开始我们的风格迁移:

首先我们要介绍一些工具包:

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

import tensorflow_hub as hub
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

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

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

以下是在线身份证照片的示例:

实践中的图像风格迁移

接下来,我们需要获取样式图,也可以在网上下载:

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

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

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

实践中的图像风格迁移

实践中的图像风格迁移

以星空和向日葵而闻名。

接下来,我们需要进入风格迁移最关键的部分:

#风格迁移

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下载

以下为官网界面:

实践中的图像风格迁移

你需要的是复制下面的绿线:

实践中的图像风格迁移

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

# 把输入规范一下,
# 改变维度
before_img_ = before_img[np.newaxis,:,:,:]
style_img_ = style_img[np.newaxis,:,:,:]


# 传入的是Tensor对象
before_img_ = tf.convert_to_tensor(before_img_,dtype=tf.float32)
style_img_ = tf.convert_to_tensor(style_img_,dtype=tf.float32)




outputs = hub_model(before_img_,style_img_)

# 输出有趣的图片[[[]]]
# print(outputs[0][0])



# 创建子图
plt.subplot(1,3,1)
plt.xlabel('before')
plt.xticks([])
plt.yticks([])
plt.imshow(before_img)

plt.subplot(1,3,2)
plt.xlabel('style')
plt.xticks([])
plt.yticks([])
plt.imshow(style_img)

plt.subplot(1,3,3)
plt.xlabel("after")
plt.xticks([])
plt.yticks([])
plt.imshow(outputs[0][0])


plt.show()



# 图片的保存
X = (outputs[0][0]) * 255
print(X)
# 将X转化为Tensor对象
img = tf.cast(X,dtype=tf.uint8)
# 编码回图片,二进制
img = tf.image.encode_png(img)

print(img)
# 图片保存的路径
save_path = './data/1.jpg'

# 文件的保存
with tf.io.gfile.GFile(save_path,'wb') as file:
    file.write(img.numpy())

最终图像:

实践中的图像风格迁移实践中的图像风格迁移实践中的图像风格迁移实践中的图像风格迁移

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

喜欢并关注!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(1)
社会演员多的头像社会演员多普通用户
上一篇 2022年4月1日 下午9:00
下一篇 2022年4月1日 下午9:18

相关推荐