在進行模型訓練之前,通常需要透過一連串的行為,將資料轉換成適合訓練的格式。前一日的文章構建了長資料來管理資料,本日的文章將透過PyTorch與MONAI來進行前處理。
一般來說資料準備好,要進入模型之前大致上會經歷以下流程:
這邊也分享一下每一個環節的大觀念:
在monai裡頭,我們可以寫成像是下面這樣一個function的list,之後直接以pipeline的形式對所有資料作完整的前處理:
import monai
transforms = [
monai.transforms.LoadImageD(keys = ['img']),
monai.transforms.EnsureChannelFirstD(keys = ['img']),
monai.transforms.ScaleIntensityD(keys = ['img']),
monai.transforms.ToTensorD(keys = ['img'])
]
transforms = monai.transforms.Compose(transforms)
以上述的函式例子,我們假設每個進來的資料點都是一個dict(這些都是屬於monai.transfroms
函數的DICT版,才會每個函數名稱後面都有一個D)。
而這個transforms則是可以針對每個dict裡頭img
這個key,依序進行decode、調整channel、正規化pixel value到[0, 1]以及轉換成tensor。
有了前處理的函數以後,接著就可以讀取我們前一日進行的資料進來,接著轉換成list of dicts:
SPLITS = ['TRAIN', 'VALIDATION', 'TEST']
df = pd.read_csv('data/dataset.csv')
datasets = {split : df[df['split'] == split].to_dict('records') for split in SPLITS}
再下來,把資料點們跟上一段準備好的transforms
進行結合成一個monai的dataset物件:
processed_datasets = {
split : monai.data.Dataset(data = datasets[split], transform = transforms)
for split in SPLITS
}
最後,為dataset建立PyTorch的dataloader:
data_generators = {
split : torch.utils.data.DataLoader(processed_datasets[split],
batch_size = BATCH_SIZE,
shuffle = True,
collate_fn = monai.data.utils.pad_list_data_collate,
pin_memory=torch.cuda.is_available())
for split in SPLITS
}
接著就大功告成了!
補充:
collate_fn = monai.data.utils.pad_list_data_collate
是個很有趣的東西,他可以幫你把各種前處理以後如果有少掉大小的圖檔pad成一致的大小,避免在製造batch的時候不會出錯。接著根據上述三個dataloader
,可以簡單進行sampling並製圖:
看起來還不錯,詳細的產生方式可以參考這個檔案,一樣使用
python src/preprocess.py
就能得到結果。