From 94c7fb7982561405cdf17dd7fe9cc99ea4b8f4a0 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 03:52:58 +0000 Subject: [PATCH 01/12] function to run nnunet --- platipy/imaging/projects/cardiac/run.py | 24 +++++ platipy/imaging/projects/nnunet/__init__.py | 0 platipy/imaging/projects/nnunet/run.py | 109 ++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 platipy/imaging/projects/nnunet/__init__.py create mode 100644 platipy/imaging/projects/nnunet/run.py diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index 790c2921..afd90fcb 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -54,6 +54,8 @@ from platipy.imaging.label.utils import binary_encode_structure_list, correct_volume_overlap +from platipy.imaging.projects.nnunet.run import run_segmentation, NNUNET_SETTINGS_DEFAULTS + ATLAS_PATH = "/atlas" if "ATLAS_PATH" in os.environ: ATLAS_PATH = os.environ["ATLAS_PATH"] @@ -255,6 +257,28 @@ "return_proba_as_contours": False, } +HYBRID_SETTINGS = { + "nnunet": NNUNET_SETTINGS_DEFAULTS, + "cardiac": CARDIAC_SETTINGS_DEFAULTS +} + +# Set to the Open Heart model by default +HYBRID_SETTINGS["nnunet"]["task"] = "Task400_OPEN_HEART_3d_lowres" + +def run_cardiac_hybrid_segmentation(img, settings=HYBRID_SETTINGS): + + # Run nnUNet wholeheart + nnunet_results = run_segmentation(img, settings=settings["nnunet"]) + + nnunet_structures = list(nnunet_results.keys()) + + # Should only be one structure + if len(nnunet_structures) != 1: + raise SystemError(f"Expected 1 structure from nnUNet but got {len(nnunet_structures)}") + + wholeheart = nnunet_results[nnunet_structures[0]] + + return run_cardiac_segmentation(img, guide_structure=wholeheart, settings=settings["cardiac"]) def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTINGS_DEFAULTS): """Runs the atlas-based cardiac segmentation diff --git a/platipy/imaging/projects/nnunet/__init__.py b/platipy/imaging/projects/nnunet/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/platipy/imaging/projects/nnunet/run.py b/platipy/imaging/projects/nnunet/run.py new file mode 100644 index 00000000..b18f450e --- /dev/null +++ b/platipy/imaging/projects/nnunet/run.py @@ -0,0 +1,109 @@ + +import os +import tempfile +from pathlib import Path +from loguru import logger + +import SimpleITK as sitk + +from nnunet.inference.pretrained_models.download_pretrained_model import get_available_models, download_and_install_from_url + +def available_nnunet_models(): + + available_models = get_available_models() + available_models["Task400_OPEN_HEART_3d_lowres"] = { + 'description': "Whole heart model (all folds, 3d_lowres only) trained on data from" + "TCIA (NSCLC-Radiomics & LCTSC)", + 'url': "https://zenodo.org/record/6585664/files/Task400_OPEN_HEART_3d_lowres.zip?download=1" + } + return available_models + +NNUNET_SETTINGS_DEFAULTS = { + "task": "Task400_OPEN_HEART_3d_lowres", + "trainer_class_name": "nnUNetTrainerV2", + "cascade_trainer_class_name": "nnUNetTrainerV2CascadeFullRes", + "folds": None, + "model": "3d_lowres", + "lowres_segmentations": None, + "num_threads_preprocessing": 6, + "num_threads_nifti_save": 2, + "disable_tta": False, + "all_in_gpu": None, + "disable_mixed_precision": False, + "chk": "model_final_checkpoint" +} + +def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): + + if not "RESULTS_FOLDER" in os.environ: + home = Path.home() + platipy_dir = home.joinpath(".platipy") + home.mkdir(exist_ok=True) + os.environ["RESULTS_FOLDER"] = str(platipy_dir.joinpath("nnUNet_models")) + + nnunet_model_path = Path(os.environ["RESULTS_FOLDER"]) + + task = settings["task"] + + # Check if task model is already installed + task_path = nnunet_model_path.joinpath("nnUNet", model, task) + + if not task_path.exists(): + # Check if the task is available and install it if so + available_models = available_nnunet_models() + + if not task in available_models: + raise ValueError(f"{task} not available") + + task_url = available_models[task]["url"] + logger.info("Installing Task from URL") + download_and_install_from_url(task_url) + + # Prepare the image in a temporary directory for nnunet to run on + input_path = Path(tempfile.mkdtemp()) + io_path = input_path.joinpath(f"{settings['task']}_0000.nii.gz") + sitk.WriteImage(img, str(io_path)) + + output_path = Path(tempfile.mkdtemp()) + + model = settings["model"] + folds = settings["folds"] + num_threads_preprocessing = settings["num_threads_preprocessing"] + num_threads_nifti_save = settings["num_threads_nifti_save"] + lowres_segmentations = settings["lowres_segmentations"] + all_in_gpu = settings["all_in_gpu"] + disable_mixed_precision = settings["disable_mixed_precision"] + disable_tta = settings["disable_tta"] + trainer_class_name = settings["trainer_class_name"] + cascade_trainer_class_name = settings["cascade_trainer_class_name"] + mode = "normal" + default_plans_identifier = "nnUNetPlansv2.1" + chk = settings["chk"] + + if model == "3d_cascade_fullres": + trainer = cascade_trainer_class_name + else: + trainer = trainer_class_name + + model_folder_name = task_path.joinpath(trainer + f"__{default_plans_identifier}") + + # Import in here to make sure environment is already set + from nnunet.inference.predict import predict_from_folder + + predict_from_folder(str(model_folder_name), str(input_path), str(output_path), folds, False, + num_threads_preprocessing, num_threads_nifti_save, lowres_segmentations, 0, 1, + not disable_tta, overwrite_existing=True, mode=mode, overwrite_all_in_gpu=all_in_gpu, + mixed_precision=not disable_mixed_precision, step_size=0.5, checkpoint_name=chk) + + results = {} + for op in output_path.glob("*.nii.gz"): + + label_map = sitk.ReadImage(str(op)) + num_labels = sitk.GetArrayViewFromImage(label_map).max() + + for l in range(num_labels): + results[f"Struct_{l}"] = label_map == (l+1) + + os.remove(io_path) + + return results From 8c7428de3f60c6bdde6451a73d6215282b786920 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 04:35:13 +0000 Subject: [PATCH 02/12] Restore some changes --- platipy/imaging/projects/cardiac/run.py | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index afd90fcb..790c2921 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -54,8 +54,6 @@ from platipy.imaging.label.utils import binary_encode_structure_list, correct_volume_overlap -from platipy.imaging.projects.nnunet.run import run_segmentation, NNUNET_SETTINGS_DEFAULTS - ATLAS_PATH = "/atlas" if "ATLAS_PATH" in os.environ: ATLAS_PATH = os.environ["ATLAS_PATH"] @@ -257,28 +255,6 @@ "return_proba_as_contours": False, } -HYBRID_SETTINGS = { - "nnunet": NNUNET_SETTINGS_DEFAULTS, - "cardiac": CARDIAC_SETTINGS_DEFAULTS -} - -# Set to the Open Heart model by default -HYBRID_SETTINGS["nnunet"]["task"] = "Task400_OPEN_HEART_3d_lowres" - -def run_cardiac_hybrid_segmentation(img, settings=HYBRID_SETTINGS): - - # Run nnUNet wholeheart - nnunet_results = run_segmentation(img, settings=settings["nnunet"]) - - nnunet_structures = list(nnunet_results.keys()) - - # Should only be one structure - if len(nnunet_structures) != 1: - raise SystemError(f"Expected 1 structure from nnUNet but got {len(nnunet_structures)}") - - wholeheart = nnunet_results[nnunet_structures[0]] - - return run_cardiac_segmentation(img, guide_structure=wholeheart, settings=settings["cardiac"]) def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTINGS_DEFAULTS): """Runs the atlas-based cardiac segmentation From bb71dc89924ba572d4c42707f5d0e47e1683605f Mon Sep 17 00:00:00 2001 From: rnfinnegan Date: Mon, 30 May 2022 04:36:59 +0000 Subject: [PATCH 03/12] update hybrid seg code --- platipy/imaging/projects/cardiac/run.py | 142 ++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index 790c2921..beb31cc7 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -255,6 +255,148 @@ "return_proba_as_contours": False, } +OPEN_ATLAS_SETTINGS = CARDIAC_SETTINGS_DEFAULTS.copy() +OPEN_ATLAS_SETTINGS["atlas_settings"] = { + "atlas_id_list": [ + "LCTSC-Test-S2-201", + "LCTSC-Test-S2-203", + "LCTSC-Test-S3-201", + "LCTSC-Train-S1-007", + "LCTSC-Train-S2-005", + "LCTSC-Train-S3-004", + "LUNG1-002", + "LUNG1-009", + "LUNG1-021", + "LUNG1-027", + "LUNG1-035", + "LUNG1-037", + "LUNG1-055", + "LUNG1-067", + "LUNG1-074", + "LUNG1-076", + "LUNG1-092", + "LUNG1-143", + "LUNG1-210", + "LUNG1-226", + ], + "atlas_structure_list": [ + "LA", + "LV", + "RA", + "RV", + "AA", + "PA", + "SVC", + "LAD", + "LMCA", + "LCX", + "RCA", + "H", + ], + "atlas_path": ATLAS_PATH, + "atlas_image_format": "{0}/IMAGES/CT.nii.gz", + "atlas_label_format": "{0}/STRUCTURES/{1}.nii.gz", + "crop_atlas_to_structures": True, + "crop_atlas_expansion_mm": (50, 50, 50), + "guide_structure_name": "H", + "superior_extension": 30, +} + +OPEN_ATLAS_SETTINGS["label_fusion_settings"] = { + "vote_type": "unweighted", + "vote_params": None, + "optimal_threshold": { + "LA": 0.5, + "LV": 0.5, + "RA": 0.5, + "RV": 0.5, + "AA": 0.5, + "PA": 0.5, + "SVC": 0.5, + "H": 0.5, + }, +} + +OPEN_ATLAS_SETTINGS["vessel_spline_settings"] = { + "vessel_name_list": [ + "LAD", + "LCX", + "LMCA", + "RCA", + ], + "vessel_radius_mm_dict": { + "LAD": 2, + "LCX": 2, + "LMCA": 2, + "RCA": 2, + }, + "scan_direction_dict": { + "LAD": "z", + "LCX": "z", + "LMCA": "x", + "RCA": "z", + }, + "stop_condition_type_dict": { + "LAD": "count", + "LCX": "count", + "LMCA": "count", + "RCA": "count", + }, + "stop_condition_value_dict": { + "LAD": 2, + "LCX": 2, + "LMCA": 2, + "RCA": 2, + }, +} + +OPEN_ATLAS_SETTINGS["geometric_segmentation_settings"]["atlas_structure_names"] = { + "atlas_left_ventricle": "LV", + "atlas_right_ventricle": "RV", + "atlas_left_atrium": "LA", + "atlas_right_atrium": "RA", + "atlas_ascending_aorta": "AA", + "atlas_pulmonary_artery": "PA", + "atlas_superior_vena_cava": "SVC", + "atlas_whole_heart": "H", +} + +OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_binaryfillhole"] = [ + "LA","LV","RA","RV","AA","PA","SVC","H", +] + +OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_overlap_correction"] = [ + "LA","LV","RA","RV","AA","PA","SVC","H", +] + +OPEN_ATLAS_SETTINGS["return_proba_as_contours"] = True + +HYBRID_SETTINGS_DEFAULTS = { + "nnunet_settings": NNUNET_SETTINGS_DEFAULTS, + "cardiac_settings": OPEN_ATLAS_SETTINGS, +} + +def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): + """Runs the hybrid cardiac segmentation + + Args: + img (sitk.Image): + settings (dict, optional): Dictionary containing settings for algorithm. + Defaults to HYBRID_SETTINGS_DEFAULTS. + + Returns: + dict: Dictionary containing output of segmentation + """ + + mask_wh = RUN_NNUNET(img, settings["nnunet_settings"]) + + return run_cardiac_segmentation( + img, + guide_structure=mask_wh, + settings=settings["cardiac_settings"] + ) + + def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTINGS_DEFAULTS): """Runs the atlas-based cardiac segmentation From 8d9fdd1033a5890607d0d0a3b565dacd8122cda6 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 14:37:17 +1000 Subject: [PATCH 04/12] Correct bug --- platipy/imaging/projects/nnunet/run.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platipy/imaging/projects/nnunet/run.py b/platipy/imaging/projects/nnunet/run.py index b18f450e..4fb7360b 100644 --- a/platipy/imaging/projects/nnunet/run.py +++ b/platipy/imaging/projects/nnunet/run.py @@ -44,9 +44,11 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): nnunet_model_path = Path(os.environ["RESULTS_FOLDER"]) task = settings["task"] + model = settings["model"] # Check if task model is already installed task_path = nnunet_model_path.joinpath("nnUNet", model, task) + print(task_path) if not task_path.exists(): # Check if the task is available and install it if so From 90867997a8402d72937344292c6434449acf1305 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 15:46:04 +1000 Subject: [PATCH 05/12] Tweaks to hybrid settings --- platipy/cli/segmentation.py | 8 +++--- platipy/imaging/projects/cardiac/run.py | 33 ++++++++++++++----------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/platipy/cli/segmentation.py b/platipy/cli/segmentation.py index 53afe630..6b6e6b93 100644 --- a/platipy/cli/segmentation.py +++ b/platipy/cli/segmentation.py @@ -28,14 +28,14 @@ BRONCHUS_SETTINGS_DEFAULTS, ) from platipy.imaging.projects.cardiac.run import ( - run_cardiac_segmentation, - CARDIAC_SETTINGS_DEFAULTS, + run_hybrid_segmentation, + HYBRID_SETTINGS_DEFAULTS, ) segmentation_algorithms = { "cardiac": { - "algorithm": run_cardiac_segmentation, - "default_settings": CARDIAC_SETTINGS_DEFAULTS, + "algorithm": run_hybrid_segmentation, + "default_settings": HYBRID_SETTINGS_DEFAULTS, }, "bronchus": { "algorithm": run_bronchus_segmentation, diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index beb31cc7..aacc5541 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -54,6 +54,8 @@ from platipy.imaging.label.utils import binary_encode_structure_list, correct_volume_overlap +from platipy.imaging.projects.nnunet.run import run_segmentation, NNUNET_SETTINGS_DEFAULTS + ATLAS_PATH = "/atlas" if "ATLAS_PATH" in os.environ: ATLAS_PATH = os.environ["ATLAS_PATH"] @@ -261,22 +263,22 @@ "LCTSC-Test-S2-201", "LCTSC-Test-S2-203", "LCTSC-Test-S3-201", - "LCTSC-Train-S1-007", - "LCTSC-Train-S2-005", - "LCTSC-Train-S3-004", +# "LCTSC-Train-S1-007", +# "LCTSC-Train-S2-005", +# "LCTSC-Train-S3-004", "LUNG1-002", "LUNG1-009", "LUNG1-021", - "LUNG1-027", - "LUNG1-035", - "LUNG1-037", - "LUNG1-055", +# "LUNG1-027", +# "LUNG1-035", +# "LUNG1-037", +# "LUNG1-055", "LUNG1-067", - "LUNG1-074", - "LUNG1-076", - "LUNG1-092", - "LUNG1-143", - "LUNG1-210", +# "LUNG1-074", +# "LUNG1-076", +# "LUNG1-092", +# "LUNG1-143", +# "LUNG1-210", "LUNG1-226", ], "atlas_structure_list": [ @@ -366,12 +368,13 @@ ] OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_overlap_correction"] = [ - "LA","LV","RA","RV","AA","PA","SVC","H", + "LA","LV","RA","RV","AA","PA","SVC", ] OPEN_ATLAS_SETTINGS["return_proba_as_contours"] = True HYBRID_SETTINGS_DEFAULTS = { + "use_zenodo_atlas": True, "nnunet_settings": NNUNET_SETTINGS_DEFAULTS, "cardiac_settings": OPEN_ATLAS_SETTINGS, } @@ -388,11 +391,11 @@ def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): dict: Dictionary containing output of segmentation """ - mask_wh = RUN_NNUNET(img, settings["nnunet_settings"]) + mask_wh = run_segmentation(img, settings["nnunet_settings"]) return run_cardiac_segmentation( img, - guide_structure=mask_wh, + guide_structure=mask_wh["Struct_0"], settings=settings["cardiac_settings"] ) From 5dcd52237b86244bd18b8cc1825f9791d4ecde17 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 23:03:36 +0000 Subject: [PATCH 06/12] Fetch open atlas from Zenodo --- platipy/backend/models.py | 5 +-- platipy/backend/views.py | 3 +- platipy/cli/segmentation.py | 7 +++- platipy/imaging/projects/cardiac/run.py | 47 +++++++++++++++++++++---- platipy/imaging/projects/nnunet/run.py | 18 +++++++--- platipy/imaging/tests/data.py | 17 +-------- platipy/utils.py | 16 +++++++++ 7 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 platipy/utils.py diff --git a/platipy/backend/models.py b/platipy/backend/models.py index 43cebfd9..4cf9ea68 100644 --- a/platipy/backend/models.py +++ b/platipy/backend/models.py @@ -117,6 +117,7 @@ class Dataset(db.Model): output_data_objects = relationship( "DataObject", primaryjoin="and_(DataObject.dataset_id == Dataset.id, DataObject.is_input == False)", + overlaps="input_data_objects" ) # The Dicom location from which to retrieve data @@ -143,7 +144,7 @@ class DataObject(db.Model): id = db.Column(db.Integer, primary_key=True) dataset_id = db.Column(db.Integer, db.ForeignKey("Dataset.id"), nullable=False) - dataset = relationship("Dataset") + dataset = relationship("Dataset", overlaps="input_data_objects,output_data_objects") is_input = db.Column(db.Boolean, default=False) path = db.Column(db.String(256)) @@ -163,7 +164,7 @@ class DataObject(db.Model): parent_id = db.Column(db.Integer, db.ForeignKey("DataObject.id"), index=True) parent = relationship("DataObject", remote_side=[id]) children = relationship( - "DataObject", primaryjoin="and_(DataObject.parent_id == DataObject.id)" + "DataObject", primaryjoin="and_(DataObject.parent_id == DataObject.id)", overlaps="parent" ) def __repr__(self): diff --git a/platipy/backend/views.py b/platipy/backend/views.py index 235b2942..84ced647 100644 --- a/platipy/backend/views.py +++ b/platipy/backend/views.py @@ -98,7 +98,8 @@ def fetch_status(): status_context["applications"] = [] for ak in APIKey.query.all(): - status_context["applications"].append({"name": ak.name, "key": ak.key}) + # Hide Key from the dashboard + status_context["applications"].append({"name": ak.name, "key": "XXX"}) return jsonify(status_context) diff --git a/platipy/cli/segmentation.py b/platipy/cli/segmentation.py index 6b6e6b93..deba556d 100644 --- a/platipy/cli/segmentation.py +++ b/platipy/cli/segmentation.py @@ -35,7 +35,7 @@ segmentation_algorithms = { "cardiac": { "algorithm": run_hybrid_segmentation, - "default_settings": HYBRID_SETTINGS_DEFAULTS, + "default_settings": HYBRID_SETTINGS_DEFAULTS }, "bronchus": { "algorithm": run_bronchus_segmentation, @@ -105,6 +105,11 @@ def click_command(algorithm, input_path, config, default, output): # Run the algorithm results = segmentation_algorithms[algorithm]["algorithm"](image, algorithm_config) + # If results is a tuple, the algorithm is returning other items as well as the semgmentation. + # We are only interested in the segmentation here (the first element of the tuple) + if isinstance(results, tuple): + results = results[0] + # Save the output to the output directory if not output: output = "." diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index aacc5541..1a7d9433 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -14,6 +14,10 @@ import os +import shutil +import tempfile +from distutils.dir_util import copy_tree +from pathlib import Path import SimpleITK as sitk import numpy as np @@ -35,7 +39,6 @@ combine_labels, ) from platipy.imaging.label.iar import run_iar - from platipy.imaging.utils.vessel import vessel_spline_generation from platipy.imaging.utils.valve import ( @@ -49,16 +52,19 @@ ) from platipy.imaging.utils.crop import label_to_roi, crop_to_roi - from platipy.imaging.generation.mask import extend_mask - from platipy.imaging.label.utils import binary_encode_structure_list, correct_volume_overlap - from platipy.imaging.projects.nnunet.run import run_segmentation, NNUNET_SETTINGS_DEFAULTS +from platipy.utils import download_and_extract_zip_file ATLAS_PATH = "/atlas" if "ATLAS_PATH" in os.environ: ATLAS_PATH = os.environ["ATLAS_PATH"] +else: + home = Path.home() + platipy_dir = home.joinpath(".platipy") + platipy_dir.mkdir(exist_ok=True) + ATLAS_PATH = str(platipy_dir.joinpath("cardiac", "test_atlas")) CARDIAC_SETTINGS_DEFAULTS = { "atlas_settings": { @@ -257,6 +263,8 @@ "return_proba_as_contours": False, } +OPEN_ATLAS_URL = "https://zenodo.org/record/6592437/files/open_atlas.zip?download=1" + OPEN_ATLAS_SETTINGS = CARDIAC_SETTINGS_DEFAULTS.copy() OPEN_ATLAS_SETTINGS["atlas_settings"] = { "atlas_id_list": [ @@ -374,11 +382,26 @@ OPEN_ATLAS_SETTINGS["return_proba_as_contours"] = True HYBRID_SETTINGS_DEFAULTS = { - "use_zenodo_atlas": True, + "fetch_open_atlas": True, "nnunet_settings": NNUNET_SETTINGS_DEFAULTS, "cardiac_settings": OPEN_ATLAS_SETTINGS, } + +def install_open_atlas(atlas_path): + """Fetch atlas from Zenodo and place into atlas_path + + Args: + atlas_path (pathlib.Path): Path in which to place the atlas + """ + + temp_dir = tempfile.mkdtemp() + download_and_extract_zip_file(OPEN_ATLAS_URL, temp_dir) + temp_atlas_path = Path(temp_dir).joinpath("test_atlas") + copy_tree(temp_atlas_path, atlas_path) + shutil.rmtree(temp_dir) + + def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): """Runs the hybrid cardiac segmentation @@ -391,16 +414,25 @@ def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): dict: Dictionary containing output of segmentation """ + # Make sure atlas path exists, if not fetch it if fetch open atlas setting is true + atlas_path = Path(settings["cardiac_settings"]["atlas_path"]) + if not atlas_path.exists() or len(list(atlas_path.glob("*"))) == 0: + if settings["fetch_open_atlas"]: + # Fetch data from Zenodo + install_open_atlas(atlas_path) + else: + raise SystemError(f"No atlas exists at {atlas_path}") + + # Run the whole heart nnUNet segmentation mask_wh = run_segmentation(img, settings["nnunet_settings"]) + # Run the 2nd part of the hybrid approach return run_cardiac_segmentation( img, guide_structure=mask_wh["Struct_0"], settings=settings["cardiac_settings"] ) - - def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTINGS_DEFAULTS): """Runs the atlas-based cardiac segmentation @@ -443,6 +475,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING logger.info("") # Settings atlas_path = settings["atlas_settings"]["atlas_path"] + atlas_id_list = settings["atlas_settings"]["atlas_id_list"] atlas_structure_list = settings["atlas_settings"]["atlas_structure_list"] diff --git a/platipy/imaging/projects/nnunet/run.py b/platipy/imaging/projects/nnunet/run.py index 4fb7360b..24408263 100644 --- a/platipy/imaging/projects/nnunet/run.py +++ b/platipy/imaging/projects/nnunet/run.py @@ -6,10 +6,10 @@ import SimpleITK as sitk -from nnunet.inference.pretrained_models.download_pretrained_model import get_available_models, download_and_install_from_url - def available_nnunet_models(): + from nnunet.inference.pretrained_models.download_pretrained_model import get_available_models + available_models = get_available_models() available_models["Task400_OPEN_HEART_3d_lowres"] = { 'description': "Whole heart model (all folds, 3d_lowres only) trained on data from" @@ -41,6 +41,17 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): home.mkdir(exist_ok=True) os.environ["RESULTS_FOLDER"] = str(platipy_dir.joinpath("nnUNet_models")) + # Don't really need these here but set them anyway to supress warnings + os.environ["nnUNet_raw_data_base"] = tempfile.mkdtemp() + os.environ["nnUNet_preprocessed"] = tempfile.mkdtemp() + + # Import in here to make sure environment is already set + try: + from nnunet.inference.predict import predict_from_folder + from nnunet.inference.pretrained_models.download_pretrained_model import download_and_install_from_url + except ImportError: + logger.error("nnUNet is not installed. Please pip install nnunet to use this functionality") + nnunet_model_path = Path(os.environ["RESULTS_FOLDER"]) task = settings["task"] @@ -89,9 +100,6 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): model_folder_name = task_path.joinpath(trainer + f"__{default_plans_identifier}") - # Import in here to make sure environment is already set - from nnunet.inference.predict import predict_from_folder - predict_from_folder(str(model_folder_name), str(input_path), str(output_path), folds, False, num_threads_preprocessing, num_threads_nifti_save, lowres_segmentations, 0, 1, not disable_tta, overwrite_existing=True, mode=mode, overwrite_all_in_gpu=all_in_gpu, diff --git a/platipy/imaging/tests/data.py b/platipy/imaging/tests/data.py index d983e225..3bdb6ee5 100644 --- a/platipy/imaging/tests/data.py +++ b/platipy/imaging/tests/data.py @@ -12,13 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import zipfile -import tempfile -import urllib.request from pathlib import Path from loguru import logger +from platipy.utils import download_and_extract_zip_file LCTSC_TEST_DATA_URL = "https://zenodo.org/record/4747795/files" LCTSC_DICOM_ZIP = "LCTSC_DICOM_TestData.zip" @@ -28,19 +26,6 @@ TCGA_HNSC_NIFTI_ZIP = "/TCGA-HNSC_NIFTI_TestData.zip" -def download_and_extract_zip_file(zip_url, output_directory): - - with tempfile.TemporaryDirectory() as temp_dir: - temp_file = Path(temp_dir).joinpath("tmp.zip") - - with urllib.request.urlopen(zip_url) as dl_file: - with open(temp_file, "wb") as out_file: - out_file.write(dl_file.read()) - - with zipfile.ZipFile(temp_file, "r") as zip_ref: - zip_ref.extractall(output_directory) - - def get_lung_dicom(output_directory="./data/dicom"): output_directory = Path(output_directory) diff --git a/platipy/utils.py b/platipy/utils.py new file mode 100644 index 00000000..46bcba0c --- /dev/null +++ b/platipy/utils.py @@ -0,0 +1,16 @@ +import zipfile +import tempfile +import urllib.request +from pathlib import Path + +def download_and_extract_zip_file(zip_url, output_directory): + + with tempfile.TemporaryDirectory() as temp_dir: + temp_file = Path(temp_dir).joinpath("tmp.zip") + + with urllib.request.urlopen(zip_url) as dl_file: + with open(temp_file, "wb") as out_file: + out_file.write(dl_file.read()) + + with zipfile.ZipFile(temp_file, "r") as zip_ref: + zip_ref.extractall(output_directory) From f7dcb9c972edb79f3e6ac717477fc00ff11c0220 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Tue, 31 May 2022 09:40:52 +1000 Subject: [PATCH 07/12] Tweaks to fetching from zenodo --- platipy/imaging/projects/cardiac/run.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index 1a7d9433..3e0f7089 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -16,7 +16,6 @@ import os import shutil import tempfile -from distutils.dir_util import copy_tree from pathlib import Path import SimpleITK as sitk import numpy as np @@ -395,10 +394,13 @@ def install_open_atlas(atlas_path): atlas_path (pathlib.Path): Path in which to place the atlas """ + logger.info(f"Fetching and installing open cardiac atlas to {atlas_path}") temp_dir = tempfile.mkdtemp() download_and_extract_zip_file(OPEN_ATLAS_URL, temp_dir) temp_atlas_path = Path(temp_dir).joinpath("test_atlas") - copy_tree(temp_atlas_path, atlas_path) + if not atlas_path.parent.exists(): + atlas_path.parent.mkdir(parents=True) + shutil.copytree(temp_atlas_path, atlas_path) shutil.rmtree(temp_dir) @@ -415,7 +417,7 @@ def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): """ # Make sure atlas path exists, if not fetch it if fetch open atlas setting is true - atlas_path = Path(settings["cardiac_settings"]["atlas_path"]) + atlas_path = Path(settings["cardiac_settings"]["atlas_settings"]["atlas_path"]) if not atlas_path.exists() or len(list(atlas_path.glob("*"))) == 0: if settings["fetch_open_atlas"]: # Fetch data from Zenodo From f1eddd456df9dde21d0283d57a94f300c2dac6df Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Mon, 30 May 2022 23:53:18 +0000 Subject: [PATCH 08/12] Download nnunet zip first --- platipy/imaging/projects/nnunet/run.py | 29 +++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/platipy/imaging/projects/nnunet/run.py b/platipy/imaging/projects/nnunet/run.py index 24408263..5ffec6ae 100644 --- a/platipy/imaging/projects/nnunet/run.py +++ b/platipy/imaging/projects/nnunet/run.py @@ -1,6 +1,8 @@ import os import tempfile +import urllib.request +import shutil from pathlib import Path from loguru import logger @@ -33,6 +35,29 @@ def available_nnunet_models(): "chk": "model_final_checkpoint" } +def download_and_install_nnunet_task(task_name, zip_url): + """Downloads the Zip file and then installs via nnUNet. + + Avoid using the nnUNet built in function since it doesn't work when a HTTP_PROXY/HTTPS_PROXY + are set. + + Args: + task_name (str): Task ID and name + zip_url (str): Zip file URL + """ + + from nnunet.inference.pretrained_models.download_pretrained_model import install_model_from_zip_file + + logger.info(f"Installing Task {task_name} from {zip_url}") + temp_dir = tempfile.mkdtemp() + temp_file = Path(temp_dir).joinpath(f"{task_name}.zip") + with urllib.request.urlopen(zip_url) as dl_file: + with open(temp_file, "wb") as out_file: + out_file.write(dl_file.read()) + + install_model_from_zip_file(temp_file) + shutil.rmtree(temp_dir) + def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): if not "RESULTS_FOLDER" in os.environ: @@ -48,7 +73,6 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): # Import in here to make sure environment is already set try: from nnunet.inference.predict import predict_from_folder - from nnunet.inference.pretrained_models.download_pretrained_model import download_and_install_from_url except ImportError: logger.error("nnUNet is not installed. Please pip install nnunet to use this functionality") @@ -69,8 +93,7 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): raise ValueError(f"{task} not available") task_url = available_models[task]["url"] - logger.info("Installing Task from URL") - download_and_install_from_url(task_url) + download_and_install_nnunet_task(task, task_url) # Prepare the image in a temporary directory for nnunet to run on input_path = Path(tempfile.mkdtemp()) From 6a4e33d2455d919944ccec97ba631df706dd29d7 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Tue, 31 May 2022 17:23:27 +1000 Subject: [PATCH 09/12] Correct structure names --- platipy/imaging/projects/cardiac/run.py | 104 ++++++++++++------------ platipy/imaging/projects/nnunet/run.py | 13 +-- 2 files changed, 59 insertions(+), 58 deletions(-) diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index 3e0f7089..07bb386b 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -289,25 +289,25 @@ "LUNG1-226", ], "atlas_structure_list": [ - "LA", - "LV", - "RA", - "RV", - "AA", - "PA", - "SVC", - "LAD", - "LMCA", - "LCX", - "RCA", - "H", + "Atrium_L", + "Ventricle_L", + "Atrium_R", + "Ventricle_R", + "A_Aorta", + "A_Pulmonary", + "V_Venacava_S", + "A_LAD", + "A_Coronary_L", + "A_Cflx", + "A_Coronary_R", + "Heart", ], "atlas_path": ATLAS_PATH, "atlas_image_format": "{0}/IMAGES/CT.nii.gz", "atlas_label_format": "{0}/STRUCTURES/{1}.nii.gz", "crop_atlas_to_structures": True, "crop_atlas_expansion_mm": (50, 50, 50), - "guide_structure_name": "H", + "guide_structure_name": "Heart", "superior_extension": 30, } @@ -315,67 +315,67 @@ "vote_type": "unweighted", "vote_params": None, "optimal_threshold": { - "LA": 0.5, - "LV": 0.5, - "RA": 0.5, - "RV": 0.5, - "AA": 0.5, - "PA": 0.5, - "SVC": 0.5, - "H": 0.5, + "Atrium_L": 0.5, + "Ventricle_L": 0.5, + "Atrium_R": 0.5, + "Ventricle_R": 0.5, + "A_Aorta": 0.5, + "A_Pulmonary": 0.5, + "V_Venacava_S": 0.5, + "Heart": 0.5, }, } OPEN_ATLAS_SETTINGS["vessel_spline_settings"] = { "vessel_name_list": [ - "LAD", - "LCX", - "LMCA", - "RCA", + "A_LAD", + "A_Cflx", + "A_Coronary_L", + "A_Coronary_R", ], "vessel_radius_mm_dict": { - "LAD": 2, - "LCX": 2, - "LMCA": 2, - "RCA": 2, + "A_LAD": 2, + "A_Cflx": 2, + "A_Coronary_L": 2, + "A_Coronary_R": 2, }, "scan_direction_dict": { - "LAD": "z", - "LCX": "z", - "LMCA": "x", - "RCA": "z", + "A_LAD": "z", + "A_Cflx": "z", + "A_Coronary_L": "x", + "A_Coronary_R": "z", }, "stop_condition_type_dict": { - "LAD": "count", - "LCX": "count", - "LMCA": "count", - "RCA": "count", + "A_LAD": "count", + "A_Cflx": "count", + "A_Coronary_L": "count", + "A_Coronary_R": "count", }, "stop_condition_value_dict": { - "LAD": 2, - "LCX": 2, - "LMCA": 2, - "RCA": 2, + "A_LAD": 2, + "A_Cflx": 2, + "A_Coronary_L": 2, + "A_Coronary_R": 2, }, } OPEN_ATLAS_SETTINGS["geometric_segmentation_settings"]["atlas_structure_names"] = { - "atlas_left_ventricle": "LV", - "atlas_right_ventricle": "RV", - "atlas_left_atrium": "LA", - "atlas_right_atrium": "RA", - "atlas_ascending_aorta": "AA", - "atlas_pulmonary_artery": "PA", - "atlas_superior_vena_cava": "SVC", - "atlas_whole_heart": "H", + "atlas_left_ventricle": "Ventricle_L", + "atlas_right_ventricle": "Ventricle_R", + "atlas_left_atrium": "Atrium_L", + "atlas_right_atrium": "Atrium_R", + "atlas_ascending_aorta": "A_Aorta", + "atlas_pulmonary_artery": "A_Pulmonary", + "atlas_superior_vena_cava": "V_Venacava_S", + "atlas_whole_heart": "Heart", } OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_binaryfillhole"] = [ - "LA","LV","RA","RV","AA","PA","SVC","H", + "Atrium_L","Ventricle_L","Atrium_R","Ventricle_R","A_Aorta","A_Pulmonary","V_Venacava_S","Heart", ] OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_overlap_correction"] = [ - "LA","LV","RA","RV","AA","PA","SVC", + "Atrium_L","Ventricle_L","Atrium_R","Ventricle_R","A_Aorta","A_Pulmonary","V_Venacava_S", ] OPEN_ATLAS_SETTINGS["return_proba_as_contours"] = True @@ -385,7 +385,7 @@ "nnunet_settings": NNUNET_SETTINGS_DEFAULTS, "cardiac_settings": OPEN_ATLAS_SETTINGS, } - +HYBRID_SETTINGS_DEFAULTS["nnunet_settings"]["folds"] = "all" def install_open_atlas(atlas_path): """Fetch atlas from Zenodo and place into atlas_path diff --git a/platipy/imaging/projects/nnunet/run.py b/platipy/imaging/projects/nnunet/run.py index 5ffec6ae..160429af 100644 --- a/platipy/imaging/projects/nnunet/run.py +++ b/platipy/imaging/projects/nnunet/run.py @@ -13,7 +13,7 @@ def available_nnunet_models(): from nnunet.inference.pretrained_models.download_pretrained_model import get_available_models available_models = get_available_models() - available_models["Task400_OPEN_HEART_3d_lowres"] = { + available_models["Task400_OPEN_HEART_1FOLD"] = { 'description': "Whole heart model (all folds, 3d_lowres only) trained on data from" "TCIA (NSCLC-Radiomics & LCTSC)", 'url': "https://zenodo.org/record/6585664/files/Task400_OPEN_HEART_3d_lowres.zip?download=1" @@ -21,7 +21,7 @@ def available_nnunet_models(): return available_models NNUNET_SETTINGS_DEFAULTS = { - "task": "Task400_OPEN_HEART_3d_lowres", + "task": "Task400_OPEN_HEART_1FOLD", "trainer_class_name": "nnUNetTrainerV2", "cascade_trainer_class_name": "nnUNetTrainerV2CascadeFullRes", "folds": None, @@ -37,7 +37,7 @@ def available_nnunet_models(): def download_and_install_nnunet_task(task_name, zip_url): """Downloads the Zip file and then installs via nnUNet. - + Avoid using the nnUNet built in function since it doesn't work when a HTTP_PROXY/HTTPS_PROXY are set. @@ -45,7 +45,7 @@ def download_and_install_nnunet_task(task_name, zip_url): task_name (str): Task ID and name zip_url (str): Zip file URL """ - + from nnunet.inference.pretrained_models.download_pretrained_model import install_model_from_zip_file logger.info(f"Installing Task {task_name} from {zip_url}") @@ -56,7 +56,8 @@ def download_and_install_nnunet_task(task_name, zip_url): out_file.write(dl_file.read()) install_model_from_zip_file(temp_file) - shutil.rmtree(temp_dir) + #shutil.rmtree(temp_dir) + print(temp_file) def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): @@ -69,7 +70,7 @@ def run_segmentation(img, settings=NNUNET_SETTINGS_DEFAULTS): # Don't really need these here but set them anyway to supress warnings os.environ["nnUNet_raw_data_base"] = tempfile.mkdtemp() os.environ["nnUNet_preprocessed"] = tempfile.mkdtemp() - + # Import in here to make sure environment is already set try: from nnunet.inference.predict import predict_from_folder From 17b177a6b2ea74cb23a0451cfb983dc0b8abbc88 Mon Sep 17 00:00:00 2001 From: rnfinnegan Date: Wed, 1 Jun 2022 03:14:20 +0000 Subject: [PATCH 10/12] update vessel code --- platipy/imaging/utils/vessel.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/platipy/imaging/utils/vessel.py b/platipy/imaging/utils/vessel.py index 694a8da0..325b55d9 100644 --- a/platipy/imaging/utils/vessel.py +++ b/platipy/imaging/utils/vessel.py @@ -386,7 +386,17 @@ def vessel_spline_generation( initial_image_direction = reference_image.GetDirection() - image_list = [atlas_set[i][atlas_label][vessel_name] for i in atlas_set.keys()] + image_list = [] + for i in atlas_set.keys(): + try: + image_list.append(atlas_set[i][atlas_label][vessel_name]) + except: + logger.warning(f"No match for ID={i}, label={atlas_label}, vessel={vessel_name}") + + if len(image_list) == 0: + logger.warning(f"No structures found for vessel with name {vessel_name}!") + continue + for im in image_list: im.SetDirection((1, 0, 0, 0, 1, 0, 0, 0, 1)) From 5703008deffb81758ff850be9abe0ff568ccfb4b Mon Sep 17 00:00:00 2001 From: rnfinnegan Date: Wed, 1 Jun 2022 03:18:57 +0000 Subject: [PATCH 11/12] update geometric structure names --- platipy/imaging/projects/cardiac/run.py | 58 +++++++++++++++---------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/platipy/imaging/projects/cardiac/run.py b/platipy/imaging/projects/cardiac/run.py index 3e0f7089..f99a512c 100644 --- a/platipy/imaging/projects/cardiac/run.py +++ b/platipy/imaging/projects/cardiac/run.py @@ -270,22 +270,22 @@ "LCTSC-Test-S2-201", "LCTSC-Test-S2-203", "LCTSC-Test-S3-201", -# "LCTSC-Train-S1-007", -# "LCTSC-Train-S2-005", -# "LCTSC-Train-S3-004", + # "LCTSC-Train-S1-007", + # "LCTSC-Train-S2-005", + # "LCTSC-Train-S3-004", "LUNG1-002", "LUNG1-009", "LUNG1-021", -# "LUNG1-027", -# "LUNG1-035", -# "LUNG1-037", -# "LUNG1-055", + # "LUNG1-027", + # "LUNG1-035", + # "LUNG1-037", + # "LUNG1-055", "LUNG1-067", -# "LUNG1-074", -# "LUNG1-076", -# "LUNG1-092", -# "LUNG1-143", -# "LUNG1-210", + # "LUNG1-074", + # "LUNG1-076", + # "LUNG1-092", + # "LUNG1-143", + # "LUNG1-210", "LUNG1-226", ], "atlas_structure_list": [ @@ -371,11 +371,24 @@ } OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_binaryfillhole"] = [ - "LA","LV","RA","RV","AA","PA","SVC","H", + "LA", + "LV", + "RA", + "RV", + "AA", + "PA", + "SVC", + "H", ] OPEN_ATLAS_SETTINGS["postprocessing_settings"]["structures_for_overlap_correction"] = [ - "LA","LV","RA","RV","AA","PA","SVC", + "LA", + "LV", + "RA", + "RV", + "AA", + "PA", + "SVC", ] OPEN_ATLAS_SETTINGS["return_proba_as_contours"] = True @@ -430,11 +443,10 @@ def run_hybrid_segmentation(img, settings=HYBRID_SETTINGS_DEFAULTS): # Run the 2nd part of the hybrid approach return run_cardiac_segmentation( - img, - guide_structure=mask_wh["Struct_0"], - settings=settings["cardiac_settings"] + img, guide_structure=mask_wh["Struct_0"], settings=settings["cardiac_settings"] ) + def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTINGS_DEFAULTS): """Runs the atlas-based cardiac segmentation @@ -982,7 +994,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING geom_conduction_defs = geometric_segmentation_settings["conduction_system_definitions"] # 1 - MITRAL VALVE - mv_name = "MITRALVALVE" + geometric_segmentation_settings["geometric_name_suffix"] + mv_name = "Valve_Mitral" results[mv_name] = generate_valve_using_cylinder( label_atrium=results[geom_atlas_names["atlas_left_atrium"]], label_ventricle=results[geom_atlas_names["atlas_left_ventricle"]], @@ -991,7 +1003,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING ) # 2 - TRICUSPID VALVE - tv_name = "TRICUSPIDVALVE" + geometric_segmentation_settings["geometric_name_suffix"] + tv_name = "Valve_Tricuspid" results[tv_name] = generate_valve_using_cylinder( label_atrium=results[geom_atlas_names["atlas_right_atrium"]], label_ventricle=results[geom_atlas_names["atlas_right_ventricle"]], @@ -1000,7 +1012,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING ) # 3 - AORTIC VALVE - av_name = "AORTICVALVE" + geometric_segmentation_settings["geometric_name_suffix"] + av_name = "Valve_Aortic" results[av_name] = generate_valve_from_great_vessel( label_great_vessel=results[geom_atlas_names["atlas_ascending_aorta"]], label_ventricle=results[geom_atlas_names["atlas_left_ventricle"]], @@ -1008,7 +1020,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING ) # 4 - PULMONIC VALVE - pv_name = "PULMONICVALVE" + geometric_segmentation_settings["geometric_name_suffix"] + pv_name = "Valve_Pulmonic" results[pv_name] = generate_valve_from_great_vessel( label_great_vessel=results[geom_atlas_names["atlas_pulmonary_artery"]], label_ventricle=results[geom_atlas_names["atlas_right_ventricle"]], @@ -1016,7 +1028,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING ) # 5 - SINOATRIAL NODE - san_name = "SAN" + geometric_segmentation_settings["geometric_name_suffix"] + san_name = "CN_Sinoatrial" results[san_name] = geometric_sinoatrialnode( label_svc=results[geom_atlas_names["atlas_superior_vena_cava"]], label_ra=results[geom_atlas_names["atlas_right_atrium"]], @@ -1025,7 +1037,7 @@ def run_cardiac_segmentation(img, guide_structure=None, settings=CARDIAC_SETTING ) # 6 - ATRIOVENTRICULAR NODE - avn_name = "AVN" + geometric_segmentation_settings["geometric_name_suffix"] + avn_name = "CN_Atrioventricular" results[avn_name] = geometric_atrioventricularnode( label_la=results[geom_atlas_names["atlas_left_atrium"]], label_lv=results[geom_atlas_names["atlas_left_ventricle"]], From 6f0366ed0a987455e9be39e0a019d602be284b37 Mon Sep 17 00:00:00 2001 From: Phillip Chlap Date: Thu, 2 Jun 2022 04:22:54 +0000 Subject: [PATCH 12/12] Document for cardiac project --- assets/cardiac.png | Bin 0 -> 180532 bytes docs/cardiac.rst | 2 + docs/index.rst | 7 + examples/cardiac_segmentation.ipynb | 126 +++-------------- platipy/imaging/projects/cardiac/README.md | 150 +++++++++++++++++++++ 5 files changed, 179 insertions(+), 106 deletions(-) create mode 100644 assets/cardiac.png create mode 100644 docs/cardiac.rst create mode 100644 platipy/imaging/projects/cardiac/README.md diff --git a/assets/cardiac.png b/assets/cardiac.png new file mode 100644 index 0000000000000000000000000000000000000000..297864ca354e002c563a777a9a344f29355e1a53 GIT binary patch literal 180532 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

6d>PZ*F)z7dR{% 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°tzifMFl_oxmSw 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�ZLqQAB`_1xOQ}Oblh)` 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 JwTA97{{!^O+g1Po literal 0 HcmV?d00001 diff --git a/docs/cardiac.rst b/docs/cardiac.rst new file mode 100644 index 00000000..0777550c --- /dev/null +++ b/docs/cardiac.rst @@ -0,0 +1,2 @@ + +.. mdinclude:: ../platipy/imaging/projects/cardiac/README.md diff --git a/docs/index.rst b/docs/index.rst index e8a506cc..6266f285 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,6 +12,13 @@ PlatiPy documentation getting_started contributing +.. toctree:: + :caption: Projects + :maxdepth: 2 + :hidden: + + cardiac + .. toctree:: :caption: Examples :maxdepth: 2 diff --git a/examples/cardiac_segmentation.ipynb b/examples/cardiac_segmentation.ipynb index f7e18f0e..d4781fe8 100644 --- a/examples/cardiac_segmentation.ipynb +++ b/examples/cardiac_segmentation.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Cardiac Multi Atlas-Based Segmentation Example\n", + "# Cardiac Sub-Structure Segmentation Example\n", "\n", "## Import Modules" ] @@ -21,12 +21,14 @@ " !pip install git+https://github.com/pyplati/platipy.git\n", " import platipy\n", "\n", + "from matplotlib import pyplot as plt\n", + "\n", "import SimpleITK as sitk\n", "\n", "%matplotlib inline\n", "\n", "from platipy.imaging.tests.data import get_lung_nifti\n", - "from platipy.imaging.projects.cardiac.run import run_cardiac_segmentation\n", + "from platipy.imaging.projects.cardiac.run import run_hybrid_segmentation\n", "from platipy.imaging import ImageVisualiser\n", "from platipy.imaging.label.utils import get_com" ] @@ -52,101 +54,6 @@ "data_path = get_lung_nifti()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Configure Settings\n", - "\n", - "We define the settings used for the end-to-end segmentation\n", - "Check out the guide in \"PlatiPy-GettingStarted.pdf\" for a description of these settings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "settings = {\n", - " \"output_format\": \"Auto_{0}.nii.gz\",\n", - " \"atlas_settings\": {\n", - " \"atlas_id_list\": [\"101\",\"102\",\"103\",\"104\"],\n", - " \"atlas_structure_list\": [\"HEART\",\"ESOPHAGUS\",\"LUNG_L\",\"LUNG_R\",\"SPINALCORD\"],\n", - " \"atlas_path\": str(data_path),\n", - " \"atlas_image_format\": \"LCTSC-Test-S1-{0}/IMAGES/LCTSC_TEST_S1_{0}_0_CT_0.nii.gz\",\n", - " \"atlas_label_format\": \"LCTSC-Test-S1-{0}/STRUCTURES/LCTSC_TEST_S1_{0}_0_RTSTRUCT_{1}.nii.gz\",\n", - " \"crop_atlas_to_structures\": False,\n", - " \"crop_atlas_expansion_mm\": (10, 10, 10),\n", - " \"guide_structure_name\": \"HEART\",\n", - " },\n", - " \"auto_crop_target_image_settings\": {\n", - " \"expansion_mm\": [2, 2, 2],\n", - " },\n", - " \"linear_registration_settings\": {\n", - " \"reg_method\": \"similarity\",\n", - " \"shrink_factors\": [16, 8, 4],\n", - " \"smooth_sigmas\": [0, 0, 0],\n", - " \"sampling_rate\": 0.75,\n", - " \"default_value\": -1024,\n", - " \"number_of_iterations\": 50,\n", - " \"metric\": \"mean_squares\",\n", - " \"optimiser\": \"gradient_descent_line_search\",\n", - " \"verbose\": False,\n", - " },\n", - " \"deformable_registration_settings\": {\n", - " \"isotropic_resample\": True,\n", - " \"resolution_staging\": [\n", - " 16,\n", - " 8,\n", - " 4,\n", - " ], # specify voxel size (mm) since isotropic_resample is set\n", - " \"iteration_staging\": [15, 15, 15],\n", - " \"smoothing_sigmas\": [4, 2, 1],\n", - " \"ncores\": 8,\n", - " \"default_value\": -1000,\n", - " \"verbose\": False,\n", - " },\n", - " \"structure_guided_registration_settings\": {\n", - " \"isotropic_resample\": True,\n", - " \"resolution_staging\": [\n", - " 16,\n", - " 8,\n", - " 2,\n", - " ], # specify voxel size (mm) since isotropic_resample is set\n", - " \"iteration_staging\": [25, 25, 25],\n", - " \"smoothing_sigmas\": [0, 0, 0],\n", - " \"ncores\": 8,\n", - " \"default_value\": 0,\n", - " \"verbose\": False,\n", - " },\n", - " \"iar_settings\": {\n", - " \"reference_structure\": \"HEART\",\n", - " \"smooth_distance_maps\": True,\n", - " \"smooth_sigma\": 1,\n", - " \"z_score_statistic\": \"mad\",\n", - " \"outlier_method\": \"iqr\",\n", - " \"outlier_factor\": 1.5,\n", - " \"min_best_atlases\": 5,\n", - " \"project_on_sphere\": False,\n", - " },\n", - " \"label_fusion_settings\": {\n", - " \"vote_type\": \"unweighted\",\n", - " \"vote_params\": {}, # No parameters needed for majority voting\n", - " \"optimal_threshold\": {\"HEART\": 0.5, \"ESOPHAGUS\": 0.5, \"LUNG_L\": 0.5, \"LUNG_R\": 0.5, \"SPINALCORD\": 0.5},\n", - " },\n", - " \"vessel_spline_settings\": {\n", - " \"vessel_name_list\": [\"SPINALCORD\"],\n", - " \"vessel_radius_mm_dict\": {\"SPINALCORD\": 6},\n", - " \"scan_direction_dict\": {\"SPINALCORD\": \"z\"},\n", - " \"stop_condition_type_dict\": {\"SPINALCORD\": \"count\"},\n", - " \"stop_condition_value_dict\": {\"SPINALCORD\": 1},\n", - " },\n", - " \"return_as_cropped\": False,\n", - " 'returnAsCropped': False\n", - "}" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -183,7 +90,7 @@ }, "outputs": [], "source": [ - "auto_structures = run_cardiac_segmentation(test_image, settings=settings)" + "auto_structures, _ = run_hybrid_segmentation(test_image)" ] }, { @@ -200,12 +107,11 @@ "metadata": {}, "outputs": [], "source": [ - "output_name = settings[\"output_format\"]\n", - "output_directory = test_pat_path.joinpath(\"SEGMENTATIONS\")\n", + "output_directory = test_pat_path.joinpath(\"substructures\")\n", "output_directory.mkdir(exist_ok=True)\n", "\n", "for struct_name in list(auto_structures.keys()):\n", - " sitk.WriteImage(auto_structures[struct_name], str(output_directory.joinpath(output_name.format(struct_name))))\n", + " sitk.WriteImage(auto_structures[struct_name], str(output_directory.joinpath(f\"{struct_name}.nii.gz\")))\n", "\n", "print(f\"Segmentations saved to: {output_directory}\")\n", "\n" @@ -226,11 +132,19 @@ "metadata": {}, "outputs": [], "source": [ - "vis = ImageVisualiser(test_image, cut=get_com(auto_structures[\"HEART\"]))\n", - "\n", + "vis = ImageVisualiser(test_image, cut=get_com(auto_structures[\"Heart\"]))\n", "vis.add_contour({struct: auto_structures[struct] for struct in auto_structures.keys()})\n", - "\n", - "fig = vis.show()" + "fig = vis.show()\n", + "plt.savefig(output_directory.joinpath(f\"snapshot.png\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig" ] }, { @@ -257,7 +171,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/platipy/imaging/projects/cardiac/README.md b/platipy/imaging/projects/cardiac/README.md new file mode 100644 index 00000000..9443fb49 --- /dev/null +++ b/platipy/imaging/projects/cardiac/README.md @@ -0,0 +1,150 @@ +# Cardiac sub-structure auto-segmentation + +This project consists of an algorithm to automatically segment the heart plus 17 cardiac +sub-structures in typical Radiotherapy CT scans. The hybrid algorithm [1] first segments the whole +heart using a deep learning model (nnUNet [2]) followed by a multi-atlas based mapping of the +cardiac sub-structure [3] and geometric modelling of smaller cardiac structures. The following +cardiac structures are generated by the auto-segmentation algorithm. By default, structure names +are formatted to conform to the [TG-263](https://www.aapm.org/pubs/reports/RPT_263.pdf) +guildelines: + +| Structure | Name | +| -------------------------------- | ------------------- | +| Whole Heart | Heart | +| Left Ventricle | Ventricle_L | +| Right Ventricle | Ventricle_R | +| Left Atrium | Atrium_L | +| Right Atrium | Atrium_R | +| Aorta Artery | A_Aorta | +| Pulmonary Artery | A_Pulmonary | +| Left Anterior Descending Artery | A_LAD | +| Circonflex Artery | A_Cflx | +| Left Coronary Artery | A_Coronary_L | +| Right Coronary Artery | A_Coronary_R | +| Superior Vena Cava | V_Venacava_S | +| Mitral Valve | Valve_Mitral | +| Tricuspid Valve | Valve_Tricuspid | +| Aortic Valve | Valve_Aortic | +| Pulmonic Valve | Valve_Pulmonic | +| Sinoatrial Conduction Node | CN_Sinoatrial | +| Atrioventricular Conduction Node | CN_Atrioventricular | + +![Example Results](../../../../assets/cardiac.png) + +## Quickstart + +These steps have been tested on an Ubuntu 20.04 OS with Python 3.8. Other Linux Operating Systems +and Python versions 3.7-3.9 are expected to work. This tool is untest and likely won't run on a +Windows operating system at this time (contributions are welcome). + +### System Requirements + +On a system with the following specification, one case takes approximately 5 minutes process. + +> Note: The nnUNet model as well as the cardiac atlas will be downloaded which will increase the +runtime on the first run. + +### Installation + +Install PlatiPy and nnUNet in your Python environment: + +> Important: Ensure you are using the latest version of pip: `pip install --upgrade pip` + +```bash +pip install platipy +pip install nnunet +``` + +### Run from a Python script + +This code snippet first pulls some Lung CT data into a folder called `data`. Next it runs the +auto-segmentation algorithm on one example case and saves the results within the patient directory. + +```python +import platipy + +from matplotlib import pyplot as plt + +import SimpleITK as sitk + +from platipy.imaging.tests.data import get_lung_nifti +from platipy.imaging.projects.cardiac.run import run_hybrid_segmentation +from platipy.imaging import ImageVisualiser +from platipy.imaging.label.utils import get_com + +# Download the test data +data_path = get_lung_nifti() + +# Pick out a case to run on +test_pat_path = data_path.joinpath("LCTSC-Test-S1-201") +test_image = sitk.ReadImage(str(test_pat_path.joinpath("IMAGES/LCTSC_TEST_S1_201_0_CT_0.nii.gz"))) + +# Compute the auto-segmented sub-structures +auto_structures, _ = run_hybrid_segmentation(test_image) + +# Save the results +output_directory = test_pat_path.joinpath("substructures") +output_directory.mkdir(exist_ok=True) + +for struct_name in list(auto_structures.keys()): + sitk.WriteImage(auto_structures[struct_name], str(output_directory.joinpath(f"{struct_name}.nii.gz"))) + +print(f"Segmentations saved to: {output_directory}") + +# Visualise the results and save a snapshot +vis = ImageVisualiser(test_image, cut=get_com(auto_structures["Heart"])) +vis.add_contour({struct: auto_structures[struct] for struct in auto_structures.keys()}) +fig = vis.show() +plt.savefig(output_directory.joinpath(f"snapshot.png")) +``` + +### Run from Command Line Interface (CLI) + +This command assumes you have a thorax CT image stored in Nifti format at a location +`/path/to/ct.nii.gz`: + +```bash +platipy segmentation cardiac -o /path/to/output_folder /path/to/ct.nii.gz +``` + +### Run from a Jupyter Notebook + +A [Jupyter Notebook](https://github.com/pyplati/platipy/blob/master/examples/cardiac_segmentation.ipynb) +is available containing an example. + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pyplati/platipy/blob/master/examples/cardiac_segmentation.ipynb) + +## Troubleshooting + +### Problem: I get an error message indicating a `CUDA error: no kernel image is available for execution on the device` + +Solution: The pytorch version installed via the usual pip command above isn't always necessarily +the correct version needed for your operating system and CUDA version. Follow instructions +[here](https://pytorch.org/get-started/locally/) to install the correct version of pytorch. + +### Problem: Installing PlatiPy hangs or indicates a dependency error + +Solution: Upgrade your version of pip and try again: `pip install --upgrade pip` + +### Problem: I'm unable to run the example Jupyter Notebook on Google Colab + +Solution: Create a new code cell and upgrade the version of pip. Then reinstall the platipy +library: + +```python +!pip install --upgrade pip +!pip install platipy +``` + +If you continute to experience issues, restart the Colab runtime (Runtime->Restart Runtime) and try +again. + +> If you are experiencing other issues, please consider reporting these in the [PlatiPy GitHub +issue tracker](https://github.com/pyplati/platipy/issues/new). Any contributions to the code via +[pull requests](https://github.com/pyplati/platipy/pulls) would be appreciated. + +## References + +1. Finnegan R, Chin V, Chlap P, et al. Open-source, fully-automated hybrid cardiac substructure segmentation: development and optimisation, Submitted to Radiotherapy and Oncology. 2022. (Under Review) +1. Isensee F, Jaeger PF, Kohl SAA, Petersen J, Maier-Hein KH. nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation. Nat Methods. 2021;18(2):203-211. doi:10.1038/s41592-020-01008-z +2. Finnegan R, Dowling J, Koh E-S, et al. Feasibility of multi-atlas cardiac segmentation from thoracic planning CT in a probabilistic framework. Phys Med Biol. 2019;64(8):085006. doi:10.1088/1361-6560/ab0ea6