Skip to content

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.

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()
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:
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)]]

Trace applied transforms

Trace applied transforms

Trace applied transforms

Trace applied transforms


:fontawesome-brands-github: View source on GitHub{ .md-button }