From 1c3481d4bd8a3bf50a6825c7b6e93bf2026952ba Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:34:36 +0100 Subject: [PATCH 01/13] clean imports Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- segmentation_test.py | 1 - tests/test_inferer.py | 1 - 2 files changed, 2 deletions(-) diff --git a/segmentation_test.py b/segmentation_test.py index 9464368..e7f0676 100644 --- a/segmentation_test.py +++ b/segmentation_test.py @@ -2,7 +2,6 @@ AuroraInferer, AuroraGPUInferer, AuroraInfererConfig, - DataMode, ) import os from path import Path diff --git a/tests/test_inferer.py b/tests/test_inferer.py index a31cc43..08a4c32 100644 --- a/tests/test_inferer.py +++ b/tests/test_inferer.py @@ -1,6 +1,5 @@ from pathlib import Path from unittest.mock import patch -import logging import nibabel as nib import pytest From b59fc8bff965f5b6a6143108663aa8a68fbe203e Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:34:48 +0100 Subject: [PATCH 02/13] new: add auxiliary Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- brainles_aurora/inferer/inferer.py | 3 ++- brainles_aurora/utils/__init__.py | 2 +- brainles_aurora/utils/utils.py | 21 --------------------- pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/brainles_aurora/inferer/inferer.py b/brainles_aurora/inferer/inferer.py index 180353a..0b1b0a2 100644 --- a/brainles_aurora/inferer/inferer.py +++ b/brainles_aurora/inferer/inferer.py @@ -35,11 +35,12 @@ BaseConfig, ) from brainles_aurora.utils import ( - turbo_path, download_model_weights, remove_path_suffixes, ) +from auxiliary.turbopath import turbo_path + logger = logging.getLogger(__name__) diff --git a/brainles_aurora/utils/__init__.py b/brainles_aurora/utils/__init__.py index aa7d72a..44a2a61 100644 --- a/brainles_aurora/utils/__init__.py +++ b/brainles_aurora/utils/__init__.py @@ -1,2 +1,2 @@ -from .utils import turbo_path, remove_path_suffixes +from .utils import remove_path_suffixes from .download import download_model_weights diff --git a/brainles_aurora/utils/utils.py b/brainles_aurora/utils/utils.py index 4601660..0115ed4 100644 --- a/brainles_aurora/utils/utils.py +++ b/brainles_aurora/utils/utils.py @@ -1,25 +1,4 @@ from pathlib import Path -import os -from typing import IO -import sys - - -def turbo_path(path: str | Path) -> Path: - """Make path absolute and normed - - Args: - path (str | Path): input path - - Returns: - Path: absolute and normed path - """ - return Path( - os.path.normpath( - os.path.abspath( - path, - ) - ) - ) def remove_path_suffixes(path: Path | str) -> Path: diff --git a/pyproject.toml b/pyproject.toml index cf85f6b..89c12fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,7 @@ numpy = ">=1.23.0" PyGithub = "^1.57" tqdm = "^4.64.1" path = "^16.2.0" +auxiliary ="^0.0.40" [tool.poetry.dev-dependencies] pytest = "^6.2" @@ -59,4 +60,4 @@ optional = true Sphinx = ">=7.0.0" sphinx-copybutton = ">=0.5.2" sphinx-rtd-theme = ">=1.3.0" -myst-parser = ">=2.0.0" \ No newline at end of file +myst-parser = ">=2.0.0" From b98791ca36404ba250345945926d1384b9f43eeb Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:35:53 +0100 Subject: [PATCH 03/13] clean import Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- tests/test_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index df14728..68aeca1 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,3 @@ -import pytest from pathlib import Path from brainles_aurora.utils import remove_path_suffixes From 0f4a794341adf7adb850d308d04026cbba32c487 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:04:20 +0100 Subject: [PATCH 04/13] move and rename example Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- .../data}/BraTS-MET-00110-000-t1c.nii.gz | Bin .../data}/BraTS-MET-00110-000-t1n.nii.gz | Bin .../data}/BraTS-MET-00110-000-t2f.nii.gz | Bin .../data}/BraTS-MET-00110-000-t2w.nii.gz | Bin .../segmentation_example.py | 8 ++++---- tests/test_inferer.py | 8 ++++---- 6 files changed, 8 insertions(+), 8 deletions(-) rename {example_data => example/data}/BraTS-MET-00110-000-t1c.nii.gz (100%) rename {example_data => example/data}/BraTS-MET-00110-000-t1n.nii.gz (100%) rename {example_data => example/data}/BraTS-MET-00110-000-t2f.nii.gz (100%) rename {example_data => example/data}/BraTS-MET-00110-000-t2w.nii.gz (100%) rename segmentation_test.py => example/segmentation_example.py (90%) diff --git a/example_data/BraTS-MET-00110-000-t1c.nii.gz b/example/data/BraTS-MET-00110-000-t1c.nii.gz similarity index 100% rename from example_data/BraTS-MET-00110-000-t1c.nii.gz rename to example/data/BraTS-MET-00110-000-t1c.nii.gz diff --git a/example_data/BraTS-MET-00110-000-t1n.nii.gz b/example/data/BraTS-MET-00110-000-t1n.nii.gz similarity index 100% rename from example_data/BraTS-MET-00110-000-t1n.nii.gz rename to example/data/BraTS-MET-00110-000-t1n.nii.gz diff --git a/example_data/BraTS-MET-00110-000-t2f.nii.gz b/example/data/BraTS-MET-00110-000-t2f.nii.gz similarity index 100% rename from example_data/BraTS-MET-00110-000-t2f.nii.gz rename to example/data/BraTS-MET-00110-000-t2f.nii.gz diff --git a/example_data/BraTS-MET-00110-000-t2w.nii.gz b/example/data/BraTS-MET-00110-000-t2w.nii.gz similarity index 100% rename from example_data/BraTS-MET-00110-000-t2w.nii.gz rename to example/data/BraTS-MET-00110-000-t2w.nii.gz diff --git a/segmentation_test.py b/example/segmentation_example.py similarity index 90% rename from segmentation_test.py rename to example/segmentation_example.py index e7f0676..de1f902 100644 --- a/segmentation_test.py +++ b/example/segmentation_example.py @@ -9,10 +9,10 @@ BASE_PATH = Path(os.path.abspath(__file__)).parent -t1 = BASE_PATH / "example_data/BraTS-MET-00110-000-t1n.nii.gz" -t1c = BASE_PATH / "example_data/BraTS-MET-00110-000-t1c.nii.gz" -t2 = BASE_PATH / "example_data/BraTS-MET-00110-000-t2w.nii.gz" -fla = BASE_PATH / "example_data/BraTS-MET-00110-000-t2f.nii.gz" +t1 = BASE_PATH / "example/data/BraTS-MET-00110-000-t1n.nii.gz" +t1c = BASE_PATH / "example/data/BraTS-MET-00110-000-t1c.nii.gz" +t2 = BASE_PATH / "example/data/BraTS-MET-00110-000-t2w.nii.gz" +fla = BASE_PATH / "example/data/BraTS-MET-00110-000-t2f.nii.gz" def load_np_from_nifti(path): diff --git a/tests/test_inferer.py b/tests/test_inferer.py index 08a4c32..7c6c226 100644 --- a/tests/test_inferer.py +++ b/tests/test_inferer.py @@ -16,19 +16,19 @@ class TestAuroraInferer: @pytest.fixture def t1_path(self): - return "example_data/BraTS-MET-00110-000-t1n.nii.gz" + return "example/data/BraTS-MET-00110-000-t1n.nii.gz" @pytest.fixture def t1c_path(self): - return "example_data/BraTS-MET-00110-000-t1c.nii.gz" + return "example/data/BraTS-MET-00110-000-t1c.nii.gz" @pytest.fixture def t2_path(self): - return "example_data/BraTS-MET-00110-000-t2w.nii.gz" + return "example/data/BraTS-MET-00110-000-t2w.nii.gz" @pytest.fixture def fla_path(self): - return "example_data/BraTS-MET-00110-000-t2f.nii.gz" + return "example/data/BraTS-MET-00110-000-t2f.nii.gz" @pytest.fixture def mock_config(self): From 6689f819f1eb59b84c277d0101ddd6d65b5b2f1c Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:05:07 +0100 Subject: [PATCH 05/13] fix turbopath Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- brainles_aurora/inferer/inferer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/brainles_aurora/inferer/inferer.py b/brainles_aurora/inferer/inferer.py index 0b1b0a2..5b80a8a 100644 --- a/brainles_aurora/inferer/inferer.py +++ b/brainles_aurora/inferer/inferer.py @@ -39,7 +39,7 @@ remove_path_suffixes, ) -from auxiliary.turbopath import turbo_path +from auxiliary.turbopath import turbopath logger = logging.getLogger(__name__) @@ -186,7 +186,7 @@ def _validate_image( f"File {data} must be a nifti file with extension .nii or .nii.gz" ) self.input_mode = DataMode.NIFTI_FILE - return turbo_path(data) + return turbopath(data) images = [ _validate_image(img) From d0d2150da3a1653dd6e4b33fa6d0475d55d44f73 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:11:44 +0100 Subject: [PATCH 06/13] format Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- tests/test_inferer.py | 53 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/tests/test_inferer.py b/tests/test_inferer.py index 7c6c226..b75e73f 100644 --- a/tests/test_inferer.py +++ b/tests/test_inferer.py @@ -45,44 +45,76 @@ def _load_np_from_nifti(path): return _load_np_from_nifti - def test_validate_images(self, t1_path, t1c_path, t2_path, fla_path, mock_inferer): + def test_validate_images( + self, + t1_path, + t1c_path, + t2_path, + fla_path, + mock_inferer, + ): images = mock_inferer._validate_images( t1=t1_path, t1c=t1c_path, t2=t2_path, fla=fla_path ) assert len(images) == 4 assert all(isinstance(img, Path) for img in images) - def test_validate_images_file_not_found(self, mock_inferer): + def test_validate_images_file_not_found( + self, + mock_inferer, + ): with pytest.raises(FileNotFoundError): _ = mock_inferer._validate_images(t1="invalid_path.nii.gz") def test_validate_images_different_types( - self, mock_inferer, t1_path, t1c_path, load_np_from_nifti + self, + mock_inferer, + t1_path, + t1c_path, + load_np_from_nifti, ): with pytest.raises(AssertionError): _ = mock_inferer._validate_images( t1=t1_path, t1c=load_np_from_nifti(t1c_path) ) - def test_validate_images_no_inputs(self, mock_inferer): + def test_validate_images_no_inputs( + self, + mock_inferer, + ): with pytest.raises(AssertionError): _ = mock_inferer._validate_images() - def test_determine_inference_mode(self, mock_inferer, t1_path): + def test_determine_inference_mode( + self, + mock_inferer, + t1_path, + ): validated_images = mock_inferer._validate_images(t1=t1_path) mode = mock_inferer._determine_inference_mode(images=validated_images) assert isinstance(mode, InferenceMode) - def test_determine_inference_mode_not_implemented(self, mock_inferer, t2_path): + def test_determine_inference_mode_not_implemented( + self, + mock_inferer, + t2_path, + ): images = mock_inferer._validate_images(t2=t2_path) with pytest.raises(NotImplementedError): mode = mock_inferer._determine_inference_mode(images=images) - def test_infer(self, mock_inferer, t1_path): + def test_infer( + self, + mock_inferer, + t1_path, + ): with patch.object(mock_inferer, "_sliding_window_inference", return_value=None): mock_inferer.infer(t1=t1_path) - def test_configure_device(self, mock_config): + def test_configure_device( + self, + mock_config, + ): inferer = AuroraInferer(config=mock_config) device = inferer._configure_device() assert device == torch.device("cpu") @@ -91,7 +123,10 @@ def test_configure_device(self, mock_config): not torch.cuda.is_available(), reason="Skipping GPU device test since cuda is not available", ) - def test_configure_device_gpu(self, mock_config): + def test_configure_device_gpu( + self, + mock_config, + ): inferer = AuroraGPUInferer(config=mock_config) device = inferer._configure_device() assert device == torch.device("cuda") From 88968b1dbef483dd61eef5461394611e83b7491a Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:13:34 +0100 Subject: [PATCH 07/13] format Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- tests/test_inferer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_inferer.py b/tests/test_inferer.py index b75e73f..6117f7e 100644 --- a/tests/test_inferer.py +++ b/tests/test_inferer.py @@ -54,7 +54,10 @@ def test_validate_images( mock_inferer, ): images = mock_inferer._validate_images( - t1=t1_path, t1c=t1c_path, t2=t2_path, fla=fla_path + t1=t1_path, + t1c=t1c_path, + t2=t2_path, + fla=fla_path, ) assert len(images) == 4 assert all(isinstance(img, Path) for img in images) From 26329c0a570b0d434ba4e0e9e89d03af6c36c853 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:26:48 +0100 Subject: [PATCH 08/13] also make it pathlib Path Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- brainles_aurora/inferer/inferer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brainles_aurora/inferer/inferer.py b/brainles_aurora/inferer/inferer.py index 5b80a8a..255fec2 100644 --- a/brainles_aurora/inferer/inferer.py +++ b/brainles_aurora/inferer/inferer.py @@ -186,7 +186,7 @@ def _validate_image( f"File {data} must be a nifti file with extension .nii or .nii.gz" ) self.input_mode = DataMode.NIFTI_FILE - return turbopath(data) + return Path(turbopath(data)) images = [ _validate_image(img) From 2b525ec9e4ddde26d0735968969042df6ff8845b Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Sat, 3 Feb 2024 22:42:47 +0100 Subject: [PATCH 09/13] manuscripts Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- README.md | 36 +++++------------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 145153d..fea9b10 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,12 @@ [![tests](https://github.com/BrainLesion/AURORA/actions/workflows/tests.yml/badge.svg)](https://github.com/BrainLesion/AURORA/actions/workflows/tests.yml) # AURORA - -Deep learning models for the manuscript - -[Identifying core MRI sequences for reliable automatic brain metastasis segmentation](https://www.medrxiv.org/content/10.1101/2023.05.02.23289342v1) +Deep learning models for brain cancer metastasis segmentation based on the manuscripts: +* [Identifying core MRI sequences for reliable automatic brain metastasis segmentation](https://www.medrxiv.org/content/10.1101/2023.05.02.23289342v1) +* [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) ## Installation - -With a Python 3.10+ environment you can install directly from [pypi.org](https://pypi.org/project/brainles-aurora/): +With a Python 3.10+ environment, you can install directly from [pypi.org](https://pypi.org/project/brainles-aurora/): ``` pip install brainles-aurora @@ -25,26 +23,7 @@ pip install brainles-aurora further details in requirements.txt ## Usage - -**Tutorial.ipynb**: Step-by-step example of project setup and segmentation of supplied example data ([BraTS-METS](https://doi.org/10.48550/arXiv.2306.00838)) - -**run_inference_cli.py**: Simple command-line implementation: - -This command will list all available options: - - python3 /run_inference_cli.py --help - -**run_inference.py**: Example script for single inference. More customization possible. - -**_Input: t1_file, t1c_file, t2_file, fla_file_** - -All 4 input files must be nifti (nii.gz) files containing 3D MRIs. Please ensure that all input images are correctly preprocessed (skullstripped, co-registered, registered on SRI-24). You can use [BraTS Toolkit](https://github.com/neuronflow/BraTS-Toolkit) for preprocessing (please follow the instructions [here](https://github.com/neuronflow/BraTS-Toolkit)). - -**_Output: segmentation_file_** - -Add path to your desired output folder. - -**_optional Output: whole_network_outputs_file, enhancing_network_outputs_file_** +BrainLes features Jupyter Notebook [tutorials](https://github.com/BrainLesion/tutorials/tree/main/AURORA) with usage instructions. ## Citation @@ -77,11 +56,6 @@ also consider citing the original AURORA manuscript: [Development and external v } ``` -## Four Sequences - -If you have all four MR sequences (T1, T1c, T2, FLAIR) consider using: -https://github.com/neuronflow/AURORA - ## Licensing This project is licensed under the terms of the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.de.html). From f27871979f8fba51184782b7858b5674fac0e552 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Sat, 3 Feb 2024 22:44:10 +0100 Subject: [PATCH 10/13] citation Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fea9b10..3303bff 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,7 @@ further details in requirements.txt BrainLes features Jupyter Notebook [tutorials](https://github.com/BrainLesion/tutorials/tree/main/AURORA) with usage instructions. ## Citation - -when using the software please cite TODO - +Please support our development by citing the following manuscripts: ``` @article {Buchner2023.05.02.23289342, author = {Josef A Buchner and Jan C Peeken and Lucas Etzel and Ivan Ezhov and Michael Mayinger and Sebastian M Christ and Thomas B Brunner and Andrea Wittig and Bj{\"o}rn Menze and Claus Zimmer and Bernhard Meyer and Matthias Guckenberger and Nicolaus Andratschke and Rami A El Shafie and J{\"u}rgen Debus and Susanne Rogers and Oliver Riesterer and Katrin Schulze and Horst J Feldmann and Oliver Blanck and Constantinos Zamboglou and Konstantinos Ferentinos and Angelika Bilger and Anca L Grosu and Robert Wolff and Jan S Kirschke and Kerstin A Eitz and Stephanie E Combs and Denise Bernhardt and Daniel R{\"u}ckert and Marie Piraud and Benedikt Wiestler and Florian Kofler}, @@ -44,7 +42,7 @@ when using the software please cite TODO } ``` -also consider citing the original AURORA manuscript: [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) +also consider citing the original AURORA manuscript when using the `vanilla` model: [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) ``` @article{buchner2022development, From a7320cb5554636a41b8b9212b76cd9f447bbc7b3 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Sat, 3 Feb 2024 23:05:44 +0100 Subject: [PATCH 11/13] req Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3303bff..fccb676 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,7 @@ pip install brainles-aurora - CUDA 11.4+ (https://developer.nvidia.com/cuda-toolkit) - Python 3.10+ -- GPU with at least 8GB of VRAM - -further details in requirements.txt +- GPU with CUDA support and at least 8GB of VRAM ## Usage BrainLes features Jupyter Notebook [tutorials](https://github.com/BrainLesion/tutorials/tree/main/AURORA) with usage instructions. @@ -42,7 +40,7 @@ Please support our development by citing the following manuscripts: } ``` -also consider citing the original AURORA manuscript when using the `vanilla` model: [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) +also consider citing the original AURORA manuscript, especially when using the `vanilla` model: [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) ``` @article{buchner2022development, @@ -54,6 +52,7 @@ also consider citing the original AURORA manuscript when using the `vanilla` mod } ``` + ## Licensing This project is licensed under the terms of the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.de.html). From 985903c97849935601ca917c038db6325c71dbd5 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Sat, 3 Feb 2024 23:05:48 +0100 Subject: [PATCH 12/13] version Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fccb676..598f3f8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![PyPI version panoptica](https://badge.fury.io/py/brainles-aurora.svg)](https://pypi.python.org/pypi/brainles-aurora/) +[![PyPI version AURORA](https://badge.fury.io/py/brainles-aurora.svg)](https://pypi.python.org/pypi/brainles-aurora/) [![Documentation Status](https://readthedocs.org/projects/brainles-aurora/badge/?version=latest)](http://brainles-aurora.readthedocs.io/?badge=latest) [![tests](https://github.com/BrainLesion/AURORA/actions/workflows/tests.yml/badge.svg)](https://github.com/BrainLesion/AURORA/actions/workflows/tests.yml) From af3c1b3a0273f9ca06683dee9d86732748edb942 Mon Sep 17 00:00:00 2001 From: neuronflow <7048826+neuronflow@users.noreply.github.com> Date: Sat, 3 Feb 2024 23:11:17 +0100 Subject: [PATCH 13/13] citation update Signed-off-by: neuronflow <7048826+neuronflow@users.noreply.github.com> --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 598f3f8..de0df35 100644 --- a/README.md +++ b/README.md @@ -25,22 +25,24 @@ BrainLes features Jupyter Notebook [tutorials](https://github.com/BrainLesion/tu ## Citation Please support our development by citing the following manuscripts: + +[Identifying core MRI sequences for reliable automatic brain metastasis segmentation](https://www.sciencedirect.com/science/article/pii/S016781402389795X) + ``` -@article {Buchner2023.05.02.23289342, - author = {Josef A Buchner and Jan C Peeken and Lucas Etzel and Ivan Ezhov and Michael Mayinger and Sebastian M Christ and Thomas B Brunner and Andrea Wittig and Bj{\"o}rn Menze and Claus Zimmer and Bernhard Meyer and Matthias Guckenberger and Nicolaus Andratschke and Rami A El Shafie and J{\"u}rgen Debus and Susanne Rogers and Oliver Riesterer and Katrin Schulze and Horst J Feldmann and Oliver Blanck and Constantinos Zamboglou and Konstantinos Ferentinos and Angelika Bilger and Anca L Grosu and Robert Wolff and Jan S Kirschke and Kerstin A Eitz and Stephanie E Combs and Denise Bernhardt and Daniel R{\"u}ckert and Marie Piraud and Benedikt Wiestler and Florian Kofler}, - title = {Identifying core MRI sequences for reliable automatic brain metastasis segmentation}, - elocation-id = {2023.05.02.23289342}, - year = {2023}, - doi = {10.1101/2023.05.02.23289342}, - publisher = {Cold Spring Harbor Laboratory Press}, - abstract = {Background: Many automatic approaches to brain tumor segmentation employ multiple magnetic resonance imaging (MRI) sequences. The goal of this project was to compare different combinations of input sequences to determine which MRI sequences are needed for effective automated brain metastasis (BM) segmentation. Methods: We analyzed preoperative imaging (T1-weighted sequence without and with contrast- enhancement (T1/T1-CE), T2-weighted sequence (T2), and T2 fluid-attenuated inversion recovery (T2-FLAIR) sequence) from 333 patients with BMs from six centers. A baseline 3D U-Net with all four sequences and six U-Nets with plausible sequence combinations (T1-CE, T1, T2-FLAIR, T1-CE+T2-FLAIR, T1-CE+T1+T2-FLAIR, T1- CE+T1) were trained on 239 patients from two centers and subsequently tested on an external cohort of 94 patients from four centers. Results: The model based on T1-CE alone achieved the best segmentation performance for BM segmentation with a median Dice similarity coefficient (DSC) of 0.96. Models trained without T1-CE performed worse (T1-only: DSC = 0.70 and T2- FLAIR-only: DSC = 0.72). For edema segmentation, models that included both T1-CE and T2-FLAIR performed best (DSC = 0.93), while the remaining four models without simultaneous inclusion of these both sequences reached a median DSC of 0.81-0.89. Conclusions: A T1-CE-only protocol suffices for the segmentation of BMs. The combination of T1-CE and T2-FLAIR is important for edema segmentation. Missing either T1-CE or T2-FLAIR decreases performance. These findings may improve imaging routines by omitting unnecessary sequences, thus allowing for faster procedures in daily clinical practice while enabling optimal neural network-based target definitions.Competing Interest StatementThe authors have declared no competing interest.Funding StatementThis work was funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation - PE 3303/1-1 (JCP), WI 4936/4-1 (BW)).Author DeclarationsI confirm all relevant ethical guidelines have been followed, and any necessary IRB and/or ethics committee approvals have been obtained.YesThe details of the IRB/oversight body that provided approval or exemption for the research described are given below:The ethics committee of Technical University of Munich gave ethical approval for this work (119/19 S-SR; 466/16 S)I confirm that all necessary patient/participant consent has been obtained and the appropriate institutional forms have been archived, and that any patient/participant/sample identifiers included were not known to anyone (e.g., hospital staff, patients or participants themselves) outside the research group so cannot be used to identify individuals.YesI understand that all clinical trials and any other prospective interventional studies must be registered with an ICMJE-approved registry, such as ClinicalTrials.gov. I confirm that any such study reported in the manuscript has been registered and the trial registration ID is provided (note: if posting a prospective study registered retrospectively, please provide a statement in the trial ID field explaining why the study was not registered in advance).Yes I have followed all appropriate research reporting guidelines, such as any relevant EQUATOR Network research reporting checklist(s) and other pertinent material, if applicable.YesThe datasets generated and analyzed during the current study are not available.}, - URL = {https://www.medrxiv.org/content/early/2023/05/02/2023.05.02.23289342}, - eprint = {https://www.medrxiv.org/content/early/2023/05/02/2023.05.02.23289342.full.pdf}, - journal = {medRxiv} +@article{buchner2023identifying, + title={Identifying core MRI sequences for reliable automatic brain metastasis segmentation}, + author={Buchner, Josef A and Peeken, Jan C and Etzel, Lucas and Ezhov, Ivan and Mayinger, Michael and Christ, Sebastian M and Brunner, Thomas B and Wittig, Andrea and Menze, Bjoern H and Zimmer, Claus and others}, + journal={Radiotherapy and Oncology}, + volume={188}, + pages={109901}, + year={2023}, + publisher={Elsevier} } ``` -also consider citing the original AURORA manuscript, especially when using the `vanilla` model: [Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) +also consider citing the original AURORA manuscript, especially when using the `vanilla` model: + +[Development and external validation of an MRI-based neural network for brain metastasis segmentation in the AURORA multicenter study](https://www.sciencedirect.com/science/article/pii/S0167814022045625) ``` @article{buchner2022development,