From 0984c3ddcc2a35180e4b9b4dd68ac29ecc84b5ab Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Mon, 7 Mar 2022 22:32:03 +0800 Subject: [PATCH 01/17] [DLMED] add inference example Signed-off-by: Nic Ma --- .../spleen_segmentation/commands/inference.sh | 1 + .../spleen_segmentation/configs/def_args.json | 5 + .../configs/inference.json | 141 ++++++++++++++++++ .../spleen_segmentation/configs/metadata.json | 50 +++++++ .../spleen_segmentation/docs/README.md | 31 ++++ .../spleen_segmentation/docs/license.txt | 6 + 6 files changed, 234 insertions(+) create mode 100644 modules/bundles/spleen_segmentation/commands/inference.sh create mode 100644 modules/bundles/spleen_segmentation/configs/def_args.json create mode 100644 modules/bundles/spleen_segmentation/configs/inference.json create mode 100644 modules/bundles/spleen_segmentation/configs/metadata.json create mode 100644 modules/bundles/spleen_segmentation/docs/README.md create mode 100644 modules/bundles/spleen_segmentation/docs/license.txt diff --git a/modules/bundles/spleen_segmentation/commands/inference.sh b/modules/bundles/spleen_segmentation/commands/inference.sh new file mode 100644 index 0000000000..1c99a8abeb --- /dev/null +++ b/modules/bundles/spleen_segmentation/commands/inference.sh @@ -0,0 +1 @@ +python -m monai.bundle.scripts run --meta_file="../configs/metadata.json" --config_file="../configs/inference.json" --target="evaluator" diff --git a/modules/bundles/spleen_segmentation/configs/def_args.json b/modules/bundles/spleen_segmentation/configs/def_args.json new file mode 100644 index 0000000000..b01736ec7c --- /dev/null +++ b/modules/bundles/spleen_segmentation/configs/def_args.json @@ -0,0 +1,5 @@ +{ + "meta_file": "configs/metadata.json", + "config_file": "configs/inference.json", + "target": "evaluator" +} diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json new file mode 100644 index 0000000000..807044f13f --- /dev/null +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -0,0 +1,141 @@ +{ + "device": "$torch.device('cuda' if torch.cuda.is_available() else 'cpu')", + "network_def": { + "": "UNet", + "": { + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 2, + "channels": [ + 16, + 32, + 64, + 128, + 256 + ], + "strides": [ + 2, + 2, + 2, + 2 + ], + "num_res_units": 2, + "norm": "batch" + } + }, + "network": "$@network_def.to(@device)", + "preprocessing": { + "": "Compose", + "": { + "transforms": [ + { + "": "LoadImaged", + "": { + "keys": "image" + } + }, + { + "": "EnsureChannelFirstd", + "": { + "keys": "image" + } + }, + { + "": "ScaleIntensityRanged", + "": { + "keys": "image", + "a_min": -57, + "a_max": 164, + "b_min": 0, + "b_max": 1, + "clip": true + } + }, + { + "": "EnsureTyped", + "": { + "keys": "image" + } + } + ] + } + }, + "datalist": { + "": "DatasetFunc", + "": { + "data": "$@#dataset_dir + '/dataset.json'", + "func": "$monai.data.load_decathlon_datalist", + "is_segmentation": true, + "data_list_key": "test", + "base_dir": "@#dataset_dir" + } + }, + "dataset": { + "": "Dataset", + "": { + "data": "@datalist", + "transform": "@preprocessing" + } + }, + "dataloader": { + "": "DataLoader", + "": { + "dataset": "@dataset", + "batch_size": 1, + "shuffle": false, + "num_workers": 4 + } + }, + "inferer": { + "": "SlidingWindowInferer", + "": { + "roi_size": [ + 96, + 96, + 96 + ], + "sw_batch_size": 4, + "overlap": 0.5 + } + }, + "postprocessing": { + "": "Compose", + "": { + "transforms": [ + { + "": "Activationsd", + "": { + "keys": "pred", + "softmax": true + } + }, + { + "": "AsDiscreted", + "": { + "keys": "pred", + "argmax": true + } + }, + { + "": "SaveImaged", + "": { + "keys": "pred", + "meta_keys": "image_meta_dict", + "output_dir": "../eval" + } + } + ] + } + }, + "evaluator": { + "": "SupervisedEvaluator", + "": { + "device": "@device", + "val_data_loader": "@dataloader", + "network": "@network", + "inferer": "@inferer", + "postprocessing": "@postprocessing", + "amp": false + } + } +} diff --git a/modules/bundles/spleen_segmentation/configs/metadata.json b/modules/bundles/spleen_segmentation/configs/metadata.json new file mode 100644 index 0000000000..b1fe30d54c --- /dev/null +++ b/modules/bundles/spleen_segmentation/configs/metadata.json @@ -0,0 +1,50 @@ +{ + "version": "0.1.0", + "changelog": {"0.1.0": "complete the model package", "0.0.1": "initialize the model package structure"}, + "monai_version": "0.8.0", + "pytorch_version": "1.10.0", + "numpy_version": "1.21.2", + "optional_packages_version": {"nibabel": "3.2.1"}, + "task": "Decathlon spleen segmentation", + "description": "A pre-trained model for volumetric (3D) segmentation of the spleen from CT image", + "authorship": "MONAI team", + "copyright": "Copyright (c) MONAI Consortium", + "data_source": "Task09_Spleen.tar from http://medicaldecathlon.com/", + "data_type": "dicom", + "dataset_dir": "/workspace/data/Task09_Spleen", + "image_classes": "single channel data, intensity scaled to [0, 1]", + "label_classes": "single channel data, 1 is spleen, 0 is everything else", + "pred_classes": "2 channels OneHot data, channel 1 is spleen, channel 0 is background", + "eval_metrics": {"mean_dice": 0.96}, + "intended_use": "This is an example, not to be used for diagnostic purposes", + "references": [ + "Xia, Yingda, et al. '3D Semi-Supervised Learning with Uncertainty-Aware Multi-View Co-Training. arXiv preprint arXiv:1811.12506 (2018). https://arxiv.org/abs/1811.12506.", + "Kerfoot E., Clough J., Oksuz I., Lee J., King A.P., Schnabel J.A. (2019) Left-Ventricle Quantification Using Residual U-Net. In: Pop M. et al. (eds) Statistical Atlases and Computational Models of the Heart. Atrial Segmentation and LV Quantification Challenges. STACOM 2018. Lecture Notes in Computer Science, vol 11395. Springer, Cham. https://doi.org/10.1007/978-3-030-12029-0_40" + ], + "network_data_format": { + "inputs": { + "image": { + "type": "image", + "format": "magnitude", + "num_channels": 1, + "spatial_shape": [160, 160, 160], + "dtype": "float32", + "value_range": [0, 1], + "is_patch_data": false, + "channel_def": {"0": "image"} + } + }, + "outputs": { + "pred": { + "type": "image", + "format": "segmentation", + "num_channels": 2, + "spatial_shape": [160, 160, 160], + "dtype": "float32", + "value_range": [0, 1], + "is_patch_data": false, + "channel_def": {"0": "background", "1": "spleen"} + } + } + } +} diff --git a/modules/bundles/spleen_segmentation/docs/README.md b/modules/bundles/spleen_segmentation/docs/README.md new file mode 100644 index 0000000000..e8839a7fe8 --- /dev/null +++ b/modules/bundles/spleen_segmentation/docs/README.md @@ -0,0 +1,31 @@ +# Description +A pre-trained model for volumetric (3D) segmentation of the spleen from CT image. + +# Model Overview +This model is trained using the runnerup [1] awarded pipeline of the "Medical Segmentation Decathlon Challenge 2018" using the UNet architecture [2] with 32 training images and 9 validation images. + +## Data +The training dataset is Task09_Spleen.tar from http://medicaldecathlon.com/. + +## Training configuration +The training was performed with command train.sh, which required 12GB-memory GPUs. + +Actual Model Input: 96 x 96 x 96 + +## Input and output formats +Input: 1 channel CT image + +Output: 2 channels: Label 1: spleen; Label 0: everything else + +## Scores +This model achieve the following Dice score on the validation data (our own split from the training dataset): + +Mean dice = 0.96 + +# Disclaimer +This is an example, not to be used for diagnostic purposes. + +# References +[1] Xia, Yingda, et al. "3D Semi-Supervised Learning with Uncertainty-Aware Multi-View Co-Training." arXiv preprint arXiv:1811.12506 (2018). https://arxiv.org/abs/1811.12506. + +[2] Kerfoot E., Clough J., Oksuz I., Lee J., King A.P., Schnabel J.A. (2019) Left-Ventricle Quantification Using Residual U-Net. In: Pop M. et al. (eds) Statistical Atlases and Computational Models of the Heart. Atrial Segmentation and LV Quantification Challenges. STACOM 2018. Lecture Notes in Computer Science, vol 11395. Springer, Cham. https://doi.org/10.1007/978-3-030-12029-0_40 diff --git a/modules/bundles/spleen_segmentation/docs/license.txt b/modules/bundles/spleen_segmentation/docs/license.txt new file mode 100644 index 0000000000..5cffccb114 --- /dev/null +++ b/modules/bundles/spleen_segmentation/docs/license.txt @@ -0,0 +1,6 @@ +Third Party Licenses +----------------------------------------------------------------------- + +/*********************************************************************/ +i. Medical Segmentation Decathlon + http://medicaldecathlon.com/ From ad2060924b77e8b46134e80100e39a68e303d3a5 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 11 Mar 2022 20:46:04 +0800 Subject: [PATCH 02/17] [DLMED] update based on latest design Signed-off-by: Nic Ma --- .../spleen_segmentation/commands/inference.sh | 1 - .../{def_args.json => infer_args.json} | 2 +- .../configs/inference.json | 212 ++++++++---------- .../spleen_segmentation/configs/metadata.json | 2 +- .../configs/verify_meta_args.json | 6 + 5 files changed, 99 insertions(+), 124 deletions(-) delete mode 100644 modules/bundles/spleen_segmentation/commands/inference.sh rename modules/bundles/spleen_segmentation/configs/{def_args.json => infer_args.json} (75%) create mode 100644 modules/bundles/spleen_segmentation/configs/verify_meta_args.json diff --git a/modules/bundles/spleen_segmentation/commands/inference.sh b/modules/bundles/spleen_segmentation/commands/inference.sh deleted file mode 100644 index 1c99a8abeb..0000000000 --- a/modules/bundles/spleen_segmentation/commands/inference.sh +++ /dev/null @@ -1 +0,0 @@ -python -m monai.bundle.scripts run --meta_file="../configs/metadata.json" --config_file="../configs/inference.json" --target="evaluator" diff --git a/modules/bundles/spleen_segmentation/configs/def_args.json b/modules/bundles/spleen_segmentation/configs/infer_args.json similarity index 75% rename from modules/bundles/spleen_segmentation/configs/def_args.json rename to modules/bundles/spleen_segmentation/configs/infer_args.json index b01736ec7c..ec4ed4ac5e 100644 --- a/modules/bundles/spleen_segmentation/configs/def_args.json +++ b/modules/bundles/spleen_segmentation/configs/infer_args.json @@ -1,5 +1,5 @@ { "meta_file": "configs/metadata.json", "config_file": "configs/inference.json", - "target": "evaluator" + "runner_id": "evaluator" } diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 807044f13f..dfecbaad2a 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,141 +1,111 @@ { "device": "$torch.device('cuda' if torch.cuda.is_available() else 'cpu')", "network_def": { - "": "UNet", - "": { - "spatial_dims": 3, - "in_channels": 1, - "out_channels": 2, - "channels": [ - 16, - 32, - 64, - 128, - 256 - ], - "strides": [ - 2, - 2, - 2, - 2 - ], - "num_res_units": 2, - "norm": "batch" - } + "_target_": "UNet", + "spatial_dims": 3, + "in_channels": 1, + "out_channels": 2, + "channels": [ + 16, + 32, + 64, + 128, + 256 + ], + "strides": [ + 2, + 2, + 2, + 2 + ], + "num_res_units": 2, + "norm": "batch" }, "network": "$@network_def.to(@device)", "preprocessing": { - "": "Compose", - "": { - "transforms": [ - { - "": "LoadImaged", - "": { - "keys": "image" - } - }, - { - "": "EnsureChannelFirstd", - "": { - "keys": "image" - } - }, - { - "": "ScaleIntensityRanged", - "": { - "keys": "image", - "a_min": -57, - "a_max": 164, - "b_min": 0, - "b_max": 1, - "clip": true - } - }, - { - "": "EnsureTyped", - "": { - "keys": "image" - } - } - ] - } + "_target_": "Compose", + "transforms": [ + { + "_target_": "LoadImaged", + "keys": "image" + }, + { + "_target_": "EnsureChannelFirstd", + "keys": "image" + }, + { + "_target_": "ScaleIntensityRanged", + "keys": "image", + "a_min": -57, + "a_max": 164, + "b_min": 0, + "b_max": 1, + "clip": true + }, + { + "_target_": "EnsureTyped", + "keys": "image" + } + ] }, "datalist": { - "": "DatasetFunc", - "": { - "data": "$@#dataset_dir + '/dataset.json'", - "func": "$monai.data.load_decathlon_datalist", - "is_segmentation": true, - "data_list_key": "test", - "base_dir": "@#dataset_dir" - } + "_target_": "DatasetFunc", + "data": "$@_meta_#dataset_dir + '/dataset.json'", + "func": "$monai.data.load_decathlon_datalist", + "is_segmentation": true, + "data_list_key": "test", + "base_dir": "@_meta_#dataset_dir" }, "dataset": { - "": "Dataset", - "": { - "data": "@datalist", - "transform": "@preprocessing" - } + "_target_": "Dataset", + "data": "@datalist", + "transform": "@preprocessing" }, "dataloader": { - "": "DataLoader", - "": { - "dataset": "@dataset", - "batch_size": 1, - "shuffle": false, - "num_workers": 4 - } + "_target_": "DataLoader", + "dataset": "@dataset", + "batch_size": 1, + "shuffle": false, + "num_workers": 4 }, "inferer": { - "": "SlidingWindowInferer", - "": { - "roi_size": [ - 96, - 96, - 96 - ], - "sw_batch_size": 4, - "overlap": 0.5 - } + "_target_": "SlidingWindowInferer", + "roi_size": [ + 96, + 96, + 96 + ], + "sw_batch_size": 4, + "overlap": 0.5 }, "postprocessing": { - "": "Compose", - "": { - "transforms": [ - { - "": "Activationsd", - "": { - "keys": "pred", - "softmax": true - } - }, - { - "": "AsDiscreted", - "": { - "keys": "pred", - "argmax": true - } - }, - { - "": "SaveImaged", - "": { - "keys": "pred", - "meta_keys": "image_meta_dict", - "output_dir": "../eval" - } - } - ] - } + "_target_": "Compose", + "transforms": [ + { + "_target_": "Activationsd", + "keys": "pred", + "softmax": true + }, + { + "_target_": "AsDiscreted", + "keys": "pred", + "argmax": true + }, + { + "_target_": "SaveImaged", + "keys": "pred", + "meta_keys": "image_meta_dict", + "output_dir": "eval" + } + ] }, "evaluator": { - "": "SupervisedEvaluator", - "": { - "device": "@device", - "val_data_loader": "@dataloader", - "network": "@network", - "inferer": "@inferer", - "postprocessing": "@postprocessing", - "amp": false - } + "_target_": "SupervisedEvaluator", + "device": "@device", + "val_data_loader": "@dataloader", + "network": "@network", + "inferer": "@inferer", + "postprocessing": "@postprocessing", + "amp": false } } diff --git a/modules/bundles/spleen_segmentation/configs/metadata.json b/modules/bundles/spleen_segmentation/configs/metadata.json index b1fe30d54c..3169abd561 100644 --- a/modules/bundles/spleen_segmentation/configs/metadata.json +++ b/modules/bundles/spleen_segmentation/configs/metadata.json @@ -11,7 +11,7 @@ "copyright": "Copyright (c) MONAI Consortium", "data_source": "Task09_Spleen.tar from http://medicaldecathlon.com/", "data_type": "dicom", - "dataset_dir": "/workspace/data/Task09_Spleen", + "dataset_dir": "/workspace/data/medical/spleen", "image_classes": "single channel data, intensity scaled to [0, 1]", "label_classes": "single channel data, 1 is spleen, 0 is everything else", "pred_classes": "2 channels OneHot data, channel 1 is spleen, channel 0 is background", diff --git a/modules/bundles/spleen_segmentation/configs/verify_meta_args.json b/modules/bundles/spleen_segmentation/configs/verify_meta_args.json new file mode 100644 index 0000000000..3504887bd2 --- /dev/null +++ b/modules/bundles/spleen_segmentation/configs/verify_meta_args.json @@ -0,0 +1,6 @@ +{ + "meta_file": "configs/metadata.json", + "schema_url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/meta_schema_202202281232.json", + "filepath": "eval/schema.json", + "result_path": "eval/results.txt" +} From 48222d237e84dac782ec201001c63f13ad70e8f0 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 08:45:14 +0800 Subject: [PATCH 03/17] [DLMED] update config content Signed-off-by: Nic Ma --- .../configs/inference.json | 7 +-- .../spleen_segmentation/configs/metadata.json | 46 +++++++++++++++---- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index dfecbaad2a..86e641177d 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,5 +1,6 @@ { - "device": "$torch.device('cuda' if torch.cuda.is_available() else 'cpu')", + "dataset_dir": "/workspace/data/medical/spleen", + "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "network_def": { "_target_": "UNet", "spatial_dims": 3, @@ -50,11 +51,11 @@ }, "datalist": { "_target_": "DatasetFunc", - "data": "$@_meta_#dataset_dir + '/dataset.json'", + "data": "$@dataset_dir + '/dataset.json'", "func": "$monai.data.load_decathlon_datalist", "is_segmentation": true, "data_list_key": "test", - "base_dir": "@_meta_#dataset_dir" + "base_dir": "@dataset_dir" }, "dataset": { "_target_": "Dataset", diff --git a/modules/bundles/spleen_segmentation/configs/metadata.json b/modules/bundles/spleen_segmentation/configs/metadata.json index 3169abd561..a82ae559f2 100644 --- a/modules/bundles/spleen_segmentation/configs/metadata.json +++ b/modules/bundles/spleen_segmentation/configs/metadata.json @@ -1,21 +1,28 @@ { + "schema": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/meta_schema_202203130950.json", "version": "0.1.0", - "changelog": {"0.1.0": "complete the model package", "0.0.1": "initialize the model package structure"}, + "changelog": { + "0.1.0": "complete the model package", + "0.0.1": "initialize the model package structure" + }, "monai_version": "0.8.0", "pytorch_version": "1.10.0", "numpy_version": "1.21.2", - "optional_packages_version": {"nibabel": "3.2.1"}, + "optional_packages_version": { + "nibabel": "3.2.1" + }, "task": "Decathlon spleen segmentation", "description": "A pre-trained model for volumetric (3D) segmentation of the spleen from CT image", "authorship": "MONAI team", "copyright": "Copyright (c) MONAI Consortium", "data_source": "Task09_Spleen.tar from http://medicaldecathlon.com/", "data_type": "dicom", - "dataset_dir": "/workspace/data/medical/spleen", "image_classes": "single channel data, intensity scaled to [0, 1]", "label_classes": "single channel data, 1 is spleen, 0 is everything else", "pred_classes": "2 channels OneHot data, channel 1 is spleen, channel 0 is background", - "eval_metrics": {"mean_dice": 0.96}, + "eval_metrics": { + "mean_dice": 0.96 + }, "intended_use": "This is an example, not to be used for diagnostic purposes", "references": [ "Xia, Yingda, et al. '3D Semi-Supervised Learning with Uncertainty-Aware Multi-View Co-Training. arXiv preprint arXiv:1811.12506 (2018). https://arxiv.org/abs/1811.12506.", @@ -27,11 +34,20 @@ "type": "image", "format": "magnitude", "num_channels": 1, - "spatial_shape": [160, 160, 160], + "spatial_shape": [ + 160, + 160, + 160 + ], "dtype": "float32", - "value_range": [0, 1], + "value_range": [ + 0, + 1 + ], "is_patch_data": false, - "channel_def": {"0": "image"} + "channel_def": { + "0": "image" + } } }, "outputs": { @@ -39,11 +55,21 @@ "type": "image", "format": "segmentation", "num_channels": 2, - "spatial_shape": [160, 160, 160], + "spatial_shape": [ + 160, + 160, + 160 + ], "dtype": "float32", - "value_range": [0, 1], + "value_range": [ + 0, + 1 + ], "is_patch_data": false, - "channel_def": {"0": "background", "1": "spleen"} + "channel_def": { + "0": "background", + "1": "spleen" + } } } } From d8dcad3946f0c31686fad2ae55a3e91138255aeb Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 10:23:25 +0800 Subject: [PATCH 04/17] [DLMED] update to latest design Signed-off-by: Nic Ma --- .../spleen_segmentation/configs/infer_args.json | 5 ----- .../bundles/spleen_segmentation/configs/metadata.json | 2 +- .../spleen_segmentation/configs/verify_meta_args.json | 6 ------ modules/bundles/spleen_segmentation/docs/README.md | 10 +++++++++- 4 files changed, 10 insertions(+), 13 deletions(-) delete mode 100644 modules/bundles/spleen_segmentation/configs/infer_args.json delete mode 100644 modules/bundles/spleen_segmentation/configs/verify_meta_args.json diff --git a/modules/bundles/spleen_segmentation/configs/infer_args.json b/modules/bundles/spleen_segmentation/configs/infer_args.json deleted file mode 100644 index ec4ed4ac5e..0000000000 --- a/modules/bundles/spleen_segmentation/configs/infer_args.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "meta_file": "configs/metadata.json", - "config_file": "configs/inference.json", - "runner_id": "evaluator" -} diff --git a/modules/bundles/spleen_segmentation/configs/metadata.json b/modules/bundles/spleen_segmentation/configs/metadata.json index a82ae559f2..42a55b114c 100644 --- a/modules/bundles/spleen_segmentation/configs/metadata.json +++ b/modules/bundles/spleen_segmentation/configs/metadata.json @@ -1,5 +1,5 @@ { - "schema": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/meta_schema_202203130950.json", + "schema": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/meta_schema_202203171008.json", "version": "0.1.0", "changelog": { "0.1.0": "complete the model package", diff --git a/modules/bundles/spleen_segmentation/configs/verify_meta_args.json b/modules/bundles/spleen_segmentation/configs/verify_meta_args.json deleted file mode 100644 index 3504887bd2..0000000000 --- a/modules/bundles/spleen_segmentation/configs/verify_meta_args.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "meta_file": "configs/metadata.json", - "schema_url": "https://github.com/Project-MONAI/MONAI-extra-test-data/releases/download/0.8.1/meta_schema_202202281232.json", - "filepath": "eval/schema.json", - "result_path": "eval/results.txt" -} diff --git a/modules/bundles/spleen_segmentation/docs/README.md b/modules/bundles/spleen_segmentation/docs/README.md index e8839a7fe8..19f33e39e2 100644 --- a/modules/bundles/spleen_segmentation/docs/README.md +++ b/modules/bundles/spleen_segmentation/docs/README.md @@ -8,7 +8,7 @@ This model is trained using the runnerup [1] awarded pipeline of the "Medical Se The training dataset is Task09_Spleen.tar from http://medicaldecathlon.com/. ## Training configuration -The training was performed with command train.sh, which required 12GB-memory GPUs. +The training was performed with at least 12GB-memory GPUs. Actual Model Input: 96 x 96 x 96 @@ -22,6 +22,14 @@ This model achieve the following Dice score on the validation data (our own spli Mean dice = 0.96 +## commands example +Execute inference: +`python -m monai.bundle run evaluator --meta_file configs/metadata.json --config_file configs/inference.json` +Verify the metadata format: +`python -m monai.bundle verify_metadata --meta_file configs/metadata.json --filepath eval/schema.json` +Verify the data shape of network: +`python -m monai.bundle verify_net_in_out network_def --meta_file configs/metadata.json --config_file configs/inference.json` + # Disclaimer This is an example, not to be used for diagnostic purposes. From 6f8a007bfcd1794c88a0f3e7f7704db37f364e64 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 19:49:12 +0800 Subject: [PATCH 05/17] [DLMED] update according to comments Signed-off-by: Nic Ma --- .../spleen_segmentation/configs/inference.json | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 86e641177d..3620b1617e 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,5 +1,6 @@ { - "dataset_dir": "/workspace/data/medical/spleen", + "dataset_dir": "/workspace/data/medical/Task09_Spleen", + "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "network_def": { "_target_": "UNet", @@ -49,14 +50,7 @@ } ] }, - "datalist": { - "_target_": "DatasetFunc", - "data": "$@dataset_dir + '/dataset.json'", - "func": "$monai.data.load_decathlon_datalist", - "is_segmentation": true, - "data_list_key": "test", - "base_dir": "@dataset_dir" - }, + "datalist": "$[{'image': i} for i in sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz'))]", "dataset": { "_target_": "Dataset", "data": "@datalist", From eddbec7bb0f61a9cc97668dd00de82747bb5099e Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 20:47:45 +0800 Subject: [PATCH 06/17] [DLMED] enhance the expression Signed-off-by: Nic Ma --- modules/bundles/spleen_segmentation/configs/inference.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 3620b1617e..ae66548280 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -50,10 +50,10 @@ } ] }, - "datalist": "$[{'image': i} for i in sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz'))]", + "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "dataset": { "_target_": "Dataset", - "data": "@datalist", + "data": "$[{'image': i} for i in @datalist]", "transform": "@preprocessing" }, "dataloader": { From 6cebebe55490ed786046ef3144d813f60529f3bc Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 21:00:43 +0800 Subject: [PATCH 07/17] [DLMED] add more transforms Signed-off-by: Nic Ma --- .../configs/inference.json | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index ae66548280..f5837a739b 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -35,6 +35,17 @@ "_target_": "EnsureChannelFirstd", "keys": "image" }, + { + "_target_": "Orientationd", + "keys": "image", + "axcodes": "RAS" + }, + { + "_target_": "Spacingd", + "keys": "image", + "pixdim": [1.5, 1.5, 2.0], + "mode": "bilinear" + }, { "_target_": "ScaleIntensityRanged", "keys": "image", @@ -81,6 +92,15 @@ "keys": "pred", "softmax": true }, + { + "_target_": "Invertd", + "keys": "pred", + "transform": "@preprocessing", + "orig_keys": "image", + "meta_key_postfix": "meta_dict", + "nearest_interp": false, + "to_tensor": true + }, { "_target_": "AsDiscreted", "keys": "pred", @@ -89,11 +109,12 @@ { "_target_": "SaveImaged", "keys": "pred", - "meta_keys": "image_meta_dict", + "meta_keys": "pred_meta_dict", "output_dir": "eval" } ] }, + "evaluator": { "_target_": "SupervisedEvaluator", "device": "@device", From 16f1e5b57ce7d48d0b27e1c0fe1cf8ae917c9cfe Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 17 Mar 2022 21:32:44 +0800 Subject: [PATCH 08/17] [DLMED] adjust config Signed-off-by: Nic Ma --- modules/bundles/spleen_segmentation/configs/inference.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index f5837a739b..a2debb8fed 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,6 +1,6 @@ { "dataset_dir": "/workspace/data/medical/Task09_Spleen", - + "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "network_def": { "_target_": "UNet", @@ -61,7 +61,6 @@ } ] }, - "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "dataset": { "_target_": "Dataset", "data": "$[{'image': i} for i in @datalist]", From 685b42bbb74d925df90f9d135aff3afab1d88913 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 18 Mar 2022 17:26:01 +0800 Subject: [PATCH 09/17] [DLMED] add checkpoint logic Signed-off-by: Nic Ma --- .../configs/inference.json | 19 +++++++++++++++++-- .../spleen_segmentation/docs/README.md | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index a2debb8fed..085f51863d 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,7 +1,9 @@ { "dataset_dir": "/workspace/data/medical/Task09_Spleen", - "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", + "ckpt_path": "../models/model.pt", + "log": "$__import__('logging').basicConfig(level=20)", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", + "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "network_def": { "_target_": "UNet", "spatial_dims": 3, @@ -113,7 +115,19 @@ } ] }, - + "handlers": [ + { + "_target_": "CheckpointLoader", + "_disabled_": "$not __import__('os').path.exists(@ckpt_path)", + "load_path": "@ckpt_path", + "load_dict": {"model": "@network"} + }, + { + "_target_": "StatsHandler", + "_disabled_": "@log", + "iteration_log": false + } + ], "evaluator": { "_target_": "SupervisedEvaluator", "device": "@device", @@ -121,6 +135,7 @@ "network": "@network", "inferer": "@inferer", "postprocessing": "@postprocessing", + "val_handlers": "@handlers", "amp": false } } diff --git a/modules/bundles/spleen_segmentation/docs/README.md b/modules/bundles/spleen_segmentation/docs/README.md index 19f33e39e2..b583d96506 100644 --- a/modules/bundles/spleen_segmentation/docs/README.md +++ b/modules/bundles/spleen_segmentation/docs/README.md @@ -29,6 +29,8 @@ Verify the metadata format: `python -m monai.bundle verify_metadata --meta_file configs/metadata.json --filepath eval/schema.json` Verify the data shape of network: `python -m monai.bundle verify_net_in_out network_def --meta_file configs/metadata.json --config_file configs/inference.json` +Export checkpoint to TorchScript file: +`python -m monai.bundle export network_def --filepath models/model.ts --ckpt_file models/model.pt --meta_file configs/metadata.json --config_file configs/inference.json` # Disclaimer This is an example, not to be used for diagnostic purposes. From 92d2e0b2595a4a659de1b7244c857267a7d96ce2 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 18 Mar 2022 18:05:35 +0800 Subject: [PATCH 10/17] [DLMED] add checkpoint test Signed-off-by: Nic Ma --- modules/bundles/spleen_segmentation/configs/inference.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 085f51863d..48ea4a0d57 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,6 +1,6 @@ { "dataset_dir": "/workspace/data/medical/Task09_Spleen", - "ckpt_path": "../models/model.pt", + "ckpt_path": "/workspace/data/medical/tutorials/modules/bundles/spleen_segmentation/models/model.pt", "log": "$__import__('logging').basicConfig(level=20)", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", From 8a89c18a5e086576fe4a18ffe9b0a7d99a829e58 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Mon, 21 Mar 2022 22:59:36 +0800 Subject: [PATCH 11/17] [DLMED] update imports Signed-off-by: Nic Ma --- .../spleen_segmentation/configs/inference.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 48ea4a0d57..29eb4ea841 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,9 +1,14 @@ { + "imports": [ + "$import glob", + "$import logging", + "$import os" + ], "dataset_dir": "/workspace/data/medical/Task09_Spleen", "ckpt_path": "/workspace/data/medical/tutorials/modules/bundles/spleen_segmentation/models/model.pt", - "log": "$__import__('logging').basicConfig(level=20)", + "log": "$logging.basicConfig(level=20)", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", - "datalist": "$list(sorted(__import__('glob').glob(@dataset_dir + '/imagesTs/*.nii.gz')))", + "datalist": "$list(sorted(glob.glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "network_def": { "_target_": "UNet", "spatial_dims": 3, @@ -118,7 +123,7 @@ "handlers": [ { "_target_": "CheckpointLoader", - "_disabled_": "$not __import__('os').path.exists(@ckpt_path)", + "_disabled_": "$not os.path.exists(@ckpt_path)", "load_path": "@ckpt_path", "load_dict": {"model": "@network"} }, From 8f1aeaa5893477ea67a803ba58448b551b14a653 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 24 Mar 2022 16:28:56 +0800 Subject: [PATCH 12/17] [DLMED] update for _requires_ Signed-off-by: Nic Ma --- modules/bundles/spleen_segmentation/configs/inference.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 29eb4ea841..8dcf9ac2eb 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -4,9 +4,9 @@ "$import logging", "$import os" ], + "cudnn_opt": "#setattr(torch.backends.cudnn, 'benchmark', True)", "dataset_dir": "/workspace/data/medical/Task09_Spleen", "ckpt_path": "/workspace/data/medical/tutorials/modules/bundles/spleen_segmentation/models/model.pt", - "log": "$logging.basicConfig(level=20)", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "datalist": "$list(sorted(glob.glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "network_def": { @@ -129,12 +129,12 @@ }, { "_target_": "StatsHandler", - "_disabled_": "@log", "iteration_log": false } ], "evaluator": { "_target_": "SupervisedEvaluator", + "_requires_": "cudnn_opt", "device": "@device", "val_data_loader": "@dataloader", "network": "@network", From 8a51fa2554397befedfa5660b1552f2542e64962 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 24 Mar 2022 16:42:31 +0800 Subject: [PATCH 13/17] [DLMED] add logging Signed-off-by: Nic Ma --- .../spleen_segmentation/configs/logging.conf | 27 +++++++++++++++++++ .../spleen_segmentation/docs/README.md | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 modules/bundles/spleen_segmentation/configs/logging.conf diff --git a/modules/bundles/spleen_segmentation/configs/logging.conf b/modules/bundles/spleen_segmentation/configs/logging.conf new file mode 100644 index 0000000000..2e3404e0ab --- /dev/null +++ b/modules/bundles/spleen_segmentation/configs/logging.conf @@ -0,0 +1,27 @@ +[loggers] +keys=root,ignite.engine.SupervisedEvaluator + +[handlers] +keys=consoleHandler + +[formatters] +keys=fullFormatter + +[logger_root] +level=INFO +handlers=consoleHandler + +[logger_ignite.engine.SupervisedEvaluator] +level=INFO +handlers=consoleHandler +qualname=ignite.engine.SupervisedEvaluator +propagate=0 + +[handler_consoleHandler] +class=StreamHandler +level=INFO +formatter=fullFormatter +args=(sys.stdout,) + +[formatter_fullFormatter] +format=%(asctime)s - %(name)s - %(levelname)s - %(message)s diff --git a/modules/bundles/spleen_segmentation/docs/README.md b/modules/bundles/spleen_segmentation/docs/README.md index b583d96506..0b253ea841 100644 --- a/modules/bundles/spleen_segmentation/docs/README.md +++ b/modules/bundles/spleen_segmentation/docs/README.md @@ -24,7 +24,7 @@ Mean dice = 0.96 ## commands example Execute inference: -`python -m monai.bundle run evaluator --meta_file configs/metadata.json --config_file configs/inference.json` +`python -m monai.bundle run evaluator --meta_file configs/metadata.json --config_file configs/inference.json --logging_file configs/logging.conf` Verify the metadata format: `python -m monai.bundle verify_metadata --meta_file configs/metadata.json --filepath eval/schema.json` Verify the data shape of network: From 36f5ffd4bbb8b3cc69f40e90a7ac7c49e5b3cbb0 Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Thu, 24 Mar 2022 19:17:18 +0800 Subject: [PATCH 14/17] [DLMED] fix typo Signed-off-by: Nic Ma --- .../bundles/spleen_segmentation/configs/inference.json | 5 ++--- modules/bundles/spleen_segmentation/configs/logging.conf | 8 +------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index 8dcf9ac2eb..a91c4a7179 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -1,10 +1,9 @@ { "imports": [ "$import glob", - "$import logging", "$import os" ], - "cudnn_opt": "#setattr(torch.backends.cudnn, 'benchmark', True)", + "cudnn_opt": "$setattr(torch.backends.cudnn, 'benchmark', True)", "dataset_dir": "/workspace/data/medical/Task09_Spleen", "ckpt_path": "/workspace/data/medical/tutorials/modules/bundles/spleen_segmentation/models/model.pt", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", @@ -134,7 +133,7 @@ ], "evaluator": { "_target_": "SupervisedEvaluator", - "_requires_": "cudnn_opt", + "_requires_": "@cudnn_opt", "device": "@device", "val_data_loader": "@dataloader", "network": "@network", diff --git a/modules/bundles/spleen_segmentation/configs/logging.conf b/modules/bundles/spleen_segmentation/configs/logging.conf index 2e3404e0ab..91c1a21c16 100644 --- a/modules/bundles/spleen_segmentation/configs/logging.conf +++ b/modules/bundles/spleen_segmentation/configs/logging.conf @@ -1,5 +1,5 @@ [loggers] -keys=root,ignite.engine.SupervisedEvaluator +keys=root [handlers] keys=consoleHandler @@ -11,12 +11,6 @@ keys=fullFormatter level=INFO handlers=consoleHandler -[logger_ignite.engine.SupervisedEvaluator] -level=INFO -handlers=consoleHandler -qualname=ignite.engine.SupervisedEvaluator -propagate=0 - [handler_consoleHandler] class=StreamHandler level=INFO From ed7f31c8090f4057318a36941f399f96b024f7c5 Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Thu, 24 Mar 2022 16:10:20 +0000 Subject: [PATCH 15/17] Update README.md --- .../spleen_segmentation/docs/README.md | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/modules/bundles/spleen_segmentation/docs/README.md b/modules/bundles/spleen_segmentation/docs/README.md index 0b253ea841..bab58e643c 100644 --- a/modules/bundles/spleen_segmentation/docs/README.md +++ b/modules/bundles/spleen_segmentation/docs/README.md @@ -2,7 +2,7 @@ A pre-trained model for volumetric (3D) segmentation of the spleen from CT image. # Model Overview -This model is trained using the runnerup [1] awarded pipeline of the "Medical Segmentation Decathlon Challenge 2018" using the UNet architecture [2] with 32 training images and 9 validation images. +This model is trained using the runner-up [1] awarded pipeline of the "Medical Segmentation Decathlon Challenge 2018" using the UNet architecture [2] with 32 training images and 9 validation images. ## Data The training dataset is Task09_Spleen.tar from http://medicaldecathlon.com/. @@ -18,19 +18,27 @@ Input: 1 channel CT image Output: 2 channels: Label 1: spleen; Label 0: everything else ## Scores -This model achieve the following Dice score on the validation data (our own split from the training dataset): +This model achieves the following Dice score on the validation data (our own split from the training dataset): -Mean dice = 0.96 +Mean Dice = 0.96 ## commands example Execute inference: -`python -m monai.bundle run evaluator --meta_file configs/metadata.json --config_file configs/inference.json --logging_file configs/logging.conf` +``` +python -m monai.bundle run evaluator --meta_file configs/metadata.json --config_file configs/inference.json --logging_file configs/logging.conf +``` Verify the metadata format: -`python -m monai.bundle verify_metadata --meta_file configs/metadata.json --filepath eval/schema.json` +``` +python -m monai.bundle verify_metadata --meta_file configs/metadata.json --filepath eval/schema.json +``` Verify the data shape of network: -`python -m monai.bundle verify_net_in_out network_def --meta_file configs/metadata.json --config_file configs/inference.json` +``` +python -m monai.bundle verify_net_in_out network_def --meta_file configs/metadata.json --config_file configs/inference.json +``` Export checkpoint to TorchScript file: -`python -m monai.bundle export network_def --filepath models/model.ts --ckpt_file models/model.pt --meta_file configs/metadata.json --config_file configs/inference.json` +``` +python -m monai.bundle export network_def --filepath models/model.ts --ckpt_file models/model.pt --meta_file configs/metadata.json --config_file configs/inference.json +``` # Disclaimer This is an example, not to be used for diagnostic purposes. From 00f82e46c0c17d103ad5e9b7ce4939ad379ef2ec Mon Sep 17 00:00:00 2001 From: Wenqi Li <831580+wyli@users.noreply.github.com> Date: Thu, 24 Mar 2022 16:14:35 +0000 Subject: [PATCH 16/17] Update metadata.json --- modules/bundles/spleen_segmentation/configs/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/bundles/spleen_segmentation/configs/metadata.json b/modules/bundles/spleen_segmentation/configs/metadata.json index 42a55b114c..7a53694758 100644 --- a/modules/bundles/spleen_segmentation/configs/metadata.json +++ b/modules/bundles/spleen_segmentation/configs/metadata.json @@ -13,7 +13,7 @@ }, "task": "Decathlon spleen segmentation", "description": "A pre-trained model for volumetric (3D) segmentation of the spleen from CT image", - "authorship": "MONAI team", + "authors": "MONAI team", "copyright": "Copyright (c) MONAI Consortium", "data_source": "Task09_Spleen.tar from http://medicaldecathlon.com/", "data_type": "dicom", From 07d82048b69fbb81e331b363da431d53402420bb Mon Sep 17 00:00:00 2001 From: Nic Ma Date: Fri, 25 Mar 2022 21:04:12 +0800 Subject: [PATCH 17/17] [DLMED] add hugging face download Signed-off-by: Nic Ma --- modules/bundles/spleen_segmentation/configs/inference.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/bundles/spleen_segmentation/configs/inference.json b/modules/bundles/spleen_segmentation/configs/inference.json index a91c4a7179..52a7c20e86 100644 --- a/modules/bundles/spleen_segmentation/configs/inference.json +++ b/modules/bundles/spleen_segmentation/configs/inference.json @@ -4,8 +4,9 @@ "$import os" ], "cudnn_opt": "$setattr(torch.backends.cudnn, 'benchmark', True)", - "dataset_dir": "/workspace/data/medical/Task09_Spleen", - "ckpt_path": "/workspace/data/medical/tutorials/modules/bundles/spleen_segmentation/models/model.pt", + "dataset_dir": "/workspace/data/Task09_Spleen", + "ckpt_path": "/workspace/data/tutorials/modules/bundles/spleen_segmentation/models/model.pt", + "download_ckpt": "$monai.apps.utils.download_url('https://huggingface.co/MONAI/example_spleen_segmentation/resolve/main/model.pt', @ckpt_path)", "device": "$torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')", "datalist": "$list(sorted(glob.glob(@dataset_dir + '/imagesTs/*.nii.gz')))", "network_def": { @@ -122,6 +123,7 @@ "handlers": [ { "_target_": "CheckpointLoader", + "_requires_": "@download_ckpt", "_disabled_": "$not os.path.exists(@ckpt_path)", "load_path": "@ckpt_path", "load_dict": {"model": "@network"}