"""Get configurable parameters."""# Copyright (C) 2022 Intel Corporation# SPDX-License-Identifier: Apache-2.0# TODO: This would require a new design.# TODO: https://jira.devtools.intel.com/browse/IAAALD-149frompathlibimportPathfromtypingimportList,Optional,UnionfromwarningsimportwarnfromomegaconfimportDictConfig,ListConfig,OmegaConf
[docs]defupdate_input_size_config(config:Union[DictConfig,ListConfig])->Union[DictConfig,ListConfig]:"""Update config with image size as tuple, effective input size and tiling stride. Convert integer image size parameters into tuples, calculate the effective input size based on image size and crop size, and set tiling stride if undefined. Args: config (Union[DictConfig, ListConfig]): Configurable parameters object Returns: Union[DictConfig, ListConfig]: Configurable parameters with updated values """# handle image sizeifisinstance(config.dataset.image_size,int):config.dataset.image_size=(config.dataset.image_size,)*2config.model.input_size=config.dataset.image_sizeif"tiling"inconfig.dataset.keys()andconfig.dataset.tiling.apply:ifisinstance(config.dataset.tiling.tile_size,int):config.dataset.tiling.tile_size=(config.dataset.tiling.tile_size,)*2ifconfig.dataset.tiling.strideisNone:config.dataset.tiling.stride=config.dataset.tiling.tile_sizereturnconfig
[docs]defupdate_nncf_config(config:Union[DictConfig,ListConfig])->Union[DictConfig,ListConfig]:"""Set the NNCF input size based on the value of the crop_size parameter in the configurable parameters object. Args: config (Union[DictConfig, ListConfig]): Configurable parameters of the current run. Returns: Union[DictConfig, ListConfig]: Updated configurable parameters in DictConfig object. """crop_size=config.dataset.image_sizesample_size=(crop_size,crop_size)ifisinstance(crop_size,int)elsecrop_sizeif"optimization"inconfig.keys():if"nncf"inconfig.optimization.keys():if"input_info"notinconfig.optimization.nncf.keys():config.optimization.nncf["input_info"]={"sample_size":None}config.optimization.nncf.input_info.sample_size=[1,3,*sample_size]ifconfig.optimization.nncf.apply:if"update_config"inconfig.optimization.nncf:returnOmegaConf.merge(config,config.optimization.nncf.update_config)returnconfig
[docs]defupdate_multi_gpu_training_config(config:Union[DictConfig,ListConfig])->Union[DictConfig,ListConfig]:"""Updates the config to change learning rate based on number of gpus assigned. Current behaviour is to ensure only ddp accelerator is used. Args: config (Union[DictConfig, ListConfig]): Configurable parameters for the current run Raises: ValueError: If unsupported accelerator is passed Returns: Union[DictConfig, ListConfig]: Updated config """# validate acceleratorifconfig.trainer.acceleratorisnotNone:ifconfig.trainer.accelerator.lower()!="ddp":ifconfig.trainer.accelerator.lower()in("dp","ddp_spawn","ddp2"):warn(f"Using accelerator {config.trainer.accelerator.lower()} is discouraged. "f"Please use one of [null, ddp]. Setting accelerator to ddp")config.trainer.accelerator="ddp"else:raiseValueError(f"Unsupported accelerator found: {config.trainer.accelerator}. Should be one of [null, ddp]")# Increase learning rate# since pytorch averages the gradient over devices, the idea is to# increase the learning rate by the number of devicesif"lr"inconfig.model:# Number of GPUs can either be passed as gpus: 2 or gpus: [0,1]n_gpus:Union[int,List]=1if"trainer"inconfigand"gpus"inconfig.trainer:n_gpus=config.trainer.gpuslr_scaler=n_gpusifisinstance(n_gpus,int)elselen(n_gpus)config.model.lr=config.model.lr*lr_scalerreturnconfig
[docs]defget_configurable_parameters(model_name:Optional[str]=None,config_path:Optional[Union[Path,str]]=None,weight_file:Optional[str]=None,config_filename:Optional[str]="config",config_file_extension:Optional[str]="yaml",)->Union[DictConfig,ListConfig]:"""Get configurable parameters. Args: model_name: Optional[str]: (Default value = None) config_path: Optional[Union[Path, str]]: (Default value = None) weight_file: Path to the weight file config_filename: Optional[str]: (Default value = "config") config_file_extension: Optional[str]: (Default value = "yaml") Returns: Union[DictConfig, ListConfig]: Configurable parameters in DictConfig object. """ifmodel_nameisNoneandconfig_pathisNone:raiseValueError("Both model_name and model config path cannot be None! ""Please provide a model name or path to a config file!")ifconfig_pathisNone:config_path=Path(f"anomalib/models/{model_name}/{config_filename}.{config_file_extension}")config=OmegaConf.load(config_path)# Dataset Configsif"format"notinconfig.dataset.keys():config.dataset.format="mvtec"config=update_input_size_config(config)# Project Configsproject_path=Path(config.project.path)/config.model.name/config.dataset.nameifconfig.dataset.format.lower()in("btech","mvtec"):project_path=project_path/config.dataset.category(project_path/"weights").mkdir(parents=True,exist_ok=True)(project_path/"images").mkdir(parents=True,exist_ok=True)config.project.path=str(project_path)# loggers should write to results/model/dataset/category/ folderconfig.trainer.default_root_dir=str(project_path)ifweight_file:config.trainer.resume_from_checkpoint=weight_fileconfig=update_nncf_config(config)# thresholdingif"metrics"inconfig.keys():if"pixel_default"notinconfig.metrics.threshold.keys():config.metrics.threshold.pixel_default=config.metrics.threshold.image_defaultreturnconfig