12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import os.path as osp
- import shutil
- import yaml
- from labelme.logger import logger
- here = osp.dirname(osp.abspath(__file__))
- def update_dict(target_dict, new_dict, validate_item=None):
- for key, value in new_dict.items():
- if validate_item:
- validate_item(key, value)
- if key not in target_dict:
- logger.warn('Skipping unexpected key in config: {}'
- .format(key))
- continue
- if isinstance(target_dict[key], dict) and \
- isinstance(value, dict):
- update_dict(target_dict[key], value, validate_item=validate_item)
- else:
- target_dict[key] = value
- # -----------------------------------------------------------------------------
- def get_default_config():
- config_file = osp.join(here, 'default_config.yaml')
- with open(config_file) as f:
- config = yaml.safe_load(f)
- # save default config to ~/.labelmerc
- user_config_file = osp.join(osp.expanduser('~'), '.labelmerc')
- if not osp.exists(user_config_file):
- try:
- shutil.copy(config_file, user_config_file)
- except Exception:
- logger.warn('Failed to save config: {}'.format(user_config_file))
- return config
- def validate_config_item(key, value):
- if key == 'validate_label' and value not in [None, 'exact', 'instance']:
- raise ValueError(
- "Unexpected value for config key 'validate_label': {}"
- .format(value)
- )
- if key == 'labels' and value is not None and len(value) != len(set(value)):
- raise ValueError(
- "Duplicates are detected for config key 'labels': {}".format(value)
- )
- def get_config(config_from_args=None, config_file=None):
- # Configuration load order:
- #
- # 1. default config (lowest priority)
- # 2. config file passed by command line argument or ~/.labelmerc
- # 3. command line argument (highest priority)
- # 1. default config
- config = get_default_config()
- # 2. config from yaml file
- if config_file is not None and osp.exists(config_file):
- with open(config_file) as f:
- user_config = yaml.safe_load(f) or {}
- update_dict(config, user_config, validate_item=validate_config_item)
- # 3. command line argument
- if config_from_args is not None:
- update_dict(config, config_from_args,
- validate_item=validate_config_item)
- return config
|