Source code for anomalib.utils.loggers.wandb

"""wandb logger with add image interface."""

# Copyright (C) 2020 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions
# and limitations under the License.

from typing import Any, List, Optional, Union

import numpy as np
from matplotlib.figure import Figure
from pytorch_lightning.loggers.wandb import WandbLogger
from pytorch_lightning.utilities import rank_zero_only

import wandb

from .base import ImageLoggerBase


[docs]class AnomalibWandbLogger(ImageLoggerBase, WandbLogger): """Logger for wandb. Adds interface for `add_image` in the logger rather than calling the experiment object. Note: Same as the wandb Logger provided by PyTorch Lightning and the doc string is reproduced below. Log using `Weights and Biases <https://www.wandb.com/>`_. Install it with pip: .. code-block:: bash $ pip install wandb Args: name: Display name for the run. save_dir: Path where data is saved (wandb dir by default). offline: Run offline (data can be streamed later to wandb servers). id: Sets the version, mainly used to resume a previous run. version: Same as id. anonymous: Enables or explicitly disables anonymous logging. project: The name of the project to which this run will belong. log_model: Save checkpoints in wandb dir to upload on W&B servers. prefix: A string to put at the beginning of metric keys. experiment: WandB experiment object. Automatically set when creating a run. **kwargs: Arguments passed to :func:`wandb.init` like `entity`, `group`, `tags`, etc. Raises: ImportError: If required WandB package is not installed on the device. MisconfigurationException: If both ``log_model`` and ``offline``is set to ``True``. Example: >>> from anomalib.utils.loggers import AnomalibWandbLogger >>> from pytorch_lightning import Trainer >>> wandb_logger = AnomalibWandbLogger() >>> trainer = Trainer(logger=wandb_logger) Note: When logging manually through `wandb.log` or `trainer.logger.experiment.log`, make sure to use `commit=False` so the logging step does not increase. See Also: - `Tutorial <https://colab.research.google.com/drive/16d1uctGaw2y9KhGBlINNTsWpmlXdJwRW?usp=sharing>`__ on how to use W&B with PyTorch Lightning - `W&B Documentation <https://docs.wandb.ai/integrations/lightning>`__ """ def __init__( self, name: Optional[str] = None, save_dir: Optional[str] = None, offline: Optional[bool] = False, id: Optional[str] = None, # kept to match wandb init pylint: disable=redefined-builtin anonymous: Optional[bool] = None, version: Optional[str] = None, project: Optional[str] = None, log_model: Union[str, bool] = False, experiment=None, prefix: Optional[str] = "", **kwargs ) -> None: super().__init__( name=name, save_dir=save_dir, offline=offline, id=id, anonymous=anonymous, version=version, project=project, log_model=log_model, experiment=experiment, prefix=prefix, **kwargs ) self.image_list: List[wandb.Image] = [] # Cache images @rank_zero_only
[docs] def add_image(self, image: Union[np.ndarray, Figure], name: Optional[str] = None, **kwargs: Any): """Interface to add image to wandb logger. Args: image (Union[np.ndarray, Figure]): Image to log name (Optional[str]): The tag of the image """ image = wandb.Image(image, caption=name) self.image_list.append(image)
@rank_zero_only
[docs] def save(self) -> None: """Upload images to wandb server. Note: There is a limit on the number of images that can be logged together to the `wandb` server. """ super().save() if len(self.image_list) > 1: wandb.log({"Predictions": self.image_list})