torch_em.data.datasets.medical.camus

  1import os
  2from glob import glob
  3from typing import Union, Tuple, Optional
  4
  5import torch_em
  6from torch_em.transform.generic import ResizeInputs
  7
  8from .. import util
  9
 10
 11URL = "https://humanheart-project.creatis.insa-lyon.fr/database/api/v1/folder/63fde55f73e9f004868fb7ac/download"
 12CHECKSUM = "43745d640db5d979332bda7f00f4746747a2591b46efc8f1966b573ce8d65655"
 13
 14
 15def get_camus_data(path, download):
 16    os.makedirs(path, exist_ok=True)
 17
 18    data_dir = os.path.join(path, "database_nifti")
 19    if os.path.exists(data_dir):
 20        return data_dir
 21
 22    zip_path = os.path.join(path, "CAMUS.zip")
 23    util.download_source(path=zip_path, url=URL, download=download, checksum=CHECKSUM)
 24    util.unzip(zip_path=zip_path, dst=path)
 25
 26    return data_dir
 27
 28
 29def _get_camus_paths(path, chamber, download):
 30    data_dir = get_camus_data(path=path, download=download)
 31
 32    if chamber is None:
 33        chamber = "*"  # 2CH / 4CH
 34    else:
 35        assert chamber in [2, 4], f"{chamber} is  not a valid chamber choice for the acquisitions."
 36        chamber = f"{chamber}CH"
 37
 38    image_paths = sorted(glob(os.path.join(data_dir, "patient*", f"patient*_{chamber}_half_sequence.nii.gz")))
 39    gt_paths = sorted(glob(os.path.join(data_dir, "patient*", f"patient*_{chamber}_half_sequence_gt.nii.gz")))
 40
 41    return image_paths, gt_paths
 42
 43
 44def get_camus_dataset(
 45    path: Union[os.PathLike, str],
 46    patch_shape: Tuple[int, int],
 47    chamber: Optional[int] = None,
 48    resize_inputs: bool = False,
 49    download: bool = False,
 50    **kwargs
 51):
 52    """Dataset for segmenting cardiac structures in 2d echocardiography images.
 53
 54    The database is located at:
 55    https://humanheart-project.creatis.insa-lyon.fr/database/#collection/6373703d73e9f0047faa1bc8
 56
 57    This dataset is from the CAMUS challenge - https://doi.org/10.1109/TMI.2019.2900516.
 58    Please cite it if you use this dataset for a publication.
 59    """
 60    image_paths, gt_paths = _get_camus_paths(path=path, chamber=chamber, download=download)
 61
 62    if resize_inputs:
 63        raw_trafo = ResizeInputs(target_shape=patch_shape, is_label=False)
 64        label_trafo = ResizeInputs(target_shape=patch_shape, is_label=True)
 65        patch_shape = None
 66    else:
 67        patch_shape = patch_shape
 68        raw_trafo, label_trafo = None, None
 69
 70    dataset = torch_em.default_segmentation_dataset(
 71        raw_paths=image_paths,
 72        raw_key="data",
 73        label_paths=gt_paths,
 74        label_key="data",
 75        patch_shape=patch_shape,
 76        raw_transform=raw_trafo,
 77        label_transform=label_trafo,
 78        **kwargs
 79    )
 80
 81    return dataset
 82
 83
 84def get_camus_loader(
 85    path: Union[os.PathLike, str],
 86    patch_shape: Tuple[int, int],
 87    batch_size: int,
 88    chamber: Optional[int] = None,
 89    resize_inputs: bool = False,
 90    download: bool = False,
 91    **kwargs
 92):
 93    """Dataloader for segmenting cardiac structures in 2d echocardiography images. See `get_camus_dataset` for details
 94    """
 95    ds_kwargs, loader_kwargs = util.split_kwargs(torch_em.default_segmentation_dataset, **kwargs)
 96    dataset = get_camus_dataset(
 97        path=path, patch_shape=patch_shape, chamber=chamber, resize_inputs=resize_inputs, download=download, **ds_kwargs
 98    )
 99    loader = torch_em.get_data_loader(dataset=dataset, batch_size=batch_size, **loader_kwargs)
100    return loader
URL = 'https://humanheart-project.creatis.insa-lyon.fr/database/api/v1/folder/63fde55f73e9f004868fb7ac/download'
CHECKSUM = '43745d640db5d979332bda7f00f4746747a2591b46efc8f1966b573ce8d65655'
def get_camus_data(path, download):
16def get_camus_data(path, download):
17    os.makedirs(path, exist_ok=True)
18
19    data_dir = os.path.join(path, "database_nifti")
20    if os.path.exists(data_dir):
21        return data_dir
22
23    zip_path = os.path.join(path, "CAMUS.zip")
24    util.download_source(path=zip_path, url=URL, download=download, checksum=CHECKSUM)
25    util.unzip(zip_path=zip_path, dst=path)
26
27    return data_dir
def get_camus_dataset( path: Union[os.PathLike, str], patch_shape: Tuple[int, int], chamber: Optional[int] = None, resize_inputs: bool = False, download: bool = False, **kwargs):
45def get_camus_dataset(
46    path: Union[os.PathLike, str],
47    patch_shape: Tuple[int, int],
48    chamber: Optional[int] = None,
49    resize_inputs: bool = False,
50    download: bool = False,
51    **kwargs
52):
53    """Dataset for segmenting cardiac structures in 2d echocardiography images.
54
55    The database is located at:
56    https://humanheart-project.creatis.insa-lyon.fr/database/#collection/6373703d73e9f0047faa1bc8
57
58    This dataset is from the CAMUS challenge - https://doi.org/10.1109/TMI.2019.2900516.
59    Please cite it if you use this dataset for a publication.
60    """
61    image_paths, gt_paths = _get_camus_paths(path=path, chamber=chamber, download=download)
62
63    if resize_inputs:
64        raw_trafo = ResizeInputs(target_shape=patch_shape, is_label=False)
65        label_trafo = ResizeInputs(target_shape=patch_shape, is_label=True)
66        patch_shape = None
67    else:
68        patch_shape = patch_shape
69        raw_trafo, label_trafo = None, None
70
71    dataset = torch_em.default_segmentation_dataset(
72        raw_paths=image_paths,
73        raw_key="data",
74        label_paths=gt_paths,
75        label_key="data",
76        patch_shape=patch_shape,
77        raw_transform=raw_trafo,
78        label_transform=label_trafo,
79        **kwargs
80    )
81
82    return dataset

Dataset for segmenting cardiac structures in 2d echocardiography images.

The database is located at: https://humanheart-project.creatis.insa-lyon.fr/database/#collection/6373703d73e9f0047faa1bc8

This dataset is from the CAMUS challenge - https://doi.org/10.1109/TMI.2019.2900516. Please cite it if you use this dataset for a publication.

def get_camus_loader( path: Union[os.PathLike, str], patch_shape: Tuple[int, int], batch_size: int, chamber: Optional[int] = None, resize_inputs: bool = False, download: bool = False, **kwargs):
 85def get_camus_loader(
 86    path: Union[os.PathLike, str],
 87    patch_shape: Tuple[int, int],
 88    batch_size: int,
 89    chamber: Optional[int] = None,
 90    resize_inputs: bool = False,
 91    download: bool = False,
 92    **kwargs
 93):
 94    """Dataloader for segmenting cardiac structures in 2d echocardiography images. See `get_camus_dataset` for details
 95    """
 96    ds_kwargs, loader_kwargs = util.split_kwargs(torch_em.default_segmentation_dataset, **kwargs)
 97    dataset = get_camus_dataset(
 98        path=path, patch_shape=patch_shape, chamber=chamber, resize_inputs=resize_inputs, download=download, **ds_kwargs
 99    )
100    loader = torch_em.get_data_loader(dataset=dataset, batch_size=batch_size, **loader_kwargs)
101    return loader

Dataloader for segmenting cardiac structures in 2d echocardiography images. See get_camus_dataset for details