forked from MIC-DKFZ/nnUNet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDataset219_Amos2022_task2.py
65 lines (52 loc) · 3.47 KB
/
Dataset219_Amos2022_task2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
from batchgenerators.utilities.file_and_folder_operations import *
import shutil
from nnunetv2.dataset_conversion.generate_dataset_json import generate_dataset_json
from nnunetv2.paths import nnUNet_raw
def convert_amos_task2(amos_base_dir: str, nnunet_dataset_id: int = 219):
"""
AMOS doesn't say anything about how the validation set is supposed to be used. So we just incorporate that into
the train set. Having a 5-fold cross-validation is superior to a single train:val split
"""
task_name = "AMOS2022_postChallenge_task2"
foldername = "Dataset%03.0d_%s" % (nnunet_dataset_id, task_name)
# setting up nnU-Net folders
out_base = join(nnUNet_raw, foldername)
imagestr = join(out_base, "imagesTr")
imagests = join(out_base, "imagesTs")
labelstr = join(out_base, "labelsTr")
maybe_mkdir_p(imagestr)
maybe_mkdir_p(imagests)
maybe_mkdir_p(labelstr)
dataset_json_source = load_json(join(amos_base_dir, 'dataset.json'))
training_identifiers = [i['image'].split('/')[-1][:-7] for i in dataset_json_source['training']]
for tr in training_identifiers:
shutil.copy(join(amos_base_dir, 'imagesTr', tr + '.nii.gz'), join(imagestr, f'{tr}_0000.nii.gz'))
shutil.copy(join(amos_base_dir, 'labelsTr', tr + '.nii.gz'), join(labelstr, f'{tr}.nii.gz'))
test_identifiers = [i['image'].split('/')[-1][:-7] for i in dataset_json_source['test']]
for ts in test_identifiers:
shutil.copy(join(amos_base_dir, 'imagesTs', ts + '.nii.gz'), join(imagests, f'{ts}_0000.nii.gz'))
val_identifiers = [i['image'].split('/')[-1][:-7] for i in dataset_json_source['validation']]
for vl in val_identifiers:
shutil.copy(join(amos_base_dir, 'imagesVa', vl + '.nii.gz'), join(imagestr, f'{vl}_0000.nii.gz'))
shutil.copy(join(amos_base_dir, 'labelsVa', vl + '.nii.gz'), join(labelstr, f'{vl}.nii.gz'))
generate_dataset_json(out_base, {0: "either_CT_or_MR"}, labels={v: int(k) for k,v in dataset_json_source['labels'].items()},
num_training_cases=len(training_identifiers) + len(val_identifiers), file_ending='.nii.gz',
dataset_name=task_name, reference='https://amos22.grand-challenge.org/',
release='https://zenodo.org/record/7262581',
overwrite_image_reader_writer='NibabelIOWithReorient',
description="This is the dataset as released AFTER the challenge event. It has the "
"validation set gt in it! We just use the validation images as additional "
"training cases because AMOS doesn't specify how they should be used. nnU-Net's"
" 5-fold CV is better than some random train:val split.")
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('input_folder', type=str,
help="The downloaded and extracted AMOS2022 (https://amos22.grand-challenge.org/) data. "
"Use this link: https://zenodo.org/record/7262581."
"You need to specify the folder with the imagesTr, imagesVal, labelsTr etc subfolders here!")
parser.add_argument('-d', required=False, type=int, default=219, help='nnU-Net Dataset ID, default: 219')
args = parser.parse_args()
amos_base = args.input_folder
convert_amos_task2(amos_base, args.d)
# /home/isensee/Downloads/amos22/amos22/