From 0ea03b4ea4adda246950222949a21d7dd5472077 Mon Sep 17 00:00:00 2001 From: John Wilkie <124276291+JBWilkie@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:25:39 +0100 Subject: [PATCH] [DAR-2504][External] Generate empty NifTI volumes when no polygons are present (#863) * Update EVENT_merge_to_master.yml with V3 > V7 github-script changes * temp test * temp test * Undo temp changes * Improved NifTI import dependency failure error message * Undid GHA workflow changes * ga . * WIP * Correct error message * Corrected test failure output message * Output empty file if no annotations & unit tests --- .github/workflows/EVENT_merge_to_master.yml | 4 +- darwin/exporter/formats/nifti.py | 21 ++++++--- darwin/importer/formats/nifti.py | 4 +- .../exporter/formats/export_nifti_test.py | 43 +++++++++++++++++- tests/data.zip | Bin 248307 -> 251981 bytes 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/.github/workflows/EVENT_merge_to_master.yml b/.github/workflows/EVENT_merge_to_master.yml index 6f14c2eb5..4841f8fbd 100644 --- a/.github/workflows/EVENT_merge_to_master.yml +++ b/.github/workflows/EVENT_merge_to_master.yml @@ -49,6 +49,4 @@ jobs: repo: context.repo.repo, sha: context.sha, state: 'success' - }) - - + }) \ No newline at end of file diff --git a/darwin/exporter/formats/nifti.py b/darwin/exporter/formats/nifti.py index 65576952a..e4db64e46 100644 --- a/darwin/exporter/formats/nifti.py +++ b/darwin/exporter/formats/nifti.py @@ -72,10 +72,17 @@ def export(annotation_files: Iterable[dt.AnnotationFile], output_dir: Path) -> N for ann in video_annotation.annotations if ann.annotation_class.annotation_type == "polygon" ] + # Check if there are any rasters in the annotation, these are created with a _m suffix + # in addition to those created from polygons. + annotation_types = [ + a.annotation_class.annotation_type for a in video_annotation.annotations + ] + mask_present = "raster_layer" in annotation_types and "mask" in annotation_types output_volumes = build_output_volumes( video_annotation, class_names_to_export=polygon_class_names, from_raster_layer=False, + mask_present=mask_present, ) slot_map = {slot.name: slot for slot in video_annotation.slots} polygon_annotations = [ @@ -90,13 +97,8 @@ def export(annotation_files: Iterable[dt.AnnotationFile], output_dir: Path) -> N write_output_volume_to_disk( output_volumes, image_id=image_id, output_dir=output_dir ) - # Check if there are any rasters in the annotation, these are created with a _m suffix - # in addition to those created from polygons. - annotation_types = [ - a.annotation_class.annotation_type for a in video_annotation.annotations - ] # Need to map raster layers to SeriesInstanceUIDs - if "raster_layer" in annotation_types and "mask" in annotation_types: + if mask_present: mask_id_to_classname = { ann.id: ann.annotation_class.name for ann in video_annotation.annotations @@ -130,6 +132,7 @@ def build_output_volumes( video_annotation: dt.AnnotationFile, from_raster_layer: bool = False, class_names_to_export: List[str] = None, + mask_present: Optional[bool] = False, ) -> Dict: """ This is a function to create the output volumes based on the whole annotation file @@ -142,6 +145,8 @@ def build_output_volumes( Whether the output volumes are being built from raster layers or not class_names_to_export : List[str] The list of class names to export + mask_present: bool + If mask annotations are present in the annotation Returns ------- output_volumes: Dict @@ -160,6 +165,10 @@ def build_output_volumes( ) # Builds output volumes per class volume_dims, pixdims, affine, original_affine = process_metadata(slot.metadata) + if not mask_present and not class_names_to_export: + class_names_to_export = [ + "" + ] # If there are no annotations to export, we still need to create an empty volume output_volumes[series_instance_uid] = { class_name: Volume( pixel_array=np.zeros(volume_dims), diff --git a/darwin/importer/formats/nifti.py b/darwin/importer/formats/nifti.py index 54821c48a..476b9a6c0 100644 --- a/darwin/importer/formats/nifti.py +++ b/darwin/importer/formats/nifti.py @@ -16,8 +16,8 @@ from scipy.ndimage import zoom except ImportError: import_fail_string = """ - You must install darwin-py with pip install nibabel connected-components-3d - in order to import with using nifti format + You must install darwin-py with pip install darwin-py\[medical] + in order to import using nifti format """ console.print(import_fail_string) sys.exit(1) diff --git a/tests/darwin/exporter/formats/export_nifti_test.py b/tests/darwin/exporter/formats/export_nifti_test.py index 648e1ed72..0bfd6d167 100644 --- a/tests/darwin/exporter/formats/export_nifti_test.py +++ b/tests/darwin/exporter/formats/export_nifti_test.py @@ -102,7 +102,7 @@ def test_export_calls_populate_output_volumes_from_polygons( / team_slug_darwin_json_v2 / "nifti/releases/latest/annotations" ) - video_annotation_filepaths = [annotations_dir / "polygon_no_mask.json"] + video_annotation_filepaths = [annotations_dir / "polygon_only.json"] video_annotations = list( darwin_to_dt_gen(video_annotation_filepaths, False) ) @@ -124,9 +124,48 @@ def test_export_calls_populate_output_volumes_from_raster_layer( / team_slug_darwin_json_v2 / "nifti/releases/latest/annotations" ) - video_annotation_filepaths = [annotations_dir / "mask_no_polygon.json"] + video_annotation_filepaths = [annotations_dir / "mask_only.json"] video_annotations = list( darwin_to_dt_gen(video_annotation_filepaths, False) ) nifti.export(video_annotations, output_dir=Path(tmpdir)) mock.assert_called() + + +def test_export_creates_file_for_polygons_and_masks( + team_slug_darwin_json_v2: str, +): + with tempfile.TemporaryDirectory() as tmpdir: + with ZipFile("tests/data.zip") as zfile: + zfile.extractall(tmpdir) + annotations_dir = ( + Path(tmpdir) + / team_slug_darwin_json_v2 + / "nifti/releases/latest/annotations" + ) + video_annotation_files = { + "mask_only.json": ["hippocampus_multislot_3_test_hippo_LOIN_m.nii.gz"], + "polygon_only.json": [ + "hippocampus_multislot_3_test_hippo_create_class_1.nii.gz" + ], + "polygon_and_mask.json": [ + "hippocampus_multislot_3_test_hippo_create_class_1.nii.gz", + "hippocampus_multislot_3_test_hippo_LOIN_m.nii.gz", + ], + "empty.json": ["hippocampus_multislot_3_test_hippo_.nii.gz"], + } + for video_annotation_file in video_annotation_files: + video_annotation_filepaths = [annotations_dir / video_annotation_file] + video_annotations = list( + darwin_to_dt_gen(video_annotation_filepaths, False) + ) + nifti.export(video_annotations, output_dir=Path(tmpdir)) + for output_file in video_annotation_files[video_annotation_file]: + assert ( + Path(tmpdir) / output_file + ).exists(), ( + f"Expected file {output_file} does not exist in {tmpdir}" + ) + # Empty the directory for the next test + for output_file in video_annotation_files[video_annotation_file]: + (Path(tmpdir) / output_file).unlink() diff --git a/tests/data.zip b/tests/data.zip index dedd46487114a5342ef71297481f94041cde0824..3d36760e7ce78d00ecf5ffd0133c2c5180690eea 100644 GIT binary patch delta 21657 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μm6vs#oNbRZw#+z)yq?! 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 Qny&#gG{&x=h??gA0E<|}G5`Po delta 18188 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