PyTorch教程+代碼:色塊秒變風景油畫

正在研究機器學習的全棧碼農Dendrick Tan在博客上發布了一份教程+代碼:用PyTorch實現將色塊拼湊成的圖片,轉換為一幅Bob Ross風格的畫作。

說到Bob Ross,這頭蓬鬆的秀髮你可能有點印象……

他在電視節目《歡樂畫室》上教了11年畫畫,還推出了同名的美術用品品牌,也出版了不少教材。

他的畫,基本上是這個風格:

量子位今天要介紹的這個教程,就叫drawlikebobross。

王新民 編譯整理

量子位 出品 | 公眾號 QbitAI

是什麼?

drawlikebobross項目的目標是,將一張色塊拼湊而成的圖片轉變成(看起來有點像)Bob Ross油畫風格的圖像,如下圖所示:

怎麼做?

獲取數據

在我們開始訓練網路之前,首先需要獲取數據來構建數據集。幸運的是,通過谷歌搜索,我在Bob Ross Database - List of all Bob Ross paintings網站上找到了一個關於Bob Ross作品的數據集。

這個網站的優點是它包含所有的Bob Ross作品,並按照如下格式列出:

  • twoinchbrush.com/images

  • twoinchbrush.com/images

  • twoinchbrush.com/images

  • ……
  • twoinchbrush.com/images

開源代碼中的scrapper.sh就是用來完成這項工作的。

數據預處理

由於我們的目標是將色塊圖片轉換為Bob Ross風格的圖像,所以我決定使用平均偏移濾波(mean shift filtering)來實現圖像平滑操作,將得到的色塊圖像作為輸入,原始圖像作為輸出。

為了最大限度地減少訓練時間,我將大部分原始圖像預處理成平滑的色塊圖片,並存儲為HDF5格式。由於HDF5的快速可讀寫性能,我們能夠快速地測試不同的神經網路結構,無需在訓練時間內多次重複預處理數據,這樣,就節省了大量的時間。

神經網路結構

這個項目所使用的網路結構叫做對抗自動編碼器(Adversarial Autoencoder),也被簡稱為AAE。關於AAE,有一篇博客介紹(Adversarial Autoencoders)和一篇論文([1511.05644] Adversarial Autoencoders)。

博客介紹中對AAE的評價是:「我覺得本文中最有趣的想法是不利用變分推理方法,而是使用對抗訓練的方法將編碼器的輸出分布q(z | x)映射到任意先驗分布p(z)的概念。」

△ 對抗自動編碼器AAE的網路結構

將數據輸入我們的模型

我們希望將色塊圖片輸入到網路,輸出為Bob Ross風格的圖像。具體實現流程如下。

△ 利用AAE網路實現風格遷移

我選擇使用PyTorch來實現這個模型,是因為我一直在用它,也是因為與TensorFlow相比,這個框架的API很好用,且保持著很強的一致性,自從用了它,效率提升了幾十倍。

該模型的訓練過程可以分為四個部分:

  • models.py:神經網路的結構;

  • loader.py:數據載入操作;

  • trainer.py:訓練網路的超參數配置;

  • train.py:訓練的啟動文件;

通過這種方式,如果想改變神經網路的結構,只需要再次編輯models.py和trainer.py,很容易進行修改。

訓練

網路訓練的時間越長,則網路輸出Bob Ross風格的圖像效果越好。

由於我使用的是ThinkPad t460s,自帶的GPU計算性能不好,所以我在AWS上租了一個g2工作站,花了大約一天的時間,運行了2500步,來訓練這個模型。

另外

drawlikebobross的開源代碼中還包含一個網頁App,歡迎下載測試,告訴我們結果如何。

也強烈推薦想嘗試PyTorch的同學,花兩天時間用這樣一個小項目練手~

我們整理了文章中提到的所有相關鏈接,在量子位公眾號(QbitAI)對話界面回復「BobRoss」查看。

今天AI界還有哪些事值得關注?在量子位(QbitAI)公眾號會話界面回復「今天」,看我們全網搜羅的AI行業和研究動態。筆芯?~

推薦閱讀:

關於 PyTorch 0.3.0 在Windows下的安裝和使用
【筆記】Finding Tiny Faces
女生看了會流淚 | 訓練一個會「卸妝」的深度學習模型
基於CTC的語音識別基礎與實現
PyTorch還是TensorFlow?這有一份新手深度學習框架選擇指南

TAG:计算机视觉 | PyTorch | 机器学习 |