帶你徒手完成基於MindSpore的CycleGAN實現
摘要:CycleGAN影像翻譯模型,由兩個生成網路和兩個判別網路組成,通過非成對的圖片將某一類圖片轉換成另外一類圖片,可用於風格遷移
本文分享自華為雲社區《基於MindSpore的CycleGAN介紹和實現》,作者: Tianyi_Li 。
前言
我們這次介紹下著名的CycleGAN,同時提供了基於MindSpore的程式碼,方便大家運行驗證。
CycleGAN的介紹
CycleGAN影像翻譯模型,由兩個生成網路和兩個判別網路組成,通過非成對的圖片將某一類圖片轉換成另外一類圖片,可用於風格遷移,效果演示如下圖所示:
CycleGAN是GAN的一種,那什麼是GAN呢?
生成對抗網路(Generative Adversarial Network, 簡稱GAN) 是一種非監督學習的方式,通過讓兩個神經網路相互博弈的方法進行學習,該方法由lan Goodfellow等人在2014年提出。生成對抗網路由一個生成網路和一個判別網路組成,生成網路從潛在的空間(latent space)中隨機取樣作為輸入,其輸出結果需要盡量模仿訓練集中的真實樣本。判別網路的輸入為真實樣本或生成網路的輸出,其目的是將生成網路的輸出從真實樣本中儘可能的分辨出來。而生成網路則儘可能的欺騙判別網路,兩個網路相互對抗,不斷調整參數。 生成對抗網路常用於生成以假亂真的圖片。此外,該方法還被用於生成影片,三維物體模型等。
好了,我們已經對GAN有了大體的了解,下面說回CycleGAN。
CycleGAN由兩個生成網路和兩個判別網路組成,生成網路A是輸入A類風格的圖片輸出B類風格的圖片,生成網路B是輸入B類風格的圖片輸出A類風格的圖片。生成網路中編碼部分的網路結構都是採用convolution-norm-ReLU作為基礎結構,解碼部分的網路結構由transpose convolution-norm-ReLU組成,判別網路基本是由convolution-norm-leaky_ReLU作為基礎結構,詳細的網路結構可以查看network/CycleGAN_network.py文件。生成網路提供兩種可選的網路結構:Unet網路結構和普通的encoder-decoder網路結構。生成網路損失函數由LSGAN的損失函數,重構損失和自身損失組成,判別網路的損失函數由LSGAN的損失函數組成。
CycleGAN最經典的地方是設計和提出了循環一致性損失。以黑白圖片上色為例,循環一致性就是:黑白圖(真實)—>網路—>彩色圖—>網路—>黑白圖(造假)。為了保證上色後的彩色圖片中具有原始黑白圖片的所有內容資訊,文章中將生成的彩色影像還原回去,生成造假的黑白圖,通過損失函數來約束真實白圖和造假黑白圖一致,達到影像上色的目的。除此之外,CycleGAN不像Pix2Pix一樣,需要使用配對數據進行訓練,CycleGAN直接使用兩個域影像進行訓練,而不用建立每個樣本和對方域之間的配對關係,這就厲害了,一下子讓風格遷移任務變得簡單很多。
看一下CycleGAN的網路結構圖:
如果想了解更多詳情,可以閱讀CycleGAN的原論文,推薦讀一讀,會有更深刻和更清楚的理解,下面給出鏈接:
CycleGAN的實現
程式碼和數據集
這裡我提供了一個包含程式碼和數據集的倉庫鏈接://git.openi.org.cn/tjulitianyi/CycleGAN_MindSpore,但是更建議使用最新版本程式碼,見下方特別說明。
特別說明:我們將在華為雲ModelArts的NoteBook,基於MindSpore-GPU 1.8.1 運行CycleGAN的程式碼,因為雲環境的更新不確定性,所以運行可能會報錯,這時可以參考如下最新程式碼://gitee.com/mindspore/models/tree/master/research/cv/CycleGAN。
需要提醒大家的是,必須需要使用MindSpore 1.8.0以及以上的版本,之前版本會報錯,因為某些API不支援。而最新的1.8.1版本有時也會報錯,報錯資訊如下,懷疑可能是程式碼的設置有些問題:
目前ModelArts最高支援到MindSpore 1.7,我們需要自行安裝最新的MindSpore 1.8.1版本。
先來看看我使用的NoteBook環境:
這裡特別提醒大家,NoteBook是要花錢的,我選擇的單卡Tesla V100大約每小時28元,也有更便宜的,大概每小時8元的單卡Tesla P100,請大家根據自身情況選擇,千萬注意使用情況,別欠費了。
準備環境
下面進入NoteBook,打開一個Terminal:
先來看看我們的顯示卡資訊和CUDA Version:
我們看到CUDA Version是10.2,下面到MindSpore官網看看安裝教程,我們需要安裝MindSpore 1.8.1,但是沒有CUDA 10.2對應的版本,這裡就選擇就近的CUDA 10.1版本了。
在Terminal執行如下命令:
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.8.1/MindSpore/gpu/x86_64/cuda-10.1/mindspore_gpu-1.8.1-cp37-cp37m-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i //pypi.tuna.tsinghua.edu.cn/simple
下載速度很快,安裝速度也是非常快:
最後運行顯示如下資訊,表示安裝成功了:
獲取程式碼
接下來下載程式碼,執行如下命令(由於要下載整個倉庫,時間有點長):
git clone https://gitee.com/mindspore/models.git
命令運行截圖:
下面我們將感興趣的CycleGAN程式碼拷貝到當前目錄下,執行如下命令:
cp -r models/research/cv/CycleGAN/ ./
準備數據集
下面進入CycleGAN目錄:
cd CycleGAN
我們這裡使用的是monet2photo數據集,由於直接在ModelArts的NoteBook下載速度很慢,所以建議大家下載到本地,再上傳到NoteBook的CycleGAN/data目錄下,下載鏈接為://s3.openi.org.cn/opendata/attachment/7/b/7beb4534-6e79-463e-a7c6-032510bab215?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=1fa9e58b6899afd26dd3%2F20220814%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220814T085624Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B filename%3D”monet2photo.zip”&X-Amz-Signature=20fbfd9c798701efcbf21d811f3dfdd6b8d5744f388c799bc38715f7fe78c783
上傳完成後,解壓數據集即可。我的運行截圖如下圖所示:
啟動訓練
注意,請在CycleGAN的目錄下啟動訓練,如下圖所示:
我是在GPU下的單卡訓練,所以啟動訓練的命令為:
python train.py --platform GPU --device_id 0 --model ResNet --max_epoch 200 --dataroot ./data/monet2photo/ --outputs_dir ./outputs
運行截圖為:
可以看到已經成功啟動訓練,列印出loss,此時我是用的Tesla V100顯示卡大約佔了4GB顯示記憶體,利用率接近100%,此時來看不適合用Tesla V100來跑,未能發揮其大顯示記憶體的優勢,而其計算能力其實一般。CycleGAN模型訓練比較費時間,請注意花費,預計完成全部200epoch的訓練需要72小時以上。
評估模型
python eval.py --platform GPU --device_id 0 --model ResNet --G_A_ckpt ./outputs/ckpt/G_A_200.ckpt --G_B_ckpt ./outputs/ckpt/G_B_200.ckpt
注意,這裡的.ckpt模型名稱,請根據實際訓練生成的具體輪數的模型名稱太難寫,比如目前只保存了20epoch的模型,那上述命令的200就應該改成20。
更多命令或適配其他硬體平台和多卡情況,可參考scripts文件夾下腳本。
結語
我們簡單介紹了著名的CycleGAN,給出了基於MindSpor的完整程式碼,並帶著大家跑了一遍,目前有些問題,後續會更新。作為經典的GAN的一種,CycleGAN有很多值得我們學習的地方,還需要深入分析挖掘,以鑒今事。
關於程式碼運行的問題,可以到官倉提交issue求助,下為鏈接://gitee.com/mindspore/models/issues