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"]: raise ValueError( "Unexpected value for config key 'validate_label': {}".format( value ) ) if key == "shape_color" and value not in [None, "auto", "manual"]: raise ValueError( "Unexpected value for config key 'shape_color': {}".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_file_or_yaml=None, config_from_args=None): # 1. default config config = get_default_config() # 2. specified as file or yaml if config_file_or_yaml is not None: config_from_yaml = yaml.safe_load(config_file_or_yaml) if not isinstance(config_from_yaml, dict): with open(config_from_yaml) as f: logger.info( "Loading config file from: {}".format(config_from_yaml) ) config_from_yaml = yaml.safe_load(f) update_dict( config, config_from_yaml, validate_item=validate_config_item ) # 3. command line argument or specified config file if config_from_args is not None: update_dict( config, config_from_args, validate_item=validate_config_item ) return config