#萌新日志#3.使用pix2pix CycleGAN和3d CycleGAN实现T1和T2加权模态的互转
????????#萌新記錄某些日子的學習經歷。#
前言
????????以GAN為基礎的生成式對抗網絡從抽象的角度來說是結合一組圖像的風格和另一組圖像的內容,或者說實現將初始圖像從一個域遷移到目標圖像的域。
????????前段時間我嘗試了包括pix2pix, CycleGAN以及3d CycleGAN在內的三種圖像生成網絡,用于腦部圖像T1-weighted和T1-weighted的互相轉換。
? ? ? ? 應用于什么情形呢?比如說我們手上的數據集只有T1或者T2加權模態,那么我們可以用圖像生成網絡生成另一種模態,(甚至說生成其它種類的模態)。作為一個數據補充,比如可以用于其它模型的數據增強環節。
????????(注,因為大部分步驟源碼已經說的很清晰我就不贅述了,主要說明一下整個操作的流程和注意事項。
摘要
????????基于Linux,使用pix2pix, CycleGAN和3d CycleGAN實現T1-weighted和T2-weighted模態的互轉。
目錄
Part one: pix2pix
準備工作
訓練
預測
Part two: CycleGAN
準備工作
訓練
預測
Part three: 3d CycleGAN
總結
Appendix
Reference
Part one: pix2pix
? ? ? ? pix2pix有兩個特點:
????????1.訓練時輸入和輸出的圖像是成對的。
????????2.模型單向的。只能實現T1轉T2或者T2轉T1。如果需要互轉需要訓練兩個模型(一個模型實現一個方向)。
準備工作
? ? ? ? 1.下載模型源碼:pix2pix和CycleGAN的源碼
? ? ? ? 2.創建虛擬環境、下載requirements.txt的所有依賴
? ? ? ? 3.如果要實現自己的圖像轉換,還需要準備數據集。
? ? ? ? 關于數據集的整理,通常有兩個部分:首先是將3d圖像切片為一個系列的2d圖像(因為這里使用的pix2pix模型是針對2d輸入的),然后是將2d圖像以合適的文件格式保存起來(便于pix2pix的讀取)。
? ? ? ? 切片環節,如果是腦部MR圖像,一般沿著z軸取每個橫截面作為2d圖像。
? ? ? ? 如圖所示,比如原圖像大小為100*150*150,切片后變為100張大小為150*150的2d圖像。保存格式,比如原圖像是.nii或.nii.gz,2d圖像格式為.png。
? ? ? ? 需要注意的是,pix2pix的訓練需要創建一個文件夾,文件夾下包含"A"和"B"兩個文件夾。分別存放初始圖象和目標圖像。為了訓練時圖像一一對應,兩個類別的圖像名字需要一一對應。具體實施規則:tip
訓練
? ? ? ? 1.首先進入options文件夾,看看base和train的options.py文件有沒有需要修改的超參數。
? ? ? ? 2.如果要實現T1和T2的互轉,每個方向都需要一個pix2pix模型。
? ? ? ? 我的訓練指令如下:
python train.py --dataroot (訓練數據集路徑) --name (模型名稱)--model pix2pix--direction BtoA (選擇方向)--gpu_ids 0,1,3--batch_size 32--load_size 256? ? ? ? 最終得到的模型結果保存在checkpoints文件夾中和模型名稱同名的文件夾下。
? ? ? ? G,generator,生成器;D,discriminator,判別器。
預測
? ? ? ? 1.使用checkpoints文件夾中和模型名稱同名的文件夾下的"latest_net_G.pth"。
????????我的預測指令如下,注意最后兩行指令很重要,是模型參數:
python test.py --dataroot (預測數據集路徑)--name (模型名稱)--direction BtoA (方向)--model test--results_dir (輸出文件夾)--num_test (待處理圖像數量)--dataset_mode single--norm batch--netG unet_256? ? ? ? 最終在輸出文件夾中得到預測的結果。
? ? ? ? 需要注意的是,得到的結果圖像是2d圖像,還需要resize并按原來的順序組合成3d圖像,并以nii或nii.gz的格式保存。
Part two: CycleGAN
? ? ? ? CycleGAN相比于pix2pix有兩個特點:
????????1.訓練時輸入和輸出的圖像不需要一一對應,只需要兩個圖象集合對應即可。
????????2.模型雙向的。CycleGAN是一組鏡像對稱的GAN網絡組成的環形循環網絡。訓練一個CycleGAN即可實現T1和T2加權模態的互轉。
? ? ? ? 模型同樣是處理2d圖像的,預處理需要切片(3d轉2d,nii/nii.gz轉png),后處理需要resize和組合切片(png轉nii/nii.gz)。
準備工作
? ? ? ? 1.模型下載、環境配置和pix2pix相同,參照Part one。
? ? ? ? 2.同樣需要切片操作。但數據的保存方式略有不同,參照tip
訓練
? ? ? ? 1.首先進入options文件夾,看看base和train的options.py文件有沒有需要修改的超參數。
? ? ? ? 2.實現T1和T2的互轉,只需要訓練一個模型
? ? ? ? 我的訓練指令如下:
python train.py --dataroot (訓練數據集路徑) --name (模型名稱)--model cycle_gan--gpu_ids 0,1,3--batch_size 32--load_size 256? ? ? ? 最終得到的模型結果保存在checkpoints文件夾中和模型名稱同名的文件夾下。
?
? ? ? ? G,generator,生成器;D,discriminator,判別器。
? ? ? ? 需要注意的是這里有兩組(每組表示一個方向)的G和D。
預測
? ? ? ? 1.使用checkpoints文件夾中和模型名稱同名的文件夾下的"latest_net_G.pth"。
? ? ? ? 需要注意的是,
? ? ? ? 如訓練所示,保存的模型是不能直接用的,需要手動設置。我的建議是:
? ? ? ? 在checkpoints文件夾中新建兩個文件夾表示不同方向的GAN網絡。在每個文件夾下保存各自方向的生成器參數。比如說新建文件夾"cycle_gan_a"和"cycle_gan_b"。將訓練得到的"latest_net_G_A.pth"保存在"cycle_gan_a"中并重命名為"latest_net_G.pth"。將訓練得到的"latest_net_G_B.pth"保存在"cycle_gan_b"中并重命名為"latest_net_G.pth"。以此分別存儲兩個方向的生成器。
????????我的預測指令如下,注意最后兩行指令很重要,是模型參數:
python test.py --dataroot (預測數據集路徑)--name ***_a (模型名稱,表示A方向)--model test--results_dir (輸出文件夾)--num_test (待處理圖像數量)--dataset_mode single--norm instance--netG resnet_9blocks --no_dropout? ? ? ? 最終在輸出文件夾中得到預測的結果。
????????? 需要注意的是,得到的結果圖像是2d圖像,還需要resize并按原來的順序組合成3d圖像,并以nii或nii.gz的格式保存。
Part three: 3d CycleGAN
? ? ? ? Part one和Part two都是使用的2d模型。? ? ? ??
????????3d模型從理論上來說會關注切片間的信息。也許生成的圖像質量更高。
? ? ? ? 但實際上存在兩個問題:
? ? ? ? 1.3d模型訓練想要充分訓練,達到很好的擬合需要更多的訓練資源,在硬件受限的情況下很難。
? ? ? ? 2.3d模型可以說是魔改后的2d模型,具體效果如何誰也不知道。
? ? ? ? 模型的使用來源于:3d CycleGAN
? ? ? ? 因為作者大部分內容說的很清楚了所以我這里只是簡單過一下,并補充一些可能遇到的問題。
? ? ? ? 1.下載模型,配置依賴
? ? ? ? 2.按照要求整理好數據集(自己調整),nii格式,并按照預處理指令處理
? ? ? ? 3.在options里修改自己想修改的參數后,開始訓練
? ? ? ? 4.訓練好的模型,在預測時會面臨兩個問題。
? ? ? ? 首先,詳細操作參照Part two預測部份。因為得到的模型是兩組G和D,為了便于使用需要放置于不同的文件夾下并重命名,調用的生成器是模型名稱下的"latest_net_G.pth"。
? ? ? ? 其次,這個模型好像一次只能預測一張圖像,如果需要批量處理的話需要改一下。
? ? ? ? 直接修改“test.py”,參考代碼如下:
#if __name__ == '__main__': # opt = TestOptions().parse() # model = create_model(opt) # model.setup(opt) # inference(model, opt.image, opt.result, opt.resample, opt.new_resolution, opt.patch_size[0], # opt.patch_size[1], opt.patch_size[2], opt.stride_inplane, opt.stride_layer, 1)if __name__ == '__main__':opt = TestOptions().parse()model = create_model(opt)model.setup(opt)for filename in os.listdir(opt.image):resultname = filename[0:-5] + "2" + filename[-4:]inference(model, opt.image+'/'+filename, opt.result+'/'+resultname, opt.resample, opt.new_resolution, opt.patch_size[0],opt.patch_size[1], opt.patch_size[2], opt.stride_inplane, opt.stride_layer, 1)總結
? ? ? ? 使用了pix2pix,CycleGAN和3d CycleGAN進行T1-weighted和T2-weighted模態的互轉。
? ? ? ? 我自己訓練大概每個模型訓練了接近10天。
????????從得到的結果來看性能效果:pix2pix>CycleGAN>3d CycleGAN。不過從衡量指標來看基本上生成的模態還是有著較高質量的,可以模擬真實模態作為其他模型的輸入。這是一個很有潛力的數據增強策略。
? ? ? ? 未來可以考慮使用更多圖像生成網絡生成更多模態(比如StarGAN生成FLAIR, T1ce?)。
? ? ? ? (PS 我應該當時一邊做一邊記錄的,現在回想起來有些細節已經模糊了所以就沒寫太多。
? ? ? ? 感謝閱讀,請多指教!
Appendix
? ? ? ? 最終衡量生成的虛假模態質量的指標可以用PSNR和SSIM。
? ? ? ? 計算生成的虛假模態和真實模態之間的偏差。
from skimage.metrics import peak_signal_noise_ratio from skimage.metrics import structural_similarityReference
[1]?Goodfellow I J, Pouget-Abadie J, Mirza M , et al. Generative Adversarial Networks[J]. Advances in Neural Information Processing Systems, 2014, 3:2672-2680.
[2]?Isola P, Zhu J Y, Zhou T, et al. Image-to-image translation with conditional adversarial networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1125-1134.
[3]?Zhu J Y, Park T, Isola P, et al. Unpaired image-to-image translation using cycle-consistent adversarial networks[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2223- 2232.
總之就是很感謝把模型分享出來的各位大佬,ml的學習之路完全不能缺少前人們智慧的結晶~淚目
總結
以上是生活随笔為你收集整理的#萌新日志#3.使用pix2pix CycleGAN和3d CycleGAN实现T1和T2加权模态的互转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你所不了解的微服务架构
- 下一篇: 【报告分享】代餐行业营销洞察报告-丁香医