作者|Richmond Alake
編譯|Flin
來源|towardsdatascience
我不會繪畫,但是機器學習可以…

介紹
我不是藝術鑒賞家,但是我覺得上面的畫看起來不錯,
我也不是畫家,但是到本文結尾,我將創建一個影像,其繪畫風格與上圖相似,
本文將介紹以下內容:
- 神經風格遷移的描述
- 神經風格遷移如何作業
- 風格遷移的代碼實作
什么是神經風格遷移
神經風格遷移(NST)是一種技術,涉及利用深度卷積神經網路和演算法從一幅影像中提取內容資訊并從另一幅參考影像中提取風格資訊,在提取風格和內容之后,將生成一個組合影像,其中生成的影像的內容和風格來自不同的影像,
NST是一種影像風格化方法,它是一種使用輸入參考影像來提供從輸入影像匯出的風格變化的輸出影像的程序,
Leon A Gatys等人在論文 “藝術風格的神經演算法”中(https://arxiv.org/pdf/1508.06576.pdf) 介紹了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/RichmondAlake/tensorflow_2_tutorials/blob/master/03_neural_style_transfer.ipynb
原文鏈接:https://towardsdatascience.com/neural-style-transfer-with-tensorflow-hub-dfe003df0ea7
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194806.html
標籤:其他
