anomalib.pre_processing¶
Utilities for pre-processing the input before passing to the model.
Subpackages¶
Submodules¶
Package Contents¶
Classes¶
Applies pre-processing and data augmentations to the input and returns the transformed output. |
|
Tile Image into (non)overlapping Patches. Images are tiled in order to efficiently process large images. |
- class anomalib.pre_processing.PreProcessor(config: Optional[Union[str, albumentations.Compose]] = None, image_size: Optional[Union[int, Tuple]] = None, to_tensor: bool = True)[source]¶
Applies pre-processing and data augmentations to the input and returns the transformed output.
Output could be either numpy ndarray or torch tensor. When PreProcessor class is used for training, the output would be torch.Tensor. For the inference it returns a numpy array.
- Parameters
config (Optional[Union[str, A.Compose]], optional) – Transformation configurations. When it is
None,PreProcessoronly applies resizing. When it isstrit loads the config viaalbumentationsdeserialisation methos . Defaults to None.image_size (Optional[Union[int, Tuple[int, int]]], optional) – When there is no config,
None. (image_size resizes the image. Defaults to) –
to_tensor (bool, optional) – Boolean to check whether the augmented image is transformed into a tensor or not. Defaults to True.
Examples
>>> import skimage >>> image = skimage.data.astronaut()
>>> pre_processor = PreProcessor(image_size=256, to_tensor=False) >>> output = pre_processor(image=image) >>> output["image"].shape (256, 256, 3)
>>> pre_processor = PreProcessor(image_size=256, to_tensor=True) >>> output = pre_processor(image=image) >>> output["image"].shape torch.Size([3, 256, 256])
- Transforms could be read from albumentations Compose object.
>>> import albumentations as A >>> from albumentations.pytorch import ToTensorV2 >>> config = A.Compose([A.Resize(512, 512), ToTensorV2()]) >>> pre_processor = PreProcessor(config=config, to_tensor=False) >>> output = pre_processor(image=image) >>> output["image"].shape (512, 512, 3) >>> type(output["image"]) numpy.ndarray
- Transforms could be deserialized from a yaml file.
>>> transforms = A.Compose([A.Resize(1024, 1024), ToTensorV2()]) >>> A.save(transforms, "/tmp/transforms.yaml", data_format="yaml") >>> pre_processor = PreProcessor(config="/tmp/transforms.yaml") >>> output = pre_processor(image=image) >>> output["image"].shape torch.Size([3, 1024, 1024])
- get_transforms() albumentations.Compose¶
Get transforms from config or image size.
- Returns
- List of albumentation transformations to apply to the
input image.
- Return type
A.Compose
- __call__(*args, **kwargs)¶
Return transformed arguments.
- _get_height_and_width() Tuple[Optional[int], Optional[int]]¶
Extract height and width from image size attribute.
- class anomalib.pre_processing.Tiler(tile_size: Union[int, Sequence], stride: Optional[Union[int, Sequence]] = None, remove_border_count: int = 0, mode: str = 'padding', tile_count: int = 4)[source]¶
Tile Image into (non)overlapping Patches. Images are tiled in order to efficiently process large images.
- Parameters
tile_size – Tile dimension for each patch
stride – Stride length between patches
remove_border_count – Number of border pixels to be removed from tile before untiling
mode – Upscaling mode for image resize.Supported formats: padding, interpolation
Examples
>>> import torch >>> from torchvision import transforms >>> from skimage.data import camera >>> tiler = Tiler(tile_size=256,stride=128) >>> image = transforms.ToTensor()(camera()) >>> tiles = tiler.tile(image) >>> image.shape, tiles.shape (torch.Size([3, 512, 512]), torch.Size([9, 3, 256, 256]))
>>> # Perform your operations on the tiles.
>>> # Untile the patches to reconstruct the image >>> reconstructed_image = tiler.untile(tiles) >>> reconstructed_image.shape torch.Size([1, 3, 512, 512])
- static __validate_size_type(parameter: Union[int, Sequence]) Tuple[int, Ellipsis]¶
- __random_tile(image: torch.Tensor) torch.Tensor¶
Randomly crop tiles from the given image.
- Parameters
image – input image to be cropped
Returns: Randomly cropped tiles from the image
- __unfold(tensor: torch.Tensor) torch.Tensor¶
Unfolds tensor into tiles.
This is the core function to perform tiling operation.
- Parameters
tensor – Input tensor from which tiles are generated.
Returns: Generated tiles
- __fold(tiles: torch.Tensor) torch.Tensor¶
Fold the tiles back into the original tensor.
This is the core method to reconstruct the original image from its tiled version.
- Parameters
tiles – Tiles from the input image, generated via __unfold method.
- Returns
Output that is the reconstructed version of the input tensor.
- tile(image: torch.Tensor, use_random_tiling: Optional[bool] = False) torch.Tensor¶
Tiles an input image to either overlapping, non-overlapping or random patches.
- Parameters
image – Input image to tile.
Examples
>>> from anomalib.data.tiler import Tiler >>> tiler = Tiler(tile_size=512,stride=256) >>> image = torch.rand(size=(2, 3, 1024, 1024)) >>> image.shape torch.Size([2, 3, 1024, 1024]) >>> tiles = tiler.tile(image) >>> tiles.shape torch.Size([18, 3, 512, 512])
- Returns
Tiles generated from the image.
- untile(tiles: torch.Tensor) torch.Tensor¶
Untiles patches to reconstruct the original input image.
If patches, are overlapping patches, the function averages the overlapping pixels, and return the reconstructed image.
- Parameters
tiles – Tiles from the input image, generated via tile()..
Examples
>>> from anomalib.datasets.tiler import Tiler >>> tiler = Tiler(tile_size=512,stride=256) >>> image = torch.rand(size=(2, 3, 1024, 1024)) >>> image.shape torch.Size([2, 3, 1024, 1024]) >>> tiles = tiler.tile(image) >>> tiles.shape torch.Size([18, 3, 512, 512]) >>> reconstructed_image = tiler.untile(tiles) >>> reconstructed_image.shape torch.Size([2, 3, 1024, 1024]) >>> torch.equal(image, reconstructed_image) True
- Returns
Output that is the reconstructed version of the input tensor.