作者 |Richmond Alake
编译 |Flin
起源 |towardsdatascience
我不会绘画,然而机器学习能够…
介绍
我不是艺术鉴赏家,然而我感觉下面的画看起来不错。
我也不是画家,然而到本文结尾,我将创立一个图像,其绘画格调与上图类似。
本文将介绍以下内容:
- 神经格调迁徙的形容
- 神经格调迁徙如何工作
- 格调迁徙的代码实现
什么是神经格调迁徙
神经格调迁徙(NST)是一种技术,波及利用深度卷积神经网络和算法从一幅图像中提取内容信息并从另一幅参考图像中提取格调信息。在提取格调和内容之后,将生成一个组合图像,其中生成的图像的内容和格调来自不同的图像。
NST 是一种图像风格化办法,它是一种应用输出参考图像来提供从输出图像导出的格调变动的输入图像的过程。
Leon A Gatys 等人在论文“艺术风格的神经算法”中(https://arxiv.org/pdf/1508.06…)介绍了 NST 技术。
如何运作
深度神经网络(DNN),更具体地说,卷积神经网络(CNN)的要害特色是可能学习图像中内容和格调的空间示意。此个性使 NST 技术得以实现。
CNN 生成的输出图像的空间示意模式捕捉图像的格调和内容统计信息。NST 将提取的格调和内容组合到生成的输入图像中。
CNN 层构造内的中间层中的激活函数提供了捕捉输出图像的内容和格调统计信息的性能。
CNN 图层在卷积操作之后输入特色图,该卷积操作波及在输出图像上有一个滤波器滑动。图像的内容实际上在每个图层的生成的特色图中。
从中间层的特色图中提取内容将提供输出图像的高级构造和几何信息。
特色图获取输出图像的格调。为了导出图像的格调,须要评估中间层中特色图的均值和相关性。此过程提供的信息提供输出图像的纹理图案信息。
编程
好货色来了。
咱们将应用上面图像的内容和格调创立图像。
左:内容画面,右:格调图片
为了应用两个参考图像胜利实现神经格调迁徙的过程,咱们将利用 TensorFlow Hub(https://www.tensorflow.org/hub)上的模块
TensorFlow Hub 提供了一套可重用的机器学习组件,例如数据集,权重,模型等。
对于本文的实现局部,咱们将利用一套工具和库来加载图像和执行数据转换。
- TensorFlow:一个用于施行,训练和部署机器学习模型的开源平台。
- Matplotlib:用于在 Python 中创立可视化图的工具,例如图表,图形等
- numpy:启用数组数据结构的几种数学计算和运算。
- TensorFlow Hub:可重用的机器学习组件库,例如模型,数据集等
它们的地址如下:
- TensorFlow:https://www.tensorflow.org/
- Matplotlib:https://matplotlib.org/
- numpy:https://numpy.org/
- TensorFlow Hub:https://www.tensorflow.org/hub
咱们将应用 Jupyter Notebook(https://jupyter.org/)进行代码实现。本文开端还包含指向 notebook 的 Github 存储库的链接。
首先,咱们将导入所需的工具和库。
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import PIL.Image
import tensorflow_hub as hub
接下来,咱们申明两个变量,这些变量保留了图像的目录门路,以示意输入后果的内容和格调。另外,咱们也将显示图像。
content_path = 'images/human.jpg'
style_path = 'images/painting.jpg'
content_image = plt.imread(content_path)
style_image = plt.imread(style_path)
plt.subplot(1, 2, 1)
plt.title('Content Image')
plt.axis('off')
imshow(content_image)
plt.subplot(1, 2, 2)
plt.title('Style Image')
plt.axis('off')
imshow(style_image)
要求将图像转换为张量示意。对于下一步,咱们将利用 TensorFlow 的图像处理办法。
咱们将创立一个承受图像门路为参数的函数,而后应用“tf.io.read_file”将图像转换为张量。咱们进一步应用 ’tf.image.decode_image’ 将张量中值的数据类型更改为在 0 和 1 之间的浮点数。
def image_to_tensor(path_to_img):
img = tf.io.read_file(path_to_img)
img = tf.image.decode_image(img, channels=3, dtype=tf.float32)
# Resize the image to specific dimensions
img = tf.image.resize(img, [720, 512])
img = img[tf.newaxis, :]
return img
须要执行与上述相同的操作能力可视化来自 TensorFlow Hub 模块的后果。咱们须要将返回的张量转换为能够可视化的图像。
咱们只需将每个元素乘以 255,即可将蕴含 0 到 1 之间的值的张量反归一化为理论像素值。下一步是应用 Numpy 创立一个数组,其中蕴含咱们须要的数据类型。
咱们从张量返回一个图像对象。
def tensor_to_image(tensor):
tensor = tensor*255
tensor = np.array(tensor, dtype=np.uint8)
tensor = tensor[0]
plt.figure(figsize=(20,10))
plt.axis('off')
return plt.imshow(tensor)
到目前为止,咱们曾经实现了以下工作:
- 查看内容和参考格调图像
- 创立一个函数将图像转换为张量,并将张量转换为图像
当初,咱们将图像转换为张量并通过 TensorFlow Hub 包中的 .load()
办法将其传递给模块。
咱们冀望从参考图像中取得格调和内容的组合后果;因而,咱们将创立一个变量来保留来自模块的运算后果。
为了可视化后果,咱们仅应用咱们先前创立的 tensor_to_image
函数。
content_image_tensor = image_to_tensor(content_path)
style_image_tensor = image_to_tensor(style_path)
hub_module = hub.load('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')
combined_result = hub_module(tf.constant(content_image_tensor), tf.constant(style_image_tensor))[0]
tensor_to_image(combined_result)
论断
咱们设法联合了两个参考图像的格调和内容,并生成了网格图像。
展望未来,我倡议你更具体地探讨“神经格调迁徙”主题。
以下是本文中提供的代码的 GitHub 存储库链接。
https://github.com/RichmondAl…
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/