Skip to content
Snippets Groups Projects
Commit ec2ee219 authored by Daniel CARRON's avatar Daniel CARRON :b: Committed by André Anjos
Browse files

[segmentation] Add montgomery database

parent 7e204e95
No related branches found
No related tags found
1 merge request!46Create common library
......@@ -435,7 +435,7 @@ iostar-vessel = "mednet.libs.segmentation.config.data.iostar.vessel"
iostar-disc = "mednet.libs.segmentation.config.data.iostar.optic_disc"
# montgomery county - cxr
# montgomery = "mednet.libs.segmentation.config.data.montgomery.default"
montgomery = "mednet.libs.segmentation.config.data.montgomery.default"
# stare dataset - retinography
stare = "mednet.libs.segmentation.config.data.stare.ah"
......
# SPDX-FileCopyrightText: Copyright © 2024 Idiap Research Institute <contact@idiap.ch>
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""Montgomery DataModule for TB detection."""
import importlib.resources
import os
from pathlib import Path
import numpy as np
import PIL.Image
import pkg_resources
import torch
from mednet.libs.common.data.datamodule import CachingDataModule
from mednet.libs.common.data.split import JSONDatabaseSplit
from mednet.libs.common.data.typing import DatabaseSplit, Sample
from mednet.libs.segmentation.data.typing import (
SegmentationRawDataLoader as _SegmentationRawDataLoader,
)
from torchvision import tv_tensors
from torchvision.transforms.functional import to_tensor
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 SegmentationRawDataLoader(_SegmentationRawDataLoader):
"""A specialized raw-data-loader for the Montgomery dataset."""
datadir: str
"""This variable contains the base directory where the database raw data is
stored."""
def __init__(self):
self.datadir = load_rc().get(
CONFIGURATION_KEY_DATADIR, os.path.realpath(os.curdir)
)
self._pkg_path = pkg_resources.resource_filename(__name__, "masks")
def sample(self, sample: tuple[str, str, str]) -> Sample:
"""Load a single image sample 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
-------
The sample representation.
"""
image = PIL.Image.open(Path(self.datadir) / str(sample[0])).convert(
mode="RGB"
)
tensor = tv_tensors.Image(to_tensor(image))
# Combine left and right lung masks into a single tensor
target = tv_tensors.Image(
to_tensor(
np.ma.mask_or(
np.asarray(
PIL.Image.open(
Path(self.datadir) / str(sample[1])
).convert(mode="1", dither=None)
),
np.asarray(
PIL.Image.open(
Path(self.datadir) / str(sample[2])
).convert(mode="1", dither=None)
),
)
).float()
)
mask = tv_tensors.Mask(torch.ones_like(target))
return tensor, dict(target=target, mask=mask, name=sample[0]) # type: ignore[arg-type]
def make_split(basename: str) -> DatabaseSplit:
"""Return a database split for the Montgomery database.
Parameters
----------
basename
Name of the .json file containing the split to load.
Returns
-------
An instance of DatabaseSplit.
"""
return JSONDatabaseSplit(
importlib.resources.files(__name__.rsplit(".", 1)[0]).joinpath(basename)
)
class DataModule(CachingDataModule):
"""Montgomery DataModule for TB detection.
The standard digital image database for Tuberculosis was created by the National
Library of Medicine, Maryland, USA in collaboration with Shenzhen No.3 People’s
Hospital, Guangdong Medical College, Shenzhen, China. The Chest X-rays are from
* Database reference: [MONTGOMERY-SHENZHEN-2014]_
* Original resolution (height x width or width x height): 4020x4892 px or 4892x4020 px
Data specifications:
* Raw data input (on disk):
* PNG images 8 bit grayscale
* resolution: fixed to one of the cases above
* Output image:
* Transforms:
* Load raw PNG with :py:mod:`PIL`
* Remove black borders
* Convert to torch tensor
* Torch center cropping to get square image
* Final specifications
* Grayscale, encoded as a single plane tensor, 32-bit floats,
square at 4020 x 4020 pixels
* Labels: 0 (healthy), 1 (active tuberculosis)
Parameters
----------
split_filename
Name of the .json file containing the split to load.
"""
def __init__(self, split_filename: str):
super().__init__(
database_split=make_split(split_filename),
raw_data_loader=SegmentationRawDataLoader(),
)
{
"train": [
[
"CXR_png/MCUCXR_0393_1.png",
"ManualMask/leftMask/MCUCXR_0393_1.png",
"ManualMask/rightMask/MCUCXR_0393_1.png"
],
[
"CXR_png/MCUCXR_0294_1.png",
"ManualMask/leftMask/MCUCXR_0294_1.png",
"ManualMask/rightMask/MCUCXR_0294_1.png"
],
[
"CXR_png/MCUCXR_0144_1.png",
"ManualMask/leftMask/MCUCXR_0144_1.png",
"ManualMask/rightMask/MCUCXR_0144_1.png"
],
[
"CXR_png/MCUCXR_0383_1.png",
"ManualMask/leftMask/MCUCXR_0383_1.png",
"ManualMask/rightMask/MCUCXR_0383_1.png"
],
[
"CXR_png/MCUCXR_0309_1.png",
"ManualMask/leftMask/MCUCXR_0309_1.png",
"ManualMask/rightMask/MCUCXR_0309_1.png"
],
[
"CXR_png/MCUCXR_0094_0.png",
"ManualMask/leftMask/MCUCXR_0094_0.png",
"ManualMask/rightMask/MCUCXR_0094_0.png"
],
[
"CXR_png/MCUCXR_0182_1.png",
"ManualMask/leftMask/MCUCXR_0182_1.png",
"ManualMask/rightMask/MCUCXR_0182_1.png"
],
[
"CXR_png/MCUCXR_0091_0.png",
"ManualMask/leftMask/MCUCXR_0091_0.png",
"ManualMask/rightMask/MCUCXR_0091_0.png"
],
[
"CXR_png/MCUCXR_0063_0.png",
"ManualMask/leftMask/MCUCXR_0063_0.png",
"ManualMask/rightMask/MCUCXR_0063_0.png"
],
[
"CXR_png/MCUCXR_0023_0.png",
"ManualMask/leftMask/MCUCXR_0023_0.png",
"ManualMask/rightMask/MCUCXR_0023_0.png"
],
[
"CXR_png/MCUCXR_0083_0.png",
"ManualMask/leftMask/MCUCXR_0083_0.png",
"ManualMask/rightMask/MCUCXR_0083_0.png"
],
[
"CXR_png/MCUCXR_0001_0.png",
"ManualMask/leftMask/MCUCXR_0001_0.png",
"ManualMask/rightMask/MCUCXR_0001_0.png"
],
[
"CXR_png/MCUCXR_0113_1.png",
"ManualMask/leftMask/MCUCXR_0113_1.png",
"ManualMask/rightMask/MCUCXR_0113_1.png"
],
[
"CXR_png/MCUCXR_0048_0.png",
"ManualMask/leftMask/MCUCXR_0048_0.png",
"ManualMask/rightMask/MCUCXR_0048_0.png"
],
[
"CXR_png/MCUCXR_0086_0.png",
"ManualMask/leftMask/MCUCXR_0086_0.png",
"ManualMask/rightMask/MCUCXR_0086_0.png"
],
[
"CXR_png/MCUCXR_0251_1.png",
"ManualMask/leftMask/MCUCXR_0251_1.png",
"ManualMask/rightMask/MCUCXR_0251_1.png"
],
[
"CXR_png/MCUCXR_0027_0.png",
"ManualMask/leftMask/MCUCXR_0027_0.png",
"ManualMask/rightMask/MCUCXR_0027_0.png"
],
[
"CXR_png/MCUCXR_0254_1.png",
"ManualMask/leftMask/MCUCXR_0254_1.png",
"ManualMask/rightMask/MCUCXR_0254_1.png"
],
[
"CXR_png/MCUCXR_0017_0.png",
"ManualMask/leftMask/MCUCXR_0017_0.png",
"ManualMask/rightMask/MCUCXR_0017_0.png"
],
[
"CXR_png/MCUCXR_0015_0.png",
"ManualMask/leftMask/MCUCXR_0015_0.png",
"ManualMask/rightMask/MCUCXR_0015_0.png"
],
[
"CXR_png/MCUCXR_0042_0.png",
"ManualMask/leftMask/MCUCXR_0042_0.png",
"ManualMask/rightMask/MCUCXR_0042_0.png"
],
[
"CXR_png/MCUCXR_0101_0.png",
"ManualMask/leftMask/MCUCXR_0101_0.png",
"ManualMask/rightMask/MCUCXR_0101_0.png"
],
[
"CXR_png/MCUCXR_0043_0.png",
"ManualMask/leftMask/MCUCXR_0043_0.png",
"ManualMask/rightMask/MCUCXR_0043_0.png"
],
[
"CXR_png/MCUCXR_0074_0.png",
"ManualMask/leftMask/MCUCXR_0074_0.png",
"ManualMask/rightMask/MCUCXR_0074_0.png"
],
[
"CXR_png/MCUCXR_0375_1.png",
"ManualMask/leftMask/MCUCXR_0375_1.png",
"ManualMask/rightMask/MCUCXR_0375_1.png"
],
[
"CXR_png/MCUCXR_0099_0.png",
"ManualMask/leftMask/MCUCXR_0099_0.png",
"ManualMask/rightMask/MCUCXR_0099_0.png"
],
[
"CXR_png/MCUCXR_0104_1.png",
"ManualMask/leftMask/MCUCXR_0104_1.png",
"ManualMask/rightMask/MCUCXR_0104_1.png"
],
[
"CXR_png/MCUCXR_0150_1.png",
"ManualMask/leftMask/MCUCXR_0150_1.png",
"ManualMask/rightMask/MCUCXR_0150_1.png"
],
[
"CXR_png/MCUCXR_0102_0.png",
"ManualMask/leftMask/MCUCXR_0102_0.png",
"ManualMask/rightMask/MCUCXR_0102_0.png"
],
[
"CXR_png/MCUCXR_0188_1.png",
"ManualMask/leftMask/MCUCXR_0188_1.png",
"ManualMask/rightMask/MCUCXR_0188_1.png"
],
[
"CXR_png/MCUCXR_0162_1.png",
"ManualMask/leftMask/MCUCXR_0162_1.png",
"ManualMask/rightMask/MCUCXR_0162_1.png"
],
[
"CXR_png/MCUCXR_0195_1.png",
"ManualMask/leftMask/MCUCXR_0195_1.png",
"ManualMask/rightMask/MCUCXR_0195_1.png"
],
[
"CXR_png/MCUCXR_0052_0.png",
"ManualMask/leftMask/MCUCXR_0052_0.png",
"ManualMask/rightMask/MCUCXR_0052_0.png"
],
[
"CXR_png/MCUCXR_0070_0.png",
"ManualMask/leftMask/MCUCXR_0070_0.png",
"ManualMask/rightMask/MCUCXR_0070_0.png"
],
[
"CXR_png/MCUCXR_0372_1.png",
"ManualMask/leftMask/MCUCXR_0372_1.png",
"ManualMask/rightMask/MCUCXR_0372_1.png"
],
[
"CXR_png/MCUCXR_0089_0.png",
"ManualMask/leftMask/MCUCXR_0089_0.png",
"ManualMask/rightMask/MCUCXR_0089_0.png"
],
[
"CXR_png/MCUCXR_0253_1.png",
"ManualMask/leftMask/MCUCXR_0253_1.png",
"ManualMask/rightMask/MCUCXR_0253_1.png"
],
[
"CXR_png/MCUCXR_0092_0.png",
"ManualMask/leftMask/MCUCXR_0092_0.png",
"ManualMask/rightMask/MCUCXR_0092_0.png"
],
[
"CXR_png/MCUCXR_0031_0.png",
"ManualMask/leftMask/MCUCXR_0031_0.png",
"ManualMask/rightMask/MCUCXR_0031_0.png"
],
[
"CXR_png/MCUCXR_0071_0.png",
"ManualMask/leftMask/MCUCXR_0071_0.png",
"ManualMask/rightMask/MCUCXR_0071_0.png"
],
[
"CXR_png/MCUCXR_0228_1.png",
"ManualMask/leftMask/MCUCXR_0228_1.png",
"ManualMask/rightMask/MCUCXR_0228_1.png"
],
[
"CXR_png/MCUCXR_0096_0.png",
"ManualMask/leftMask/MCUCXR_0096_0.png",
"ManualMask/rightMask/MCUCXR_0096_0.png"
],
[
"CXR_png/MCUCXR_0141_1.png",
"ManualMask/leftMask/MCUCXR_0141_1.png",
"ManualMask/rightMask/MCUCXR_0141_1.png"
],
[
"CXR_png/MCUCXR_0057_0.png",
"ManualMask/leftMask/MCUCXR_0057_0.png",
"ManualMask/rightMask/MCUCXR_0057_0.png"
],
[
"CXR_png/MCUCXR_0126_1.png",
"ManualMask/leftMask/MCUCXR_0126_1.png",
"ManualMask/rightMask/MCUCXR_0126_1.png"
],
[
"CXR_png/MCUCXR_0055_0.png",
"ManualMask/leftMask/MCUCXR_0055_0.png",
"ManualMask/rightMask/MCUCXR_0055_0.png"
],
[
"CXR_png/MCUCXR_0005_0.png",
"ManualMask/leftMask/MCUCXR_0005_0.png",
"ManualMask/rightMask/MCUCXR_0005_0.png"
],
[
"CXR_png/MCUCXR_0275_1.png",
"ManualMask/leftMask/MCUCXR_0275_1.png",
"ManualMask/rightMask/MCUCXR_0275_1.png"
],
[
"CXR_png/MCUCXR_0311_1.png",
"ManualMask/leftMask/MCUCXR_0311_1.png",
"ManualMask/rightMask/MCUCXR_0311_1.png"
],
[
"CXR_png/MCUCXR_0026_0.png",
"ManualMask/leftMask/MCUCXR_0026_0.png",
"ManualMask/rightMask/MCUCXR_0026_0.png"
],
[
"CXR_png/MCUCXR_0350_1.png",
"ManualMask/leftMask/MCUCXR_0350_1.png",
"ManualMask/rightMask/MCUCXR_0350_1.png"
],
[
"CXR_png/MCUCXR_0087_0.png",
"ManualMask/leftMask/MCUCXR_0087_0.png",
"ManualMask/rightMask/MCUCXR_0087_0.png"
],
[
"CXR_png/MCUCXR_0035_0.png",
"ManualMask/leftMask/MCUCXR_0035_0.png",
"ManualMask/rightMask/MCUCXR_0035_0.png"
],
[
"CXR_png/MCUCXR_0021_0.png",
"ManualMask/leftMask/MCUCXR_0021_0.png",
"ManualMask/rightMask/MCUCXR_0021_0.png"
],
[
"CXR_png/MCUCXR_0140_1.png",
"ManualMask/leftMask/MCUCXR_0140_1.png",
"ManualMask/rightMask/MCUCXR_0140_1.png"
],
[
"CXR_png/MCUCXR_0058_0.png",
"ManualMask/leftMask/MCUCXR_0058_0.png",
"ManualMask/rightMask/MCUCXR_0058_0.png"
],
[
"CXR_png/MCUCXR_0079_0.png",
"ManualMask/leftMask/MCUCXR_0079_0.png",
"ManualMask/rightMask/MCUCXR_0079_0.png"
],
[
"CXR_png/MCUCXR_0002_0.png",
"ManualMask/leftMask/MCUCXR_0002_0.png",
"ManualMask/rightMask/MCUCXR_0002_0.png"
],
[
"CXR_png/MCUCXR_0061_0.png",
"ManualMask/leftMask/MCUCXR_0061_0.png",
"ManualMask/rightMask/MCUCXR_0061_0.png"
],
[
"CXR_png/MCUCXR_0060_0.png",
"ManualMask/leftMask/MCUCXR_0060_0.png",
"ManualMask/rightMask/MCUCXR_0060_0.png"
],
[
"CXR_png/MCUCXR_0331_1.png",
"ManualMask/leftMask/MCUCXR_0331_1.png",
"ManualMask/rightMask/MCUCXR_0331_1.png"
],
[
"CXR_png/MCUCXR_0108_1.png",
"ManualMask/leftMask/MCUCXR_0108_1.png",
"ManualMask/rightMask/MCUCXR_0108_1.png"
],
[
"CXR_png/MCUCXR_0062_0.png",
"ManualMask/leftMask/MCUCXR_0062_0.png",
"ManualMask/rightMask/MCUCXR_0062_0.png"
],
[
"CXR_png/MCUCXR_0047_0.png",
"ManualMask/leftMask/MCUCXR_0047_0.png",
"ManualMask/rightMask/MCUCXR_0047_0.png"
],
[
"CXR_png/MCUCXR_0080_0.png",
"ManualMask/leftMask/MCUCXR_0080_0.png",
"ManualMask/rightMask/MCUCXR_0080_0.png"
],
[
"CXR_png/MCUCXR_0255_1.png",
"ManualMask/leftMask/MCUCXR_0255_1.png",
"ManualMask/rightMask/MCUCXR_0255_1.png"
],
[
"CXR_png/MCUCXR_0338_1.png",
"ManualMask/leftMask/MCUCXR_0338_1.png",
"ManualMask/rightMask/MCUCXR_0338_1.png"
],
[
"CXR_png/MCUCXR_0038_0.png",
"ManualMask/leftMask/MCUCXR_0038_0.png",
"ManualMask/rightMask/MCUCXR_0038_0.png"
],
[
"CXR_png/MCUCXR_0289_1.png",
"ManualMask/leftMask/MCUCXR_0289_1.png",
"ManualMask/rightMask/MCUCXR_0289_1.png"
],
[
"CXR_png/MCUCXR_0019_0.png",
"ManualMask/leftMask/MCUCXR_0019_0.png",
"ManualMask/rightMask/MCUCXR_0019_0.png"
],
[
"CXR_png/MCUCXR_0029_0.png",
"ManualMask/leftMask/MCUCXR_0029_0.png",
"ManualMask/rightMask/MCUCXR_0029_0.png"
],
[
"CXR_png/MCUCXR_0369_1.png",
"ManualMask/leftMask/MCUCXR_0369_1.png",
"ManualMask/rightMask/MCUCXR_0369_1.png"
],
[
"CXR_png/MCUCXR_0399_1.png",
"ManualMask/leftMask/MCUCXR_0399_1.png",
"ManualMask/rightMask/MCUCXR_0399_1.png"
],
[
"CXR_png/MCUCXR_0173_1.png",
"ManualMask/leftMask/MCUCXR_0173_1.png",
"ManualMask/rightMask/MCUCXR_0173_1.png"
],
[
"CXR_png/MCUCXR_0049_0.png",
"ManualMask/leftMask/MCUCXR_0049_0.png",
"ManualMask/rightMask/MCUCXR_0049_0.png"
],
[
"CXR_png/MCUCXR_0170_1.png",
"ManualMask/leftMask/MCUCXR_0170_1.png",
"ManualMask/rightMask/MCUCXR_0170_1.png"
],
[
"CXR_png/MCUCXR_0051_0.png",
"ManualMask/leftMask/MCUCXR_0051_0.png",
"ManualMask/rightMask/MCUCXR_0051_0.png"
],
[
"CXR_png/MCUCXR_0022_0.png",
"ManualMask/leftMask/MCUCXR_0022_0.png",
"ManualMask/rightMask/MCUCXR_0022_0.png"
],
[
"CXR_png/MCUCXR_0028_0.png",
"ManualMask/leftMask/MCUCXR_0028_0.png",
"ManualMask/rightMask/MCUCXR_0028_0.png"
],
[
"CXR_png/MCUCXR_0100_0.png",
"ManualMask/leftMask/MCUCXR_0100_0.png",
"ManualMask/rightMask/MCUCXR_0100_0.png"
],
[
"CXR_png/MCUCXR_0085_0.png",
"ManualMask/leftMask/MCUCXR_0085_0.png",
"ManualMask/rightMask/MCUCXR_0085_0.png"
],
[
"CXR_png/MCUCXR_0095_0.png",
"ManualMask/leftMask/MCUCXR_0095_0.png",
"ManualMask/rightMask/MCUCXR_0095_0.png"
],
[
"CXR_png/MCUCXR_0348_1.png",
"ManualMask/leftMask/MCUCXR_0348_1.png",
"ManualMask/rightMask/MCUCXR_0348_1.png"
],
[
"CXR_png/MCUCXR_0194_1.png",
"ManualMask/leftMask/MCUCXR_0194_1.png",
"ManualMask/rightMask/MCUCXR_0194_1.png"
],
[
"CXR_png/MCUCXR_0243_1.png",
"ManualMask/leftMask/MCUCXR_0243_1.png",
"ManualMask/rightMask/MCUCXR_0243_1.png"
],
[
"CXR_png/MCUCXR_0097_0.png",
"ManualMask/leftMask/MCUCXR_0097_0.png",
"ManualMask/rightMask/MCUCXR_0097_0.png"
],
[
"CXR_png/MCUCXR_0103_0.png",
"ManualMask/leftMask/MCUCXR_0103_0.png",
"ManualMask/rightMask/MCUCXR_0103_0.png"
],
[
"CXR_png/MCUCXR_0301_1.png",
"ManualMask/leftMask/MCUCXR_0301_1.png",
"ManualMask/rightMask/MCUCXR_0301_1.png"
],
[
"CXR_png/MCUCXR_0213_1.png",
"ManualMask/leftMask/MCUCXR_0213_1.png",
"ManualMask/rightMask/MCUCXR_0213_1.png"
],
[
"CXR_png/MCUCXR_0040_0.png",
"ManualMask/leftMask/MCUCXR_0040_0.png",
"ManualMask/rightMask/MCUCXR_0040_0.png"
],
[
"CXR_png/MCUCXR_0334_1.png",
"ManualMask/leftMask/MCUCXR_0334_1.png",
"ManualMask/rightMask/MCUCXR_0334_1.png"
],
[
"CXR_png/MCUCXR_0142_1.png",
"ManualMask/leftMask/MCUCXR_0142_1.png",
"ManualMask/rightMask/MCUCXR_0142_1.png"
],
[
"CXR_png/MCUCXR_0203_1.png",
"ManualMask/leftMask/MCUCXR_0203_1.png",
"ManualMask/rightMask/MCUCXR_0203_1.png"
],
[
"CXR_png/MCUCXR_0069_0.png",
"ManualMask/leftMask/MCUCXR_0069_0.png",
"ManualMask/rightMask/MCUCXR_0069_0.png"
],
[
"CXR_png/MCUCXR_0013_0.png",
"ManualMask/leftMask/MCUCXR_0013_0.png",
"ManualMask/rightMask/MCUCXR_0013_0.png"
],
[
"CXR_png/MCUCXR_0081_0.png",
"ManualMask/leftMask/MCUCXR_0081_0.png",
"ManualMask/rightMask/MCUCXR_0081_0.png"
]
],
"validation": [
[
"CXR_png/MCUCXR_0282_1.png",
"ManualMask/leftMask/MCUCXR_0282_1.png",
"ManualMask/rightMask/MCUCXR_0282_1.png"
],
[
"CXR_png/MCUCXR_0068_0.png",
"ManualMask/leftMask/MCUCXR_0068_0.png",
"ManualMask/rightMask/MCUCXR_0068_0.png"
],
[
"CXR_png/MCUCXR_0117_1.png",
"ManualMask/leftMask/MCUCXR_0117_1.png",
"ManualMask/rightMask/MCUCXR_0117_1.png"
],
[
"CXR_png/MCUCXR_0041_0.png",
"ManualMask/leftMask/MCUCXR_0041_0.png",
"ManualMask/rightMask/MCUCXR_0041_0.png"
],
[
"CXR_png/MCUCXR_0352_1.png",
"ManualMask/leftMask/MCUCXR_0352_1.png",
"ManualMask/rightMask/MCUCXR_0352_1.png"
],
[
"CXR_png/MCUCXR_0020_0.png",
"ManualMask/leftMask/MCUCXR_0020_0.png",
"ManualMask/rightMask/MCUCXR_0020_0.png"
],
[
"CXR_png/MCUCXR_0072_0.png",
"ManualMask/leftMask/MCUCXR_0072_0.png",
"ManualMask/rightMask/MCUCXR_0072_0.png"
],
[
"CXR_png/MCUCXR_0059_0.png",
"ManualMask/leftMask/MCUCXR_0059_0.png",
"ManualMask/rightMask/MCUCXR_0059_0.png"
],
[
"CXR_png/MCUCXR_0003_0.png",
"ManualMask/leftMask/MCUCXR_0003_0.png",
"ManualMask/rightMask/MCUCXR_0003_0.png"
],
[
"CXR_png/MCUCXR_0313_1.png",
"ManualMask/leftMask/MCUCXR_0313_1.png",
"ManualMask/rightMask/MCUCXR_0313_1.png"
],
[
"CXR_png/MCUCXR_0223_1.png",
"ManualMask/leftMask/MCUCXR_0223_1.png",
"ManualMask/rightMask/MCUCXR_0223_1.png"
],
[
"CXR_png/MCUCXR_0006_0.png",
"ManualMask/leftMask/MCUCXR_0006_0.png",
"ManualMask/rightMask/MCUCXR_0006_0.png"
],
[
"CXR_png/MCUCXR_0082_0.png",
"ManualMask/leftMask/MCUCXR_0082_0.png",
"ManualMask/rightMask/MCUCXR_0082_0.png"
],
[
"CXR_png/MCUCXR_0046_0.png",
"ManualMask/leftMask/MCUCXR_0046_0.png",
"ManualMask/rightMask/MCUCXR_0046_0.png"
]
],
"test": [
[
"CXR_png/MCUCXR_0064_0.png",
"ManualMask/leftMask/MCUCXR_0064_0.png",
"ManualMask/rightMask/MCUCXR_0064_0.png"
],
[
"CXR_png/MCUCXR_0218_1.png",
"ManualMask/leftMask/MCUCXR_0218_1.png",
"ManualMask/rightMask/MCUCXR_0218_1.png"
],
[
"CXR_png/MCUCXR_0258_1.png",
"ManualMask/leftMask/MCUCXR_0258_1.png",
"ManualMask/rightMask/MCUCXR_0258_1.png"
],
[
"CXR_png/MCUCXR_0264_1.png",
"ManualMask/leftMask/MCUCXR_0264_1.png",
"ManualMask/rightMask/MCUCXR_0264_1.png"
],
[
"CXR_png/MCUCXR_0362_1.png",
"ManualMask/leftMask/MCUCXR_0362_1.png",
"ManualMask/rightMask/MCUCXR_0362_1.png"
],
[
"CXR_png/MCUCXR_0044_0.png",
"ManualMask/leftMask/MCUCXR_0044_0.png",
"ManualMask/rightMask/MCUCXR_0044_0.png"
],
[
"CXR_png/MCUCXR_0390_1.png",
"ManualMask/leftMask/MCUCXR_0390_1.png",
"ManualMask/rightMask/MCUCXR_0390_1.png"
],
[
"CXR_png/MCUCXR_0354_1.png",
"ManualMask/leftMask/MCUCXR_0354_1.png",
"ManualMask/rightMask/MCUCXR_0354_1.png"
],
[
"CXR_png/MCUCXR_0316_1.png",
"ManualMask/leftMask/MCUCXR_0316_1.png",
"ManualMask/rightMask/MCUCXR_0316_1.png"
],
[
"CXR_png/MCUCXR_0053_0.png",
"ManualMask/leftMask/MCUCXR_0053_0.png",
"ManualMask/rightMask/MCUCXR_0053_0.png"
],
[
"CXR_png/MCUCXR_0166_1.png",
"ManualMask/leftMask/MCUCXR_0166_1.png",
"ManualMask/rightMask/MCUCXR_0166_1.png"
],
[
"CXR_png/MCUCXR_0008_0.png",
"ManualMask/leftMask/MCUCXR_0008_0.png",
"ManualMask/rightMask/MCUCXR_0008_0.png"
],
[
"CXR_png/MCUCXR_0084_0.png",
"ManualMask/leftMask/MCUCXR_0084_0.png",
"ManualMask/rightMask/MCUCXR_0084_0.png"
],
[
"CXR_png/MCUCXR_0004_0.png",
"ManualMask/leftMask/MCUCXR_0004_0.png",
"ManualMask/rightMask/MCUCXR_0004_0.png"
],
[
"CXR_png/MCUCXR_0196_1.png",
"ManualMask/leftMask/MCUCXR_0196_1.png",
"ManualMask/rightMask/MCUCXR_0196_1.png"
],
[
"CXR_png/MCUCXR_0016_0.png",
"ManualMask/leftMask/MCUCXR_0016_0.png",
"ManualMask/rightMask/MCUCXR_0016_0.png"
],
[
"CXR_png/MCUCXR_0075_0.png",
"ManualMask/leftMask/MCUCXR_0075_0.png",
"ManualMask/rightMask/MCUCXR_0075_0.png"
],
[
"CXR_png/MCUCXR_0056_0.png",
"ManualMask/leftMask/MCUCXR_0056_0.png",
"ManualMask/rightMask/MCUCXR_0056_0.png"
],
[
"CXR_png/MCUCXR_0024_0.png",
"ManualMask/leftMask/MCUCXR_0024_0.png",
"ManualMask/rightMask/MCUCXR_0024_0.png"
],
[
"CXR_png/MCUCXR_0367_1.png",
"ManualMask/leftMask/MCUCXR_0367_1.png",
"ManualMask/rightMask/MCUCXR_0367_1.png"
],
[
"CXR_png/MCUCXR_0011_0.png",
"ManualMask/leftMask/MCUCXR_0011_0.png",
"ManualMask/rightMask/MCUCXR_0011_0.png"
],
[
"CXR_png/MCUCXR_0054_0.png",
"ManualMask/leftMask/MCUCXR_0054_0.png",
"ManualMask/rightMask/MCUCXR_0054_0.png"
],
[
"CXR_png/MCUCXR_0090_0.png",
"ManualMask/leftMask/MCUCXR_0090_0.png",
"ManualMask/rightMask/MCUCXR_0090_0.png"
],
[
"CXR_png/MCUCXR_0045_0.png",
"ManualMask/leftMask/MCUCXR_0045_0.png",
"ManualMask/rightMask/MCUCXR_0045_0.png"
],
[
"CXR_png/MCUCXR_0030_0.png",
"ManualMask/leftMask/MCUCXR_0030_0.png",
"ManualMask/rightMask/MCUCXR_0030_0.png"
],
[
"CXR_png/MCUCXR_0077_0.png",
"ManualMask/leftMask/MCUCXR_0077_0.png",
"ManualMask/rightMask/MCUCXR_0077_0.png"
],
[
"CXR_png/MCUCXR_0387_1.png",
"ManualMask/leftMask/MCUCXR_0387_1.png",
"ManualMask/rightMask/MCUCXR_0387_1.png"
],
[
"CXR_png/MCUCXR_0266_1.png",
"ManualMask/leftMask/MCUCXR_0266_1.png",
"ManualMask/rightMask/MCUCXR_0266_1.png"
]
]
}
# SPDX-FileCopyrightText: Copyright © 2024 Idiap Research Institute <contact@idiap.ch>
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""Montgomery County dataset for Lung Segmentation.
The database includes 58 cases with manifestation of tuberculosis, and 80
normal cases. It contains a total of 138 resolution of 4020 x 4892, or
4892 x 4020. One set of ground-truth lung annotations is available.
* Reference: [MC-2014]_
* Original resolution (height x width): 4020 x 4892, or 4892 x 4020
* Configuration resolution: 512 x 512 (after rescaling)
* Split reference: [GAAL-2020]_
* Protocol ``default``:
* Training samples: 96 (including labels)
* Validation samples: 14 (including labels)
* Test samples: 28 (including labels)
"""
from mednet.libs.segmentation.config.data.montgomery.datamodule import (
DataModule,
)
datamodule = DataModule("default.json")
# SPDX-FileCopyrightText: Copyright © 2024 Idiap Research Institute <contact@idiap.ch>
#
# SPDX-License-Identifier: GPL-3.0-or-later
"""Tests for Montgomery dataset."""
import importlib
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,lengths",
[
("default", dict(train=96, validation=14, test=28)),
],
ids=id_function, # just changes how pytest prints it
)
def test_protocol_consistency(
database_checkers,
split: str,
lengths: dict[str, int],
):
from mednet.libs.segmentation.config.data.montgomery.datamodule import (
make_split,
)
database_checkers.check_split(
make_split(f"{split}.json"),
lengths=lengths,
)
@pytest.mark.skip_if_rc_var_not_set("datadir.montgomery")
def test_database_check():
from mednet.libs.segmentation.scripts.database import check
runner = CliRunner()
result = runner.invoke(check, ["montgomery"])
assert (
result.exit_code == 0
), f"Exit code {result.exit_code} != 0 -- Output:\n{result.output}"
@pytest.mark.skip_if_rc_var_not_set("datadir.montgomery")
@pytest.mark.parametrize(
"dataset",
[
"train",
"validation",
"test",
],
)
@pytest.mark.parametrize(
"name",
[
"default",
],
)
def test_loading(database_checkers, name: str, dataset: str):
datamodule = importlib.import_module(
f".{name}",
"mednet.libs.segmentation.config.data.montgomery",
).datamodule
datamodule.model_transforms = [] # should be done before setup()
datamodule.setup("predict") # sets up all datasets
loader = datamodule.predict_dataloader()[dataset]
limit = 3 # limit load checking
for batch in loader:
if limit == 0:
break
database_checkers.check_loaded_batch(
batch,
batch_size=1,
color_planes=3,
expected_num_targets=1,
prefixes=["CXR_png"],
)
limit -= 1
@pytest.mark.skip_if_rc_var_not_set("datadir.montgomery")
def test_raw_transforms_image_quality(database_checkers, datadir):
reference_histogram_file = str(
datadir / "histograms/raw_data/histograms_montgomery_default.json",
)
datamodule = importlib.import_module(
".default",
"mednet.libs.segmentation.config.data.montgomery",
).datamodule
datamodule.model_transforms = []
datamodule.setup("predict")
database_checkers.check_image_quality(datamodule, reference_histogram_file)
@pytest.mark.skip_if_rc_var_not_set("datadir.montgomery")
@pytest.mark.parametrize(
"model_name",
["lwnet"],
)
def test_model_transforms_image_quality(database_checkers, datadir, model_name):
reference_histogram_file = str(
datadir
/ f"histograms/models/histograms_{model_name}_montgomery_default.json",
)
datamodule = importlib.import_module(
".default",
"mednet.libs.segmentation.config.data.montgomery",
).datamodule
model = importlib.import_module(
f".{model_name}",
"mednet.libs.segmentation.config.models",
).model
datamodule.model_transforms = model.model_transforms
datamodule.setup("predict")
database_checkers.check_image_quality(
datamodule,
reference_histogram_file,
compare_type="statistical",
pearson_coeff_threshold=0.005,
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment