Browse Source

Create __init__.py

LaraStuStu 5 years ago
parent
commit
61314e594c
1 changed files with 79 additions and 0 deletions
  1. 79 0
      DataAnnotation/labelme/labelme/config/__init__.py

+ 79 - 0
DataAnnotation/labelme/labelme/config/__init__.py

@@ -0,0 +1,79 @@
+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