From 9bf7e49feee51c2bcf69373cb8ee97f0ebea2573 Mon Sep 17 00:00:00 2001 From: Dick Ameln Date: Mon, 19 Dec 2022 17:01:27 +0100 Subject: [PATCH 1/3] enable none as split mode --- anomalib/config/config.py | 16 ++++++++++++++++ anomalib/data/base/datamodule.py | 7 ++++--- tools/train.py | 7 ++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/anomalib/config/config.py b/anomalib/config/config.py index 1c52e141ba..ceccbc4024 100644 --- a/anomalib/config/config.py +++ b/anomalib/config/config.py @@ -14,6 +14,8 @@ from omegaconf import DictConfig, ListConfig, OmegaConf +from anomalib.data.utils import TestSplitMode, ValSplitMode + def _get_now_str(timestamp: float) -> str: """Standard format for datetimes is defined here.""" @@ -180,6 +182,20 @@ def update_datasets_config(config: Union[DictConfig, ListConfig]) -> Union[DictC ) ) config.dataset.normal_split_ratio = config.dataset.split_ratio + + if config.dataset.test_split_mode == TestSplitMode.NONE and config.dataset.val_split_mode in [ + ValSplitMode.SAME_AS_TEST, + ValSplitMode.FROM_TEST, + ]: + warn( + f"val_split_mode {config.dataset.val_split_mode} not allowed for test_split_mode = 'none'. " + "Setting val_split_mode to 'none'." + ) + config.dataset.val_split_mode = ValSplitMode.NONE + + if config.dataset.val_split_mode == ValSplitMode.NONE and config.trainer.limit_val_batches != 0.0: + warn("Running without validation set. Setting trainer.limit_val_batches to 0.") + config.trainer.limit_val_batches = 0.0 return config diff --git a/anomalib/data/base/datamodule.py b/anomalib/data/base/datamodule.py index 5870ab56ea..c79d6855c3 100644 --- a/anomalib/data/base/datamodule.py +++ b/anomalib/data/base/datamodule.py @@ -120,8 +120,9 @@ def _create_test_split(self): if self.test_data.has_normal: # split the test data into normal and anomalous so these can be processed separately normal_test_data, self.test_data = split_by_label(self.test_data) - else: - # when the user did not provide any normal images for testing, we sample some from the training set + elif self.test_split_mode != TestSplitMode.NONE: + # when the user did not provide any normal images for testing, we sample some from the training set, + # except when the user explicitly requested no test splitting. logger.info( "No normal test images found. Sampling from training set using a split ratio of %d", self.test_split_ratio, @@ -132,7 +133,7 @@ def _create_test_split(self): self.test_data += normal_test_data elif self.test_split_mode == TestSplitMode.SYNTHETIC: self.test_data = SyntheticAnomalyDataset.from_dataset(normal_test_data) - else: + elif self.test_split_mode != TestSplitMode.NONE: raise ValueError(f"Unsupported Test Split Mode: {self.test_split_mode}") def _create_val_split(self): diff --git a/tools/train.py b/tools/train.py index 4326415ad2..3df5c25296 100644 --- a/tools/train.py +++ b/tools/train.py @@ -16,6 +16,7 @@ from anomalib.config import get_configurable_parameters from anomalib.data import get_datamodule +from anomalib.data.utils import TestSplitMode from anomalib.models import get_model from anomalib.utils.callbacks import LoadModelCallback, get_callbacks from anomalib.utils.loggers import configure_logger, get_experiment_logger @@ -63,11 +64,11 @@ def train(): load_model_callback = LoadModelCallback(weights_path=trainer.checkpoint_callback.best_model_path) trainer.callbacks.insert(0, load_model_callback) - if len(datamodule.test_data) != 0: + if config.dataset.test_split_mode == TestSplitMode.NONE: + logger.info("No test set provided. Skipping test stage.") + else: logger.info("Testing the model.") trainer.test(model=model, datamodule=datamodule) - else: - logger.info("No anomalous images found in dataset. Skipping test stage.") if __name__ == "__main__": From 9a17d7e01e4e2a8c6011f74a5b53c82826ab38c6 Mon Sep 17 00:00:00 2001 From: Dick Ameln Date: Tue, 20 Dec 2022 08:43:37 +0100 Subject: [PATCH 2/3] use get to retrieve config keys --- anomalib/config/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/anomalib/config/config.py b/anomalib/config/config.py index ceccbc4024..4af2feb85c 100644 --- a/anomalib/config/config.py +++ b/anomalib/config/config.py @@ -183,7 +183,7 @@ def update_datasets_config(config: Union[DictConfig, ListConfig]) -> Union[DictC ) config.dataset.normal_split_ratio = config.dataset.split_ratio - if config.dataset.test_split_mode == TestSplitMode.NONE and config.dataset.val_split_mode in [ + if config.dataset.get("test_split_mode") == TestSplitMode.NONE and config.dataset.get("val_split_mode") in [ ValSplitMode.SAME_AS_TEST, ValSplitMode.FROM_TEST, ]: @@ -193,7 +193,7 @@ def update_datasets_config(config: Union[DictConfig, ListConfig]) -> Union[DictC ) config.dataset.val_split_mode = ValSplitMode.NONE - if config.dataset.val_split_mode == ValSplitMode.NONE and config.trainer.limit_val_batches != 0.0: + if config.dataset.get("val_split_mode") == ValSplitMode.NONE and config.trainer.limit_val_batches != 0.0: warn("Running without validation set. Setting trainer.limit_val_batches to 0.") config.trainer.limit_val_batches = 0.0 return config From 21b9d9afcfbcae5b540fc6b252d7118fee4a020d Mon Sep 17 00:00:00 2001 From: Dick Ameln Date: Tue, 20 Dec 2022 08:49:32 +0100 Subject: [PATCH 3/3] update deprecation message and config key --- anomalib/config/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/anomalib/config/config.py b/anomalib/config/config.py index 4af2feb85c..6f521f5490 100644 --- a/anomalib/config/config.py +++ b/anomalib/config/config.py @@ -178,10 +178,10 @@ def update_datasets_config(config: Union[DictConfig, ListConfig]) -> Union[DictC warn( DeprecationWarning( "The 'split_ratio' parameter is deprecated and will be removed in a future release. Please use " - "'normal_split_ratio' instead." + "'test_split_ratio' instead." ) ) - config.dataset.normal_split_ratio = config.dataset.split_ratio + config.dataset.test_split_ratio = config.dataset.split_ratio if config.dataset.get("test_split_mode") == TestSplitMode.NONE and config.dataset.get("val_split_mode") in [ ValSplitMode.SAME_AS_TEST,