diff --git a/helpers/visceral_make_splits.py b/helpers/visceral_make_splits.py new file mode 100644 index 0000000000000000000000000000000000000000..1cbe3f56f0bf101555265ad22743dd64a1c45092 --- /dev/null +++ b/helpers/visceral_make_splits.py @@ -0,0 +1,118 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""Generate visceral default JSON dataset for 3d binary classification tasks in mednet. + +Arguments of the scripts are as follow: + root-of-preprocessed-visceral-dataset + Full path to the root of the preprocessed visceral dataset. + Filenames in the resulting json are relative to this path. + See output format below. + output-folder + Full path to the folder where to output the default.json file containing the default split of data. + organ_1_id + Integer representing the ID of the first organ to include in the split dataset. + This organ will be labeled as 0 for the binary classification task. + For example, 237 corresponds to bladder. + organ_2_id + Integer representing the ID of the second organ to include in the split dataset. + This organ will be labeled as 1 for the binary classification task. + For example, 237 corresponds to bladder. + +Output format is the following: + +.. code:: json + + { + "train": [ + [ + "<size>/<filename>", + # label is one of: + # 0: organ_1 / 1: organ_2 + <label>, + ], + ... + ], + "validation": [ + # same format as for train + ... + ] + "test": [ + # same format as for train + ... + ] +""" + +import json +import os +import pathlib +import sys + +from sklearn.model_selection import train_test_split + + +def split_files( + files: list[str], + train_size: float = 0.7, + test_size: float = 0.2, + validation_size: float = 0.1, +): + train_files, temp_files = train_test_split(files, test_size=(1 - train_size)) + test_files, validation_files = train_test_split( + temp_files, test_size=(validation_size / (test_size + validation_size)) + ) + return train_files, test_files, validation_files + + +def save_to_json( + train_files: list[str], + test_files: list[str], + validation_files: list[str], + output_file: str, + organ_1_id: str, +): + data = { + "train": [ + [filename, 0 if organ_1_id in filename else 1] for filename in train_files + ], + "test": [ + [filename, 0 if organ_1_id in filename else 1] for filename in test_files + ], + "validation": [ + [filename, 0 if organ_1_id in filename else 1] + for filename in validation_files + ], + } + + with pathlib.Path(output_file).open("w") as json_file: + json.dump(data, json_file, indent=2) + + +def main(): + if len(sys.argv) != 6: + print(__doc__) + print( + f"Usage: python3 {sys.argv[0]} <root-of-preprocessed-visceral-dataset> <output-folder> <organ_1_id> <organ_2_id> <size>" + ) + sys.exit(0) + + root_folder = sys.argv[1] + output_folder = sys.argv[2] + organ_1_id = sys.argv[3] + organ_2_id = sys.argv[4] + size = sys.argv[5] + output_file = pathlib.Path(output_folder) / "default.json" + input_folder = pathlib.Path(root_folder) / size + files = [ + f"{size}/{file}" + for file in os.listdir(input_folder) + if organ_1_id in file or organ_2_id in file + ] + train_files, test_files, validation_files = split_files(files) + + save_to_json(train_files, test_files, validation_files, output_file, organ_1_id) + print(f"Data saved to {output_file}") + + +if __name__ == "__main__": + main() diff --git a/helpers/visceral_preprocess.py b/helpers/visceral_preprocess.py new file mode 100644 index 0000000000000000000000000000000000000000..3391f5128db47970f3948cfd558388e95566bbe2 --- /dev/null +++ b/helpers/visceral_preprocess.py @@ -0,0 +1,180 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""Preprocess visceral dataset to prepare volume cubes for organ classification using 3D cnn. +Example of use: 'python visceral_preprocess.py /idiap/temp/ojimenez/previous-projects/VISCERAL /idiap/home/ypannatier/visceral/preprocessed 237 16 '. + +Arguments of the scripts are as follow: + root-of-visceral-dataset + Full path to the root of the visceral dataset. + output_folder_path + Full path to the folder where the prepared cubes will be saved. + Note that the script will create a subfolder corresponding to the desired size of cube to avoid mixing volumes of different sizes. + organ_id + Integer representing the ID of the organ to process in the visceral dataset. For example, 237 corresponds to bladder. + size + Integer representing the size of the volume cube that will be output. Each volume will be of dimension SIZExSIZExSIZE. +""" + +import os +import pathlib +import sys + +import torch +import torchio as tio + + +def get_mask_cube(mask_path: str, size: int) -> torch.Tensor: + """Create a mask of dimension SIZExSIZExSIZE from the input mask at the center of the non-zero area. + + Parameters + ---------- + mask_path + A string representing the full path to the mask file. + size + An integer representing the size of the cube. + + Returns + ------- + Tensor + The mask tensor representing a volume of dimension SIZExSIZExSIZE. + """ + mask_image = tio.ScalarImage(mask_path) + mask_data = mask_image.data.bool().squeeze() + mask_image.unload() + ones_coords = torch.nonzero(mask_data) + center = torch.mean(ones_coords.float(), dim=0).long() + half_size = int(size) // 2 + start_coords = center - half_size + end_coords = center + half_size + result = torch.zeros_like(mask_data) + slices = [ + slice(max(0, start), min(end, dim)) + for start, end, dim in zip(start_coords, end_coords, mask_data.shape) + ] + result[slices[0], slices[1], slices[2]] = 1 + return result + + +def get_masks(mask_paths: list[str], filters: list[str], volume_ids: list[str]): + """Find the list of usable masks corresponding to the desired organ. + + Parameters + ---------- + mask_paths + A list of strings representing the folders in which to search for masks. + filters + A list of strings corresponding to a substring of mask's file name. A valid mask must match one of the filters. + Each filter should contains the organ id. + Example: To get the white/black CT scans corresponding to an organ: "_1_CT_wb_{organ_id}". + volume_ids + A list containing the list of all patient ids retrieved from the volume dataset. + Valid masks must start by one of entry of volume ids. + + Returns + ------- + The list of valid masks as a list of strings. Each list contains 2 entries. First, the path to the mask folder, second the mask file name. + """ + masks = [] + for mask_path in mask_paths: + for mask_filter in filters: + available_masks = os.listdir(mask_path) + for mask in available_masks: + if ( + mask.endswith(".nii.gz") + and mask_filter in mask + and mask.split("_")[0] in volume_ids + ): + masks.append([mask_path, mask]) + return masks + + +def main(): + if len(sys.argv) != 5: + print(__doc__) + print( + f"Usage: python3 {sys.argv[0]} <root-of-visceral-dataset> <output_folder_path> <organ_id> <size>" + ) + sys.exit(0) + + root_path = sys.argv[1] + output_path = sys.argv[2] + organ_id = sys.argv[3] + size = sys.argv[4] + + filters = [f"_1_CTce_ThAb_{organ_id}", f"_1_CT_wb_{organ_id}", f"_1_{organ_id}"] + + annot_2_mask_path = ( + pathlib.Path(root_path) + / "annotations" + / "Anatomy2" + / "anat2-trainingset" + / "Anat2_Segmentations" + ) + + annot_3_mask_path = ( + pathlib.Path(root_path) + / "annotations" + / "Anatomy3" + / "Visceral-QC-testset" + / "qc-anat3-testset-segmentations" + ) + + silver_corpus_mask_path = ( + pathlib.Path(root_path) + / "annotations" + / "SilverCorpus" + / "AnatomySilverCorpus" + / "BinarySegmentations" + ) + + mask_paths = [annot_2_mask_path, annot_3_mask_path, silver_corpus_mask_path] + volume_path = ( + pathlib.Path(root_path) + / "volumes_for_annotation" + / "GeoS_oriented_Volumes(Annotators)" + ) + output_size_path = pathlib.Path(output_path) / size + + # Ensure required output folders exist + output_size_path.mkdir(parents=True, exist_ok=True) + + volumes = os.listdir(volume_path) + volume_ids = [volume.split("_")[0] for volume in volumes] + + masks = get_masks(mask_paths, filters, volume_ids) + + print(f"Found {len(masks)} volumes to process...") + print("Generating volumes...") + for i, mask in enumerate(masks): + if i % 10 == 0: + print(f"Generated volumes: {i}/{len(masks)}") + + patient_id = f'{mask[1].split("_")[0]}_1' + full_path = pathlib.Path(mask[0]) / mask[1] + volume_name = [volume for volume in volumes if patient_id in volume][0] + volume_full_path = pathlib.Path(volume_path) / volume_name + output_full_path = pathlib.Path(output_size_path) / mask[1] + + if pathlib.Path.exists(output_full_path): + continue + + try: + mask_cube = get_mask_cube(full_path, size) + + volume_image = tio.ScalarImage(volume_full_path) + volume_data = volume_image.data.squeeze() + volume_image.unload() + volume_data = ( + volume_data[mask_cube == 1] + .reshape(int(size), int(size), int(size)) + .unsqueeze(0) + ) + cropped_volume = tio.ScalarImage(tensor=volume_data) + cropped_volume.save(output_full_path) + except Exception as e: + print(f"Error: {e} while processing {full_path}") + + +if __name__ == "__main__": + main() diff --git a/pixi.lock b/pixi.lock index ec588a12e2e1d4cf8caaa0ade8459d5c5834d85a..b992a9e41a8834d01f8eb042c0a07369879372cd 100644 --- a/pixi.lock +++ b/pixi.lock @@ -65,10 +65,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -112,6 +114,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda @@ -184,6 +187,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -261,6 +265,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.17-py312h4b3b743_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -326,6 +331,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -347,6 +353,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -454,10 +461,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -496,6 +505,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda @@ -558,6 +568,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -618,6 +629,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -679,6 +691,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -700,6 +713,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -816,11 +830,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fancycompleter-0.9.1-py312h7900ff3_1007.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -865,6 +881,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda @@ -946,6 +963,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -1029,6 +1047,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.17-py312h4b3b743_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda @@ -1105,6 +1124,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -1141,6 +1161,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cu121.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -1264,11 +1285,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fancycompleter-0.9.1-py312h81bd7bf_1007.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -1308,6 +1331,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda @@ -1373,6 +1397,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -1436,6 +1461,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda @@ -1506,6 +1532,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -1542,6 +1569,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -1651,9 +1679,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -1690,12 +1720,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h083dece_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.11-hfc55251_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -1759,6 +1791,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -1835,6 +1868,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -1888,6 +1922,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py312h1fcc3ea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -1907,6 +1942,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cu121.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -1999,9 +2035,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -2033,12 +2071,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imagecodecs-2024.6.1-py312h3901bda_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.11-h1059232_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jasper-4.2.4-h6c4e4ef_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -2087,6 +2127,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -2143,6 +2184,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -2189,6 +2231,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.5.0-py312h1b546db_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -2208,6 +2251,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -2301,9 +2345,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -2340,12 +2386,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py312h083dece_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.11-hfc55251_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -2409,6 +2457,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -2485,6 +2534,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda @@ -2538,6 +2588,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py312h1fcc3ea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -2557,6 +2608,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cu121.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -2650,9 +2702,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -2684,12 +2738,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imagecodecs-2024.6.1-py312h3901bda_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.11-h1059232_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jasper-4.2.4-h6c4e4ef_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -2738,6 +2794,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -2794,6 +2851,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda @@ -2840,6 +2898,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.5.0-py312h1b546db_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -2859,6 +2918,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -2963,11 +3023,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fancycompleter-0.9.1-py312h7900ff3_1007.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -3012,6 +3074,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda @@ -3087,6 +3150,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -3167,6 +3231,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.17-py312h4b3b743_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda @@ -3241,6 +3306,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -3277,6 +3343,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -3399,11 +3466,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fancycompleter-0.9.1-py312h81bd7bf_1007.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -3443,6 +3512,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda @@ -3508,6 +3578,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -3571,6 +3642,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.2.17-py312h5280bc4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda @@ -3641,6 +3713,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -3677,6 +3750,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -3783,9 +3857,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -3822,6 +3898,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda @@ -3829,6 +3906,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.11-hfc55251_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -3886,6 +3964,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -3960,6 +4039,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda @@ -4018,6 +4098,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py312h1fcc3ea_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -4037,6 +4118,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -4136,9 +4218,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -4170,6 +4254,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda @@ -4177,6 +4262,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.11-h1059232_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jasper-4.2.4-h6c4e4ef_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.4.2-pyhd8ed1ab_0.conda @@ -4225,6 +4311,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -4282,6 +4369,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda @@ -4335,6 +4423,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.5.0-py312h1b546db_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py312h14ffa8f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -4354,6 +4443,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py312_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -4441,10 +4531,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -4481,12 +4573,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2024.6.1-py311h60053b1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.1.11-hfc55251_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda @@ -4545,6 +4639,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.1.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.10.2-hcae5a98_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda @@ -4618,6 +4713,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.100-hca3bf56_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda @@ -4672,6 +4768,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.5.0-py311he08f58d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py311hb755f60_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda @@ -4692,6 +4789,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/linux-64/torchvision-0.17.2-py311_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -4785,10 +4883,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.2.14-pyh1a96a4e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ffmpeg-6.1.1-gpl_hc16618e_112.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fmt-10.2.1-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -4820,12 +4920,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.3-nompi_hec07895_105.conda - conda: https://conda.anaconda.org/conda-forge/noarch/huggingface_hub-0.23.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imagecodecs-2024.6.1-py311h038a4eb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.34.1-pyh4b66e23_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imath-3.1.11-h1059232_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jasper-4.2.4-h6c4e4ef_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda @@ -4875,6 +4977,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libidn2-2.3.7-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.10.2-h07599a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-h1eb4d9f_1018.conda @@ -4931,6 +5034,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nettle-3.9.1-h40ed0f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nspr-4.35-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nss-3.100-hc6e9f88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py311h7125741_0.conda @@ -4980,6 +5084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.5.0-py311hbfb48bc_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.1-py311hceeca8c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-70.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py311hbaf5611_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.0-hd04f947_1.conda @@ -5000,6 +5105,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/torchmetrics-1.4.0.post0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/pytorch/osx-arm64/torchvision-0.17.2-py311_cpu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.4-pyhd8ed1ab_0.conda @@ -7196,6 +7302,37 @@ packages: - pkg:pypi/editables?source=conda-forge-mapping size: 10988 timestamp: 1705857085102 +- kind: conda + name: eigen + version: 3.4.0 + build: h00ab1b0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda + sha256: 53b15a98aadbe0704479bacaf7a5618fcb32d1577be320630674574241639b34 + md5: b1b879d6d093f55dd40d58b5eb2f0699 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 1088433 + timestamp: 1690272126173 +- kind: conda + name: eigen + version: 3.4.0 + build: h1995070_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/eigen-3.4.0-h1995070_0.conda + sha256: c20b3677b16d8907343fce68e7c437184fef7f5ed0a765c104b775f8a485c5c9 + md5: 3691ea3ff568ba38826389bafc717909 + depends: + - libcxx >=15.0.7 + license: MPL-2.0 + license_family: MOZILLA + purls: [] + size: 1087751 + timestamp: 1690275869049 - kind: conda name: entrypoints version: '0.4' @@ -7403,6 +7540,46 @@ packages: purls: [] size: 9788322 timestamp: 1716145697248 +- kind: conda + name: fftw + version: 3.3.10 + build: nompi_h6637ab6_110 + build_number: 110 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fftw-3.3.10-nompi_h6637ab6_110.conda + sha256: ba72f1d9384584c774d4e58ff3174818a20687f817e5edde3e0d23edff88fd72 + md5: 622f99e8f4820c2ca1b208a3bb6ed5e6 + depends: + - __osx >=11.0 + - libcxx >=16 + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - llvm-openmp >=16.0.6 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 763281 + timestamp: 1717758160882 +- kind: conda + name: fftw + version: 3.3.10 + build: nompi_hf1063bd_110 + build_number: 110 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf1063bd_110.conda + sha256: 3cc58c9d9a8cc0089e3839ae5ff7ba4ddfc6df99d5f6a147fe90ea963bc6fe45 + md5: ee3e687b78b778db7b304e5b00a4dca6 + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - libstdcxx-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 2075171 + timestamp: 1717757963922 - kind: conda name: filelock version: 3.15.1 @@ -8726,6 +8903,23 @@ packages: - pkg:pypi/huggingface-hub?source=conda-forge-mapping size: 250766 timestamp: 1717617646190 +- kind: conda + name: humanize + version: 4.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/humanize-4.9.0-pyhd8ed1ab_0.conda + sha256: 2764840b7ef7219af1288b27dfddbacc383fdf88af70980a355afdb2780f3c30 + md5: f15cf5f33b0eca7b02c468ddb0cbf1ad + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/humanize?source=conda-forge-mapping + size: 65116 + timestamp: 1700608057210 - kind: conda name: hyperframe version: 6.0.1 @@ -11260,6 +11454,62 @@ packages: purls: [] size: 38616 timestamp: 1712512805567 +- kind: conda + name: libitk + version: 5.3.0 + build: h26001f5_8 + build_number: 8 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libitk-5.3.0-h26001f5_8.conda + sha256: 644b8e9c250b91ee38f72345c9d62c1dc3bd3e3d3a2ef9f3b991cef420152d73 + md5: 26827b546cbbb741100a5be2c0c00c3b + depends: + - eigen + - expat + - fftw >=3.3.10,<4.0a0 + - hdf5 >=1.14.2,<1.14.4.0a0 + - libexpat >=2.5.0,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - tbb >=2021.10.0 + - zlib + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 10643159 + timestamp: 1701489133491 +- kind: conda + name: libitk + version: 5.3.0 + build: h5b48add_8 + build_number: 8 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libitk-5.3.0-h5b48add_8.conda + sha256: ca6ec870258201dbf245be9eab510e3400938a132f73e45078c10a87e798609d + md5: c2a0d8202f305efe9aa65f8395e374fb + depends: + - __osx >=10.9 + - eigen + - expat + - fftw >=3.3.10,<4.0a0 + - hdf5 >=1.14.2,<1.14.4.0a0 + - libcxx >=16.0.6 + - libexpat >=2.5.0,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - tbb >=2021.10.0 + - zlib + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 7110110 + timestamp: 1701490808724 - kind: conda name: libjpeg-turbo version: 3.0.0 @@ -13618,7 +13868,7 @@ packages: timestamp: 1704317789138 - kind: pypi name: mednet - version: 1.0.1.dev214+g1aab338.d20240613 + version: 1.0.0b0 path: . sha256: adff5bafa9edc506fbd485c396d2aefee9bfc29400b78e6d5950749ff33906ae requires_dist: @@ -14162,6 +14412,26 @@ packages: - pkg:pypi/nh3?source=conda-forge-mapping size: 582437 timestamp: 1711545995406 +- kind: conda + name: nibabel + version: 5.2.1 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/nibabel-5.2.1-pyha770c72_0.conda + sha256: b5dd6d6ad4ba7c005567033c5ed6ecfbc34624c4d45fdd1882d5aeb9e5f04873 + md5: 95ea4b21646fda1e2a34e0ddd895c9cc + depends: + - importlib_resources >=1.3 + - numpy >=1.20 + - packaging >=17 + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/nibabel?source=conda-forge-mapping + size: 2746114 + timestamp: 1709044860369 - kind: conda name: nodeenv version: 1.9.1 @@ -17203,6 +17473,92 @@ packages: - pkg:pypi/shellingham?source=conda-forge-mapping size: 14568 timestamp: 1698144516278 +- kind: conda + name: simpleitk + version: 2.3.1 + build: py311hb755f60_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py311hb755f60_2.conda + sha256: e0de95d1741616cd16d55366f4bb1914f03f0c752d87e5f1175622ff4615f977 + md5: 7d9e0a06161dd3e2ac1645b795c40828 + depends: + - libgcc-ng >=12 + - libitk 5.3.0 h26001f5_8 + - libstdcxx-ng >=12 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/simpleitk?source=conda-forge-mapping + size: 27193823 + timestamp: 1701806692083 +- kind: conda + name: simpleitk + version: 2.3.1 + build: py311hbaf5611_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py311hbaf5611_2.conda + sha256: 171f109f9b4b1168fe507f537b540254f59676950082d272f19b2874156ce8ba + md5: 08d5361ed17fc065e5c09299a68fb9b7 + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + - libitk 5.3.0 h5b48add_8 + - python >=3.11,<3.12.0a0 + - python >=3.11,<3.12.0a0 *_cpython + - python_abi 3.11.* *_cp311 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/simpleitk?source=conda-forge-mapping + size: 19036652 + timestamp: 1701806985204 +- kind: conda + name: simpleitk + version: 2.3.1 + build: py312h30efb56_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/simpleitk-2.3.1-py312h30efb56_2.conda + sha256: 451728343600bd5a32321276bee00270d88c9d95ca24cf10717d4c182a017250 + md5: c438d05b72c796456fb18da5aec4670d + depends: + - libgcc-ng >=12 + - libitk 5.3.0 h26001f5_8 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/simpleitk?source=conda-forge-mapping + size: 26877326 + timestamp: 1701806680140 +- kind: conda + name: simpleitk + version: 2.3.1 + build: py312h650e478_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/simpleitk-2.3.1-py312h650e478_2.conda + sha256: 60d2fa628b0badf8754a65d2dd7c62b75000a0b6dbec1c2e646b43f000842c99 + md5: 3bc7cdff84074fa0844ae28ff84ec47f + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + - libitk 5.3.0 h5b48add_8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/simpleitk?source=conda-forge-mapping + size: 18932800 + timestamp: 1701807038993 - kind: conda name: six version: 1.16.0 @@ -18090,6 +18446,32 @@ packages: - pkg:pypi/tomlkit?source=conda-forge-mapping size: 37297 timestamp: 1715185504185 +- kind: conda + name: torchio + version: 0.19.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/torchio-0.19.7-pyhd8ed1ab_0.conda + sha256: 9a5b75348350c0d976aa3752a9a1d712657010982df12401aef2b38424a54a0a + md5: d705b713c7e60f4729adca64ad457e4c + depends: + - click + - deprecated >=1.2.5 + - humanize + - nibabel + - numpy + - python >=3.6,<3.13 + - pytorch >=1.7 + - scipy + - setuptools + - simpleitk !=2.0.* + - tqdm + license: Apache-2.0 + purls: + - pkg:pypi/torchio?source=conda-forge-mapping + size: 120934 + timestamp: 1718407590308 - kind: conda name: torchmetrics version: 1.4.0.post0 diff --git a/pyproject.toml b/pyproject.toml index c5a5be4282f3acd6ab15c74fdc1d7dcc72869a40..b182482621e3cd4e3ef7356b1d3fe14227dc171e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,7 @@ tensorboard = "*" torchvision = { version = "~=0.17.2", channel = "pytorch" } tqdm = "*" versioningit = "*" +torchio = ">=0.19.7,<0.20" [tool.pixi.feature.self.pypi-dependencies] mednet = { path = ".", editable = true } @@ -245,6 +246,9 @@ alexnet-pretrained = "mednet.config.models.alexnet_pretrained" densenet = "mednet.config.models.densenet" densenet-pretrained = "mednet.config.models.densenet_pretrained" +# 3D models +cnn3d = "mednet.config.models.cnn3d" + # lists of data augmentations affine = "mednet.config.augmentations.affine" elastic = "mednet.config.augmentations.elastic" @@ -409,6 +413,9 @@ nih-cxr14-padchest = "mednet.config.data.nih_cxr14_padchest.idiap" # montgomery-shenzhen-indian-padchest aggregated dataset montgomery-shenzhen-indian-padchest = "mednet.config.data.montgomery_shenzhen_indian_padchest.default" +# VISCERAL dataset +visceral = "mednet.config.data.visceral.default" + [tool.ruff] line-length = 88 target-version = "py310" diff --git a/src/mednet/config/data/visceral/__init__.py b/src/mednet/config/data/visceral/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/mednet/config/data/visceral/datamodule.py b/src/mednet/config/data/visceral/datamodule.py new file mode 100644 index 0000000000000000000000000000000000000000..023962cf76d8b98b948739aaf5ceedf31ad9d881 --- /dev/null +++ b/src/mednet/config/data/visceral/datamodule.py @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""VISCERAL dataset for 3D organ classification (only lungs and bladders). + +Loaded samples are not full scans but 16x16x16 volumes of organs. +Database reference: +""" + +import os +import pathlib + +import torchio as tio + +from ....data.datamodule import CachingDataModule +from ....data.split import make_split +from ....data.typing import RawDataLoader as _BaseRawDataLoader +from ....data.typing import Sample +from ....utils.rc import load_rc + +CONFIGURATION_KEY_DATADIR = "datadir." + (__name__.rsplit(".", 2)[-2]) +"""Key to search for in the configuration file for the root directory of this +database.""" + + +class RawDataLoader(_BaseRawDataLoader): + """A specialized raw-data-loader for the VISCERAL dataset.""" + + datadir: pathlib.Path + """This variable contains the base directory where the database raw data is + stored.""" + + def __init__(self) -> None: + self.datadir = pathlib.Path( + load_rc().get( + CONFIGURATION_KEY_DATADIR, + os.path.realpath(os.curdir), + ), + ) + + def sample(self, sample: tuple[str, int]) -> Sample: + """Load a single volume sample from the disk. + + Parameters + ---------- + sample + A tuple containing the path suffix, within the dataset root folder, + where to find the volume to be loaded and an integer, representing + the sample label. + + Returns + ------- + The sample representation. + """ + clamp = tio.Clamp(out_min=-1000, out_max=2000) + rescale = tio.RescaleIntensity(percentiles=(0.5, 99.5)) + preprocess = tio.Compose([clamp, rescale]) + image = tio.ScalarImage(self.datadir / sample[0]) + image = preprocess(image) + tensor = image.data + return tensor, dict(label=sample[1], name=sample[0]) + + def label(self, sample: tuple[str, int]) -> int: + """Load a single image sample label from the disk. + + Parameters + ---------- + sample + A tuple containing the path suffix, within the dataset root folder, + where to find the image to be loaded, and an integer, representing + the sample label. + + Returns + ------- + int + The integer label associated with the sample. + """ + + return sample[1] + + +class DataModule(CachingDataModule): + """VISCERAL DataModule for 3D organ binary classification. + + Data specifications: + + * Raw data input (on disk): + + * NIfTI volumes + * resolution: 16x16x16 + + * Output image: + + * Transforms: + + * Load raw NIfTI with :py:mod:`torchio` + * Clamp and Rescale intensity + * Convert to torch tensor + + * Final specifications + + * 32-bit floats, cubes 16x16x16 pixels + * Labels: 0 (bladder), 1 (lung) + + Parameters + ---------- + split_filename + Name of the .json file containing the split to load. + """ + + def __init__(self, split_filename: str): + super().__init__( + make_split(__package__, split_filename), + raw_data_loader=RawDataLoader(), + database_name=__package__.split(".")[-1], + split_name=pathlib.Path(split_filename).stem, + ) diff --git a/src/mednet/config/data/visceral/default.json b/src/mednet/config/data/visceral/default.json new file mode 100644 index 0000000000000000000000000000000000000000..6bd8d5bdf56098c3037b4d545cae504cac96293c --- /dev/null +++ b/src/mednet/config/data/visceral/default.json @@ -0,0 +1,353 @@ +{ + "train": [ + ["16/10000013_1_1302_117.nii.gz",1], + ["16/10000164_1_1302_117.nii.gz",1], + ["16/10000115_1_1302_117.nii.gz",1], + ["16/10000072_1_237_117.nii.gz",0], + ["16/10000148_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000022_1_CT_wb_1302_4.nii.gz",1], + ["16/10000163_1_237_117.nii.gz",0], + ["16/10000005_1_CT_wb_1302_7.nii.gz",1], + ["16/10000113_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000140_1_CTce_ThAb_237_5.nii.gz",0], + ["16/10000137_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000009_1_237_117.nii.gz",0], + ["16/10000090_1_CT_wb_1302_6.nii.gz",1], + ["16/10000115_1_237_117.nii.gz",0], + ["16/10000101_1_237_117.nii.gz",0], + ["16/10000168_1_1302_117.nii.gz",1], + ["16/10000054_1_1302_117.nii.gz",1], + ["16/10000059_1_237_117.nii.gz",0], + ["16/10000178_1_237_117.nii.gz",0], + ["16/10000053_1_237_117.nii.gz",0], + ["16/10000043_1_1302_117.nii.gz",1], + ["16/10000018_1_CT_wb_1302_4.nii.gz",1], + ["16/10000165_1_1302_117.nii.gz",1], + ["16/10000070_1_1302_117.nii.gz",1], + ["16/10000113_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000080_1_CT_wb_237_7.nii.gz",0], + ["16/10000145_1_CTce_ThAb_237_9.nii.gz",0], + ["16/10000140_1_CTce_ThAb_1302_5.nii.gz",1], + ["16/10000075_1_1302_117.nii.gz",1], + ["16/10000046_1_237_117.nii.gz",0], + ["16/10000108_1_CTce_ThAb_237_4.nii.gz",0], + ["16/10000109_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000055_1_1302_117.nii.gz",1], + ["16/10000004_1_1302_117.nii.gz",1], + ["16/10000150_1_237_117.nii.gz",0], + ["16/10000040_1_1302_117.nii.gz",1], + ["16/10000158_1_237_117.nii.gz",0], + ["16/10000183_1_1302_117.nii.gz",1], + ["16/10000025_1_CT_wb_237_8.nii.gz",0], + ["16/10000064_1_1302_117.nii.gz",1], + ["16/10000193_1_1302_117.nii.gz",1], + ["16/10000122_1_1302_117.nii.gz",1], + ["16/10000105_1_CTce_ThAb_237_4.nii.gz",0], + ["16/10000034_1_237_117.nii.gz",0], + ["16/10000112_1_CTce_ThAb_1302_8.nii.gz",1], + ["16/10000119_1_237_117.nii.gz",0], + ["16/10000138_1_CTce_ThAb_1302_8.nii.gz",1], + ["16/10000172_1_237_117.nii.gz",0], + ["16/10000072_1_1302_117.nii.gz",1], + ["16/10000012_1_1302_117.nii.gz",1], + ["16/10000078_1_1302_117.nii.gz",1], + ["16/10000096_1_CT_wb_1302_8.nii.gz",1], + ["16/10000125_1_1302_117.nii.gz",1], + ["16/10000191_1_1302_117.nii.gz",1], + ["16/10000055_1_237_117.nii.gz",0], + ["16/10000049_1_1302_117.nii.gz",1], + ["16/10000141_1_CTce_ThAb_237_5.nii.gz",0], + ["16/10000006_1_CT_wb_1302_8.nii.gz",1], + ["16/10000087_1_CT_wb_1302_4.nii.gz",1], + ["16/10000070_1_237_117.nii.gz",0], + ["16/10000080_1_CT_wb_1302_7.nii.gz",1], + ["16/10000015_1_CT_wb_1302_6.nii.gz",1], + ["16/10000011_1_CT_wb_237_7.nii.gz",0], + ["16/10000159_1_1302_117.nii.gz",1], + ["16/10000077_1_237_117.nii.gz",0], + ["16/10000087_1_CT_wb_237_4.nii.gz",0], + ["16/10000088_1_CT_wb_1302_4.nii.gz",1], + ["16/10000116_1_1302_117.nii.gz",1], + ["16/10000077_1_1302_117.nii.gz",1], + ["16/10000056_1_237_117.nii.gz",0], + ["16/10000054_1_237_117.nii.gz",0], + ["16/10000151_1_237_117.nii.gz",0], + ["16/10000032_1_1302_117.nii.gz",1], + ["16/10000051_1_237_117.nii.gz",0], + ["16/10000153_1_1302_117.nii.gz",1], + ["16/10000019_1_CT_wb_237_6.nii.gz",0], + ["16/10000044_1_237_117.nii.gz",0], + ["16/10000175_1_237_117.nii.gz",0], + ["16/10000143_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000160_1_1302_117.nii.gz",1], + ["16/10000169_1_1302_117.nii.gz",1], + ["16/10000048_1_1302_117.nii.gz",1], + ["16/10000203_1_1302_117.nii.gz",1], + ["16/10000099_1_CT_wb_1302_5.nii.gz",1], + ["16/10000157_1_1302_117.nii.gz",1], + ["16/10000046_1_1302_117.nii.gz",1], + ["16/10000147_1_CTce_ThAb_1302_8.nii.gz",1], + ["16/10000095_1_CT_wb_237_7.nii.gz",0], + ["16/10000190_1_237_117.nii.gz",0], + ["16/10000179_1_237_117.nii.gz",0], + ["16/10000007_1_1302_117.nii.gz",1], + ["16/10000189_1_1302_117.nii.gz",1], + ["16/10000156_1_1302_117.nii.gz",1], + ["16/10000076_1_237_117.nii.gz",0], + ["16/10000196_1_237_117.nii.gz",0], + ["16/10000150_1_1302_117.nii.gz",1], + ["16/10000106_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000200_1_237_117.nii.gz",0], + ["16/10000023_1_CT_wb_1302_6.nii.gz",1], + ["16/10000168_1_237_117.nii.gz",0], + ["16/10000104_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000138_1_CTce_ThAb_237_9.nii.gz",0], + ["16/10000068_1_1302_117.nii.gz",1], + ["16/10000041_1_237_117.nii.gz",0], + ["16/10000154_1_1302_117.nii.gz",1], + ["16/10000136_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000189_1_237_117.nii.gz",0], + ["16/10000188_1_237_117.nii.gz",0], + ["16/10000091_1_1302_117.nii.gz",1], + ["16/10000117_1_1302_117.nii.gz",1], + ["16/10000179_1_1302_117.nii.gz",1], + ["16/10000129_1_CTce_ThAb_1302_5.nii.gz",1], + ["16/10000088_1_CT_wb_237_4.nii.gz",0], + ["16/10000081_1_CT_wb_1302_6.nii.gz",1], + ["16/10000127_1_CTce_ThAb_1302_4.nii.gz",1], + ["16/10000161_1_1302_117.nii.gz",1], + ["16/10000192_1_237_117.nii.gz",0], + ["16/10000162_1_1302_117.nii.gz",1], + ["16/10000123_1_237_117.nii.gz",0], + ["16/10000194_1_1302_117.nii.gz",1], + ["16/10000104_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000142_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000124_1_1302_117.nii.gz",1], + ["16/10000038_1_237_117.nii.gz",0], + ["16/10000090_1_CT_wb_237_6.nii.gz",0], + ["16/10000126_1_237_117.nii.gz",0], + ["16/10000047_1_1302_117.nii.gz",1], + ["16/10000026_1_1302_117.nii.gz",1], + ["16/10000132_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000037_1_237_117.nii.gz",0], + ["16/10000126_1_1302_117.nii.gz",1], + ["16/10000148_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000142_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000170_1_1302_117.nii.gz",1], + ["16/10000057_1_237_117.nii.gz",0], + ["16/10000040_1_237_117.nii.gz",0], + ["16/10000079_1_CT_wb_1302_7.nii.gz",1], + ["16/10000133_1_CTce_ThAb_1302_9.nii.gz",1], + ["16/10000129_1_CTce_ThAb_237_5.nii.gz",0], + ["16/10000201_1_237_117.nii.gz",0], + ["16/10000084_1_237_117.nii.gz",0], + ["16/10000173_1_1302_117.nii.gz",1], + ["16/10000064_1_237_117.nii.gz",0], + ["16/10000130_1_CTce_ThAb_1302_5.nii.gz",1], + ["16/10000094_1_CT_wb_237_7.nii.gz",0], + ["16/10000065_1_1302_117.nii.gz",1], + ["16/10000114_1_1302_117.nii.gz",1], + ["16/10000042_1_237_117.nii.gz",0], + ["16/10000048_1_237_117.nii.gz",0], + ["16/10000151_1_1302_117.nii.gz",1], + ["16/10000060_1_1302_117.nii.gz",1], + ["16/10000018_1_CT_wb_237_4.nii.gz",0], + ["16/10000024_1_1302_117.nii.gz",1], + ["16/10000187_1_1302_117.nii.gz",1], + ["16/10000111_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000050_1_1302_117.nii.gz",1], + ["16/10000128_1_CTce_ThAb_1302_5.nii.gz",1], + ["16/10000134_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000119_1_1302_117.nii.gz",1], + ["16/10000092_1_CT_wb_1302_8.nii.gz",1], + ["16/10000205_1_1302_117.nii.gz",1], + ["16/10000169_1_237_117.nii.gz",0], + ["16/10000155_1_1302_117.nii.gz",1], + ["16/10000044_1_1302_117.nii.gz",1], + ["16/10000134_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000016_1_CT_wb_1302_9.nii.gz",1], + ["16/10000031_1_237_117.nii.gz",0], + ["16/10000020_1_CT_wb_237_8.nii.gz",0], + ["16/10000122_1_237_117.nii.gz",0], + ["16/10000123_1_1302_117.nii.gz",1], + ["16/10000062_1_237_117.nii.gz",0], + ["16/10000042_1_1302_117.nii.gz",1], + ["16/10000135_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000106_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000051_1_1302_117.nii.gz",1], + ["16/10000198_1_237_117.nii.gz",0], + ["16/10000136_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000045_1_237_117.nii.gz",0], + ["16/10000147_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000086_1_CT_wb_1302_6.nii.gz",1], + ["16/10000131_1_CTce_ThAb_1302_4.nii.gz",1], + ["16/10000174_1_237_117.nii.gz",0], + ["16/10000170_1_237_117.nii.gz",0], + ["16/10000049_1_237_117.nii.gz",0], + ["16/10000116_1_237_117.nii.gz",0], + ["16/10000137_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000111_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000180_1_1302_117.nii.gz",1], + ["16/10000075_1_237_117.nii.gz",0], + ["16/10000161_1_237_117.nii.gz",0], + ["16/10000011_1_CT_wb_1302_7.nii.gz",1], + ["16/10000094_1_CT_wb_1302_7.nii.gz",1], + ["16/10000015_1_CT_wb_237_6.nii.gz",0], + ["16/10000145_1_CTce_ThAb_1302_7.nii.gz",1], + ["16/10000085_1_CT_wb_1302_6.nii.gz",1], + ["16/10000033_1_237_117.nii.gz",0], + ["16/10000097_1_1302_117.nii.gz",1], + ["16/10000141_1_CTce_ThAb_1302_5.nii.gz",1], + ["16/10000130_1_CTce_ThAb_237_5.nii.gz",0], + ["16/10000171_1_237_117.nii.gz",0], + ["16/10000163_1_1302_117.nii.gz",1], + ["16/10000021_1_CT_wb_1302_9.nii.gz",1], + ["16/10000184_1_237_117.nii.gz",0], + ["16/10000114_1_237_117.nii.gz",0], + ["16/10000160_1_237_117.nii.gz",0], + ["16/10000071_1_237_117.nii.gz",0], + ["16/10000084_1_1302_117.nii.gz",1], + ["16/10000135_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000117_1_237_117.nii.gz",0], + ["16/10000149_1_CTce_ThAb_1302_8.nii.gz",1], + ["16/10000162_1_237_117.nii.gz",0], + ["16/10000025_1_CT_wb_1302_8.nii.gz",1], + ["16/10000100_1_CTce_ThAb_237_6.nii.gz",0], + ["16/10000200_1_1302_117.nii.gz",1], + ["16/10000096_1_CT_wb_237_9.nii.gz",0], + ["16/10000024_1_237_117.nii.gz",0], + ["16/10000118_1_1302_117.nii.gz",1], + ["16/10000112_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000159_1_237_117.nii.gz",0], + ["16/10000196_1_1302_117.nii.gz",1], + ["16/10000204_1_237_117.nii.gz",0], + ["16/10000019_1_CT_wb_1302_6.nii.gz",1], + ["16/10000047_1_237_117.nii.gz",0], + ["16/10000035_1_237_117.nii.gz",0], + ["16/10000012_1_237_117.nii.gz",0], + ["16/10000128_1_CTce_ThAb_237_5.nii.gz",0], + ["16/10000174_1_1302_117.nii.gz",1], + ["16/10000013_1_237_117.nii.gz",0], + ["16/10000056_1_1302_117.nii.gz",1], + ["16/10000020_1_CT_wb_1302_8.nii.gz",1], + ["16/10000076_1_1302_117.nii.gz",1], + ["16/10000177_1_237_117.nii.gz",0], + ["16/10000198_1_1302_117.nii.gz",1], + ["16/10000078_1_237_117.nii.gz",0], + ["16/10000125_1_237_117.nii.gz",0], + ["16/10000082_1_CT_wb_1302_6.nii.gz",1], + ["16/10000091_1_237_117.nii.gz",0], + ["16/10000085_1_CT_wb_237_6.nii.gz",0], + ["16/10000089_1_CT_wb_1302_8.nii.gz",1], + ["16/10000110_1_CTce_ThAb_1302_9.nii.gz",1], + ["16/10000053_1_1302_117.nii.gz",1] + ], + "validation": [ + ["16/10000203_1_237_117.nii.gz",0], + ["16/10000022_1_CT_wb_237_4.nii.gz",0], + ["16/10000017_1_CT_wb_237_9.nii.gz",0], + ["16/10000166_1_1302_117.nii.gz",1], + ["16/10000016_1_CT_wb_237_9.nii.gz",0], + ["16/10000057_1_1302_117.nii.gz",1], + ["16/10000165_1_237_117.nii.gz",0], + ["16/10000021_1_CT_wb_237_9.nii.gz",0], + ["16/10000098_1_237_117.nii.gz",0], + ["16/10000068_1_237_117.nii.gz",0], + ["16/10000095_1_CT_wb_1302_7.nii.gz",1], + ["16/10000067_1_CT_wb_237_9.nii.gz",0], + ["16/10000069_1_1302_117.nii.gz",1], + ["16/10000201_1_1302_117.nii.gz",1], + ["16/10000132_1_CTce_ThAb_1302_8.nii.gz",1], + ["16/10000181_1_1302_117.nii.gz",1], + ["16/10000101_1_1302_117.nii.gz",1], + ["16/10000067_1_CT_wb_1302_9.nii.gz",1], + ["16/10000027_1_237_117.nii.gz",0], + ["16/10000187_1_237_117.nii.gz",0], + ["16/10000065_1_237_117.nii.gz",0], + ["16/10000186_1_237_117.nii.gz",0], + ["16/10000186_1_1302_117.nii.gz",1], + ["16/10000185_1_1302_117.nii.gz",1], + ["16/10000097_1_237_117.nii.gz",0], + ["16/10000023_1_CT_wb_237_6.nii.gz",0], + ["16/10000098_1_1302_117.nii.gz",1], + ["16/10000099_1_CT_wb_237_5.nii.gz",0], + ["16/10000073_1_1302_117.nii.gz",1], + ["16/10000184_1_1302_117.nii.gz",1], + ["16/10000093_1_1302_117.nii.gz",1], + ["16/10000086_1_CT_wb_237_6.nii.gz",0], + ["16/10000007_1_237_117.nii.gz",0], + ["16/10000038_1_1302_117.nii.gz",1], + ["16/10000050_1_237_117.nii.gz",0], + ["16/10000093_1_237_117.nii.gz",0], + ["16/10000183_1_237_117.nii.gz",0], + ["16/10000060_1_237_117.nii.gz",0], + ["16/10000089_1_CT_wb_237_8.nii.gz",0], + ["16/10000124_1_237_117.nii.gz",0], + ["16/10000152_1_237_117.nii.gz",0], + ["16/10000158_1_1302_117.nii.gz",1], + ["16/10000193_1_237_117.nii.gz",0], + ["16/10000167_1_237_117.nii.gz",0], + ["16/10000008_1_237_117.nii.gz",0], + ["16/10000071_1_1302_117.nii.gz",1], + ["16/10000171_1_1302_117.nii.gz",1], + ["16/10000120_1_237_117.nii.gz",0], + ["16/10000100_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000154_1_237_117.nii.gz",0], + ["16/10000082_1_CT_wb_237_6.nii.gz",0], + ["16/10000120_1_1302_117.nii.gz",1], + ["16/10000175_1_1302_117.nii.gz",1], + ["16/10000026_1_237_117.nii.gz",0], + ["16/10000178_1_1302_117.nii.gz",1], + ["16/10000192_1_1302_117.nii.gz",1], + ["16/10000155_1_237_117.nii.gz",0], + ["16/10000152_1_1302_117.nii.gz",1], + ["16/10000005_1_CT_wb_237_7.nii.gz",0], + ["16/10000191_1_237_117.nii.gz",0], + ["16/10000073_1_237_117.nii.gz",0], + ["16/10000181_1_237_117.nii.gz",0], + ["16/10000014_1_CT_wb_1302_5.nii.gz",1], + ["16/10000017_1_CT_wb_1302_9.nii.gz",1], + ["16/10000081_1_CT_wb_237_6.nii.gz",0], + ["16/10000079_1_CT_wb_237_7.nii.gz",0], + ["16/10000153_1_237_117.nii.gz",0], + ["16/10000164_1_237_117.nii.gz",0], + ["16/10000167_1_1302_117.nii.gz",1] + ], + "test": [ + ["16/10000109_1_CTce_ThAb_1302_6.nii.gz",1], + ["16/10000039_1_237_117.nii.gz",0], + ["16/10000118_1_237_117.nii.gz",0], + ["16/10000190_1_1302_117.nii.gz",1], + ["16/10000110_1_CTce_ThAb_237_9.nii.gz",0], + ["16/10000180_1_237_117.nii.gz",0], + ["16/10000131_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000121_1_1302_117.nii.gz",1], + ["16/10000127_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000173_1_237_117.nii.gz",0], + ["16/10000166_1_237_117.nii.gz",0], + ["16/10000105_1_CTce_ThAb_1302_4.nii.gz",1], + ["16/10000177_1_1302_117.nii.gz",1], + ["16/10000031_1_1302_117.nii.gz",1], + ["16/10000188_1_1302_117.nii.gz",1], + ["16/10000069_1_237_117.nii.gz",0], + ["16/10000143_1_CTce_ThAb_237_7.nii.gz",0], + ["16/10000014_1_CT_wb_237_5.nii.gz",0], + ["16/10000133_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000199_1_1302_117.nii.gz",1], + ["16/10000205_1_237_117.nii.gz",0], + ["16/10000121_1_237_117.nii.gz",0], + ["16/10000149_1_CTce_ThAb_237_8.nii.gz",0], + ["16/10000199_1_237_117.nii.gz",0], + ["16/10000032_1_237_117.nii.gz",0], + ["16/10000156_1_237_117.nii.gz",0], + ["16/10000092_1_CT_wb_237_4.nii.gz",0], + ["16/10000037_1_1302_117.nii.gz",1], + ["16/10000172_1_1302_117.nii.gz",1], + ["16/10000043_1_237_117.nii.gz",0], + ["16/10000204_1_1302_117.nii.gz",1], + ["16/10000185_1_237_117.nii.gz",0], + ["16/10000108_1_CTce_ThAb_1302_4.nii.gz",1], + ["16/10000194_1_237_117.nii.gz",0], + ["16/10000059_1_1302_117.nii.gz",1] + ] +} diff --git a/src/mednet/config/data/visceral/default.py b/src/mednet/config/data/visceral/default.py new file mode 100644 index 0000000000000000000000000000000000000000..46942bb7d2015a9223a9069d7f1d166af3a4c5c7 --- /dev/null +++ b/src/mednet/config/data/visceral/default.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""VISCERAL dataset for 3D organ classification. + +Database reference: + +See :py:class:`mednet.config.data.visceral.datamodule.DataModule` for +technical details. +""" + +from mednet.config.data.visceral.datamodule import DataModule + +datamodule = DataModule("default.json") diff --git a/src/mednet/config/models/cnn3d.py b/src/mednet/config/models/cnn3d.py new file mode 100644 index 0000000000000000000000000000000000000000..305b545287077a6b67c54da4fcca25025a2c6615 --- /dev/null +++ b/src/mednet/config/models/cnn3d.py @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""Simple CNN for 3D organ classification, to be trained from scratch.""" + +from torch.nn import BCEWithLogitsLoss +from torch.optim import Adam + +from mednet.models.cnn3d import Conv3DNet + +model = Conv3DNet( + loss_type=BCEWithLogitsLoss, + optimizer_type=Adam, + optimizer_arguments=dict(lr=8e-5), +) diff --git a/src/mednet/models/cnn3d.py b/src/mednet/models/cnn3d.py new file mode 100644 index 0000000000000000000000000000000000000000..d0be0e62e6c66431e0d14ac1d2ecddcfd91cf1d7 --- /dev/null +++ b/src/mednet/models/cnn3d.py @@ -0,0 +1,206 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later + +import logging +import typing + +import torch +import torch.nn as nn +import torch.nn.functional as F # noqa: N812 +import torch.optim.optimizer +import torch.utils.data + +from ..data.typing import TransformSequence +from .model import Model +from .separate import separate + +logger = logging.getLogger(__name__) + + +class Conv3DNet(Model): + """Implementation of 3D CNN. + + This network has a linear output. You should use losses with ``WithLogit`` + instead of cross-entropy versions when training. + + Parameters + ---------- + loss_type + The loss to be used for training and evaluation. + + .. warning:: + + The loss should be set to always return batch averages (as opposed + to the batch sum), as our logging system expects it so. + loss_arguments + Arguments to the loss. + optimizer_type + The type of optimizer to use for training. + optimizer_arguments + Arguments to the optimizer after ``params``. + augmentation_transforms + An optional sequence of torch modules containing transforms to be + applied on the input **before** it is fed into the network. + num_classes + Number of outputs (classes) for this model. + """ + + def __init__( + self, + loss_type: torch.nn.Module = torch.nn.BCEWithLogitsLoss, + loss_arguments: dict[str, typing.Any] = {}, + optimizer_type: type[torch.optim.Optimizer] = torch.optim.Adam, + optimizer_arguments: dict[str, typing.Any] = {}, + augmentation_transforms: TransformSequence = [], + num_classes: int = 1, + ): + super().__init__( + loss_type, + loss_arguments, + optimizer_type, + optimizer_arguments, + augmentation_transforms, + num_classes, + ) + + self.name = "cnn3D" + self.num_classes = num_classes + + self.model_transforms = [] + + # First convolution block + self.conv3d_1_1 = nn.Conv3d( + in_channels=1, out_channels=4, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_1_2 = nn.Conv3d( + in_channels=4, out_channels=16, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_1_3 = nn.Conv3d( + in_channels=1, out_channels=16, kernel_size=1, stride=1 + ) + self.batch_norm_1_1 = nn.BatchNorm3d(4) + self.batch_norm_1_2 = nn.BatchNorm3d(16) + self.batch_norm_1_3 = nn.BatchNorm3d(16) + + # Second convolution block + self.conv3d_2_1 = nn.Conv3d( + in_channels=16, out_channels=24, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_2_2 = nn.Conv3d( + in_channels=24, out_channels=32, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_2_3 = nn.Conv3d( + in_channels=16, out_channels=32, kernel_size=1, stride=1 + ) + self.batch_norm_2_1 = nn.BatchNorm3d(24) + self.batch_norm_2_2 = nn.BatchNorm3d(32) + self.batch_norm_2_3 = nn.BatchNorm3d(32) + + # Third convolution block + self.conv3d_3_1 = nn.Conv3d( + in_channels=32, out_channels=40, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_3_2 = nn.Conv3d( + in_channels=40, out_channels=48, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_3_3 = nn.Conv3d( + in_channels=32, out_channels=48, kernel_size=1, stride=1 + ) + self.batch_norm_3_1 = nn.BatchNorm3d(40) + self.batch_norm_3_2 = nn.BatchNorm3d(48) + self.batch_norm_3_3 = nn.BatchNorm3d(48) + + # Fourth convolution block + self.conv3d_4_1 = nn.Conv3d( + in_channels=48, out_channels=56, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_4_2 = nn.Conv3d( + in_channels=56, out_channels=64, kernel_size=3, stride=1, padding=1 + ) + self.conv3d_4_3 = nn.Conv3d( + in_channels=48, out_channels=64, kernel_size=1, stride=1 + ) + self.batch_norm_4_1 = nn.BatchNorm3d(56) + self.batch_norm_4_2 = nn.BatchNorm3d(64) + self.batch_norm_4_3 = nn.BatchNorm3d(64) + + self.pool = nn.MaxPool3d(2) + self.global_pool = nn.AdaptiveAvgPool3d((1, 1, 1)) + self.dropout = nn.Dropout(0.3) + self.fc1 = nn.Linear(64, 32) + self.fc2 = nn.Linear(32, num_classes) + + def forward(self, x): + x = self.normalizer(x) # type: ignore + + # First convolution block + _x = x + x = F.relu(self.batch_norm_1_1(self.conv3d_1_1(x))) + x = F.relu(self.batch_norm_1_2(self.conv3d_1_2(x))) + x = (x + F.relu(self.batch_norm_1_3(self.conv3d_1_3(_x)))) / 2 + x = self.pool(x) + + # Second convolution block + + _x = x + x = F.relu(self.batch_norm_2_1(self.conv3d_2_1(x))) + x = F.relu(self.batch_norm_2_2(self.conv3d_2_2(x))) + x = (x + F.relu(self.batch_norm_2_3(self.conv3d_2_3(_x)))) / 2 + x = self.pool(x) + + # Third convolution block + + _x = x + x = F.relu(self.batch_norm_3_1(self.conv3d_3_1(x))) + x = F.relu(self.batch_norm_3_2(self.conv3d_3_2(x))) + x = (x + F.relu(self.batch_norm_3_3(self.conv3d_3_3(_x)))) / 2 + x = self.pool(x) + + # Fourth convolution block + + _x = x + x = F.relu(self.batch_norm_4_1(self.conv3d_4_1(x))) + x = F.relu(self.batch_norm_4_2(self.conv3d_4_2(x))) + x = (x + F.relu(self.batch_norm_4_3(self.conv3d_4_3(_x)))) / 2 + + x = self.global_pool(x) + x = x.view(x.size(0), x.size(1)) + + x = F.relu(self.fc1(x)) + x = self.dropout(x) + return self.fc2(x) + + # x = F.log_softmax(x, dim=1) # 0 is batch size + + def training_step(self, batch, _): + images = batch[0] + labels = batch[1]["label"] + + # Increase label dimension if too low + # Allows single and multiclass usage + if labels.ndim == 1: + labels = torch.reshape(labels, (labels.shape[0], 1)) + + # Forward pass on the network + outputs = self(self.augmentation_transforms(images)) + + return self._train_loss(outputs, labels.float()) + + def validation_step(self, batch, batch_idx, dataloader_idx=0): + images = batch[0] + labels = batch[1]["label"] + + # Increase label dimension if too low + # Allows single and multiclass usage + if labels.ndim == 1: + labels = torch.reshape(labels, (labels.shape[0], 1)) + + # data forwarding on the existing network + outputs = self(images) + return self._validation_loss(outputs, labels.float()) + + def predict_step(self, batch, batch_idx, dataloader_idx=0): + outputs = self(batch[0]) + probabilities = torch.sigmoid(outputs) + return separate((probabilities, batch[1])) diff --git a/tests/test_visceral.py b/tests/test_visceral.py new file mode 100644 index 0000000000000000000000000000000000000000..9743577e1dc68f819c556177dc2e77dfa616baeb --- /dev/null +++ b/tests/test_visceral.py @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch> +# +# SPDX-License-Identifier: GPL-3.0-or-later +"""Tests for VISCERAL dataset.""" + +import pytest +from click.testing import CliRunner + + +def id_function(val): + if isinstance(val, dict): + return str(val) + return repr(val) + + +@pytest.mark.parametrize( + "split,lenghts", + [ + ("default", dict(train=241, validation=69, test=35)), + ], + ids=id_function, # just changes how pytest prints it +) +def test_protocol_consistency( + database_checkers, + split: str, + lenghts: dict[str, int], +): + from mednet.data.split import make_split + + database_checkers.check_split( + make_split("mednet.config.data.visceral", f"{split}.json"), + lengths=lenghts, + prefixes=("16/10000"), + possible_labels=(0, 1), + ) + + +@pytest.mark.skip_if_rc_var_not_set("datadir.visceral") +def test_database_check(): + from mednet.scripts.database import check + + runner = CliRunner() + result = runner.invoke(check, ["visceral"]) + assert ( + result.exit_code == 0 + ), f"Exit code {result.exit_code} != 0 -- Output:\n{result.output}"