Source code for anomalib.models.fastflow.anomaly_map
"""FastFlow Anomaly Map Generator Implementation."""
# Copyright (C) 2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
from typing import List, Tuple, Union
import torch
import torch.nn.functional as F
from omegaconf import ListConfig
from torch import Tensor
[docs]class AnomalyMapGenerator:
"""Generate Anomaly Heatmap."""
def __init__(self, input_size: Union[ListConfig, Tuple]):
self.input_size = input_size if isinstance(input_size, tuple) else tuple(input_size)
[docs] def __call__(self, hidden_variables: List[Tensor]) -> Tensor:
"""Generate Anomaly Heatmap.
This implementation generates the heatmap based on the flow maps
computed from the normalizing flow (NF) FastFlow blocks. Each block
yields a flow map, which overall is stacked and averaged to an anomaly
map.
Args:
hidden_variables (List[Tensor]): List of hidden variables from each NF FastFlow block.
Returns:
Tensor: Anomaly Map.
"""
flow_maps: List[Tensor] = []
for hidden_variable in hidden_variables:
log_prob = -torch.mean(hidden_variable**2, dim=1, keepdim=True) * 0.5
prob = torch.exp(log_prob)
flow_map = F.interpolate(
input=-prob,
size=self.input_size,
mode="bilinear",
align_corners=False,
)
flow_maps.append(flow_map)
flow_maps = torch.stack(flow_maps, dim=-1)
anomaly_map = torch.mean(flow_maps, dim=-1)
return anomaly_map