diff --git a/src/anomalib/callbacks/__init__.py b/src/anomalib/callbacks/__init__.py index 4603d19b28..eccc3cabc9 100644 --- a/src/anomalib/callbacks/__init__.py +++ b/src/anomalib/callbacks/__init__.py @@ -75,9 +75,4 @@ def get_callbacks(config: DictConfig | ListConfig | Namespace) -> list[Callback] ), ) - # Add callback to log graph to loggers - # TODO(ashwinvaidya17): Find location for log_graph key - # CVS-122658 - # if config.logging.log_graph not in (None, False): - return callbacks diff --git a/src/anomalib/callbacks/thresholding.py b/src/anomalib/callbacks/thresholding.py index 6f86316552..1a4d12febd 100644 --- a/src/anomalib/callbacks/thresholding.py +++ b/src/anomalib/callbacks/thresholding.py @@ -175,8 +175,6 @@ def _reset(self, pl_module: AnomalyModule) -> None: pl_module.pixel_threshold.reset() def _outputs_to_cpu(self, output: STEP_OUTPUT) -> STEP_OUTPUT | dict[str, Any]: - # TODO(ashwinvaidya17): This is duplicated in multiple trainer callbacks. - # CVS-122664 if isinstance(output, dict): for key, value in output.items(): output[key] = self._outputs_to_cpu(value) diff --git a/src/anomalib/cli/cli.py b/src/anomalib/cli/cli.py index 0a31e3840d..9fb8ba13f3 100644 --- a/src/anomalib/cli/cli.py +++ b/src/anomalib/cli/cli.py @@ -169,8 +169,6 @@ def add_arguments_to_parser(self, parser: ArgumentParser) -> None: ) parser.add_argument("--results_dir.unique", type=bool, help="Whether to create a unique folder.", default=False) parser.link_arguments("results_dir.path", "trainer.default_root_dir") - # TODO(ashwinvaidya17): Tiling should also be a category of its own - # CVS-122659 def add_trainer_arguments(self, parser: ArgumentParser, subcommand: str) -> None: """Add train arguments to the parser.""" diff --git a/src/anomalib/loggers/__init__.py b/src/anomalib/loggers/__init__.py index 2d35ed398c..3101312deb 100644 --- a/src/anomalib/loggers/__init__.py +++ b/src/anomalib/loggers/__init__.py @@ -5,10 +5,7 @@ import logging -from pathlib import Path -from omegaconf.dictconfig import DictConfig -from omegaconf.listconfig import ListConfig from rich.logging import RichHandler __all__ = [ @@ -17,11 +14,9 @@ ] try: - from lightning.pytorch.loggers import CSVLogger, Logger - - from .comet import AnomalibCometLogger - from .tensorboard import AnomalibTensorBoardLogger - from .wandb import AnomalibWandbLogger + from .comet import AnomalibCometLogger # noqa: F401 + from .tensorboard import AnomalibTensorBoardLogger # noqa: F401 + from .wandb import AnomalibWandbLogger # noqa: F401 __all__.extend( [ @@ -34,16 +29,6 @@ print("To use any logger install it using `anomalib install -v`") -AVAILABLE_LOGGERS = ["tensorboard", "wandb", "csv", "comet"] - - -logger = logging.getLogger(__name__) - - -class UnknownLoggerError(Exception): - """Raised when the logger option in `config.yaml` file is set incorrectly.""" - - def configure_logger(level: int | str = logging.INFO) -> None: """Get console logger by name. @@ -65,86 +50,3 @@ def configure_logger(level: int | str = logging.INFO) -> None: handler.setFormatter(logging.Formatter(format_string)) handler.setLevel(level) logging.getLogger("lightning.pytorch").addHandler(RichHandler(rich_tracebacks=True)) - - -def get_experiment_logger( - config: DictConfig | ListConfig, -) -> list | bool: - """Return a logger based on the choice of logger in the config file. - - Args: - config (DictConfig): config.yaml file for the corresponding anomalib model. - - Raises: - ValueError: for any logger types apart from false and tensorboard - - Returns: - list[Logger] | bool: Logger - """ - logger.info("Loading the experiment logger(s)") - - if "logger" not in config.trainer or config.trainer.logger in (None, False): - return False - - logger_list: list[Logger] = [] - if isinstance(config.trainer.logger, str): - config.trainer.logger = [config.trainer.logger] - - for experiment_logger in config.trainer.logger: - if experiment_logger == "tensorboard": - logger_list.append( - AnomalibTensorBoardLogger( - name="Tensorboard Logs", - save_dir=str(Path(config.project.path) / "logs"), - # TODO(ashwinvaidya17): Find location for log_graph key - # CVS-122658 - log_graph=False, - ), - ) - elif experiment_logger == "wandb": - wandb_logdir = str(Path(config.project.path) / "logs") - Path(wandb_logdir).mkdir(parents=True, exist_ok=True) - name = ( - config.model.class_path.split(".")[-1] - if "category" not in config.data.init_args - else f"{config.data.init_args.category} {config.model.class_path.split('.')[-1]}" - ) - logger_list.append( - AnomalibWandbLogger( - project=config.data.class_path.split(".")[-1], - name=name, - save_dir=wandb_logdir, - ), - ) - elif experiment_logger == "comet": - comet_logdir = str(Path(config.project.path) / "logs") - Path(comet_logdir).mkdir(parents=True, exist_ok=True) - run_name = ( - config.model.name - if "category" not in config.data.init_args - else f"{config.data.init_args.category} {config.model.class_path.split('.')[-1]}" - ) - logger_list.append( - AnomalibCometLogger( - project_name=config.data.class_path.split(".")[-1], - experiment_name=run_name, - save_dir=comet_logdir, - ), - ) - elif experiment_logger == "csv": - logger_list.append(CSVLogger(save_dir=Path(config.project.path) / "logs")) - else: - msg = ( - f"Unknown logger type: {config.trainer.logger}. Available loggers are: {AVAILABLE_LOGGERS}.\n" - "To enable the logger, set `project.logger` to `true` or use one of available loggers in " - "config.yaml\nTo disable the logger, set `project.logger` to `false`." - ) - raise UnknownLoggerError( - msg, - ) - - # TODO(ashwinvaidya17): Remove this method and set these values in ``update_config`` - # CVS-122657 - del config.trainer.logger - - return logger_list diff --git a/src/anomalib/utils/config.py b/src/anomalib/utils/config.py index 43b610ed72..b39cdd4603 100644 --- a/src/anomalib/utils/config.py +++ b/src/anomalib/utils/config.py @@ -3,9 +3,6 @@ # Copyright (C) 2022-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -# TODO(ashwinvaidya17): This would require a new design. -# https://jira.devtools.intel.com/browse/IAAALD-149 - import inspect import logging diff --git a/tests/unit/loggers/__init__.py b/tests/unit/loggers/__init__.py deleted file mode 100644 index 62623dcb3a..0000000000 --- a/tests/unit/loggers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Test supported loggers.""" - -# Copyright (C) 2022-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/unit/loggers/test_get_logger.py b/tests/unit/loggers/test_get_logger.py deleted file mode 100644 index 6285d407c8..0000000000 --- a/tests/unit/loggers/test_get_logger.py +++ /dev/null @@ -1,102 +0,0 @@ -"""Tests to ascertain requested logger.""" - -# Copyright (C) 2022-2024 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -from pathlib import Path -from unittest.mock import MagicMock, patch - -import pytest -from omegaconf import OmegaConf - -try: - from wandb import init # noqa: F401 - - wandb_installed = True -except ImportError: - wandb_installed = False - -if wandb_installed: - with patch("wandb.init"): - from lightning.pytorch.loggers import CSVLogger - - from anomalib.loggers import ( - AnomalibCometLogger, - AnomalibTensorBoardLogger, - AnomalibWandbLogger, - UnknownLoggerError, - get_experiment_logger, - ) -else: - from lightning.pytorch.loggers import CSVLogger - - from anomalib.loggers import ( - AnomalibCometLogger, - AnomalibTensorBoardLogger, - AnomalibWandbLogger, - UnknownLoggerError, - get_experiment_logger, - ) - - -def test_get_experiment_logger(tmp_path: Path) -> None: - """Test whether the right logger is returned.""" - config = OmegaConf.create( - { - "project": {"path": tmp_path}, - "data": {"class_path": "dummy", "init_args": {"category": "cat1"}}, - "model": {"class_path": "DummyModel"}, - "trainer": {"logger": None, "default_root_dir": tmp_path}, - }, - ) - with ( - # Patch Anomalib WandB logger - patch("anomalib.loggers.wandb.AnomalibWandbLogger.experiment"), - # Patch WandB logger objects. - patch("wandb.Artifact", MagicMock()), - patch("wandb.sdk.lib.RunDisabled", MagicMock()), - patch("wandb.wandb_run.Run", MagicMock()), - # Patch Comet ML logger objects. - patch("comet_ml.ExistingExperiment", MagicMock()), - patch("comet_ml.Experiment", MagicMock()), - patch("comet_ml.OfflineExperiment", MagicMock()), - ): - # get no logger - logger = get_experiment_logger(config=config) - assert isinstance(logger, bool) - config.trainer.logger = False - logger = get_experiment_logger(config=config) - assert isinstance(logger, bool) - - # get tensorboard - config.trainer.logger = "tensorboard" - logger = get_experiment_logger(config=config) - assert isinstance(logger[0], AnomalibTensorBoardLogger) - - # get wandb logger - config.trainer.logger = "wandb" - logger = get_experiment_logger(config=config) - assert isinstance(logger[0], AnomalibWandbLogger) - - # get comet logger - config.trainer.logger = "comet" - logger = get_experiment_logger(config=config) - assert isinstance(logger[0], AnomalibCometLogger) - - # get csv logger. - config.trainer.logger = "csv" - logger = get_experiment_logger(config=config) - assert isinstance(logger[0], CSVLogger) - - # get multiple loggers - config.trainer.logger = ["tensorboard", "wandb", "csv", "comet"] - logger = get_experiment_logger(config=config) - assert isinstance(logger[0], AnomalibTensorBoardLogger) - assert isinstance(logger[1], AnomalibWandbLogger) - assert isinstance(logger[2], CSVLogger) - assert isinstance(logger[3], AnomalibCometLogger) - - # raise unknown - config.trainer.logger = "randomlogger" - with pytest.raises(UnknownLoggerError): - logger = get_experiment_logger(config=config)