Trace applied transforms

Sometimes we would like to see which transform was applied to a certain batch during training. This can be done in TorchIO using torchio.utils.history_collate() for the data loader. The transforms history can be saved during training to check what was applied.

  • ToCanonical, Gamma, Blur, Flip, RescaleIntensity, Sagittal, Coronal, Axial
  • ToCanonical, Blur, RescaleIntensity, Sagittal, Coronal, Axial
  • ToCanonical, Gamma, Flip, RescaleIntensity, Sagittal, Coronal, Axial
  • ToCanonical, Gamma, Blur, Flip, RescaleIntensity, Sagittal, Coronal, Axial
Applied transforms:
[ToCanonical(orientation=RAS),
 Gamma(gamma={'t1': [np.float64(0.8018917031404817)]}),
 RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)]

Composed transform to reproduce history:
Compose([ToCanonical(orientation=RAS), Gamma(gamma={'t1': [np.float64(0.8018917031404817)]}), RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)])

Composed transform to invert applied transforms when possible:
/home/runner/work/torchio/torchio/src/torchio/data/subject.py:207: RuntimeWarning: Skipping ToCanonical as it is not invertible
  inverse_transform = history_transform.inverse(warn=warn)
/home/runner/work/torchio/torchio/src/torchio/data/subject.py:207: RuntimeWarning: Skipping RescaleIntensity as it is not invertible
  inverse_transform = history_transform.inverse(warn=warn)
Compose([Gamma(gamma={'t1': [np.float64(0.8018917031404817)]}, invert=True)])

Transforms applied to subjects in batch:
[[ToCanonical(orientation=RAS),
  Gamma(gamma={'t1': [np.float64(1.1259200934274376)]}),
  Blur(std={'t1': (0.5645371675491333, 1.3632171154022217, 1.8303879499435425)}),
  Flip(axes=(0,)),
  RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)],
 [ToCanonical(orientation=RAS),
  Blur(std={'t1': (0.5396671295166016, 0.30135953426361084, 0.0634390115737915)}),
  RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)],
 [ToCanonical(orientation=RAS),
  Gamma(gamma={'t1': [np.float64(0.8567072622705179)]}),
  Flip(axes=(0,)),
  RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)],
 [ToCanonical(orientation=RAS),
  Gamma(gamma={'t1': [np.float64(0.7924771084926655)]}),
  Blur(std={'t1': (1.4524730443954468, 1.402160406112671, 0.4076474905014038)}),
  Flip(axes=(0,)),
  RescaleIntensity(out_min_max=(-1, 1), percentiles=(0, 100), masking_method=None, in_min_max=None)]]

import pprint

import matplotlib.pyplot as plt
import torch

import torchio as tio

torch.manual_seed(0)

batch_size = 4
subject = tio.datasets.FPG()
subject.remove_image('seg')
subjects = 4 * [subject]

transform = tio.Compose(
    (
        tio.ToCanonical(),
        tio.RandomGamma(p=0.75),
        tio.RandomBlur(p=0.5),
        tio.RandomFlip(),
        tio.RescaleIntensity(out_min_max=(-1, 1)),
    )
)

dataset = tio.SubjectsDataset(subjects, transform=transform)

transformed = dataset[0]
print('Applied transforms:')  # noqa: T201
pprint.pprint(transformed.history)  # noqa: T203
print('\nComposed transform to reproduce history:')  # noqa: T201
print(transformed.get_composed_history())  # noqa: T201
print('\nComposed transform to invert applied transforms when possible:')
print(transformed.get_inverse_transform(ignore_intensity=False))  # noqa: T201

loader = tio.SubjectsLoader(
    dataset,
    batch_size=batch_size,
    collate_fn=tio.utils.history_collate,
)

batch = tio.utils.get_first_item(loader)
print('\nTransforms applied to subjects in batch:')  # noqa: T201
pprint.pprint(batch[tio.HISTORY])  # noqa: T203

for i in range(batch_size):
    tensor = batch['t1'][tio.DATA][i]
    affine = batch['t1'][tio.AFFINE][i]
    image = tio.ScalarImage(tensor=tensor, affine=affine)
    image.plot(show=False)
    history = batch[tio.HISTORY][i]
    title = ', '.join(t.name for t in history)
    plt.suptitle(title)
    plt.tight_layout()

plt.show()

Total running time of the script: (0 minutes 3.392 seconds)

Gallery generated by Sphinx-Gallery