"""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.fromtypingimportAny,List,Optional,Unionimportnumpyasnpfrommatplotlib.figureimportFigurefrompytorch_lightning.loggers.wandbimportWandbLoggerfrompytorch_lightning.utilitiesimportrank_zero_onlyimportwandbfrom.baseimportImageLoggerBase
[docs]classAnomalibWandbLogger(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-builtinanonymous: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]defadd_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]defsave(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()iflen(self.image_list)>1:wandb.log({"Predictions":self.image_list})self.image_list=[]