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作品,並按照如下格式列出:
- http://www.twoinchbrush.com/images/painting1.png
- http://www.twoinchbrush.com/images/painting2.png
- http://www.twoinchbrush.com/images/painting3.png
- ……
- http://www.twoinchbrush.com/images/paintingN.png
開源代碼中的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風格的圖像。具體實現流程如下。
我選擇使用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?這有一份新手深度學習框架選擇指南