Spaces:
Runtime error
Runtime error
# Copyright (c) OpenMMLab. All rights reserved. | |
import copy | |
import os.path as osp | |
from typing import List | |
from mmengine.fileio import load | |
from mmseg.registry import DATASETS | |
from .basesegdataset import BaseSegDataset | |
class DecathlonDataset(BaseSegDataset): | |
"""Dataset for Dacathlon dataset. | |
The dataset.json format is shown as follows | |
.. code-block:: none | |
{ | |
"name": "BRATS", | |
"tensorImageSize": "4D", | |
"modality": | |
{ | |
"0": "FLAIR", | |
"1": "T1w", | |
"2": "t1gd", | |
"3": "T2w" | |
}, | |
"labels": { | |
"0": "background", | |
"1": "edema", | |
"2": "non-enhancing tumor", | |
"3": "enhancing tumour" | |
}, | |
"numTraining": 484, | |
"numTest": 266, | |
"training": | |
[ | |
{ | |
"image": "./imagesTr/BRATS_306.nii.gz" | |
"label": "./labelsTr/BRATS_306.nii.gz" | |
... | |
} | |
] | |
"test": | |
[ | |
"./imagesTs/BRATS_557.nii.gz" | |
... | |
] | |
} | |
""" | |
def load_data_list(self) -> List[dict]: | |
"""Load annotation from directory or annotation file. | |
Returns: | |
list[dict]: All data info of dataset. | |
""" | |
# `self.ann_file` denotes the absolute annotation file path if | |
# `self.root=None` or relative path if `self.root=/path/to/data/`. | |
annotations = load(self.ann_file) | |
if not isinstance(annotations, dict): | |
raise TypeError(f'The annotations loaded from annotation file ' | |
f'should be a dict, but got {type(annotations)}!') | |
raw_data_list = annotations[ | |
'training'] if not self.test_mode else annotations['test'] | |
data_list = [] | |
for raw_data_info in raw_data_list: | |
# `2:` works for removing './' in file path, which will break | |
# loading from cloud storage. | |
if isinstance(raw_data_info, dict): | |
data_info = dict( | |
img_path=osp.join(self.data_root, raw_data_info['image'] | |
[2:])) | |
data_info['seg_map_path'] = osp.join( | |
self.data_root, raw_data_info['label'][2:]) | |
else: | |
data_info = dict( | |
img_path=osp.join(self.data_root, raw_data_info)[2:]) | |
data_info['label_map'] = self.label_map | |
data_info['reduce_zero_label'] = self.reduce_zero_label | |
data_info['seg_fields'] = [] | |
data_list.append(data_info) | |
annotations.pop('training') | |
annotations.pop('test') | |
metainfo = copy.deepcopy(annotations) | |
metainfo['classes'] = [*metainfo['labels'].values()] | |
# Meta information load from annotation file will not influence the | |
# existed meta information load from `BaseDataset.METAINFO` and | |
# `metainfo` arguments defined in constructor. | |
for k, v in metainfo.items(): | |
self._metainfo.setdefault(k, v) | |
return data_list | |