做者|Richmond Alake 編譯|Flin 來源|towardsdatasciencepython
我不會繪畫,可是機器學習能夠…git
介紹
我不是藝術鑑賞家,可是我以爲上面的畫看起來不錯。 我也不是畫家,可是到本文結尾,我將建立一個圖像,其繪畫風格與上圖類似。 本文將介紹如下內容:github
- 神經風格遷移的描述
- 神經風格遷移如何工做
- 風格遷移的代碼實現
什麼是神經風格遷移
神經風格遷移(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/