__init__.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import os
  2. import os.path as osp
  3. import yaml
  4. from labelme import logger
  5. here = osp.dirname(osp.abspath(__file__))
  6. def update_dict(target_dict, new_dict, validate_item=None):
  7. for key, value in new_dict.items():
  8. if validate_item:
  9. validate_item(key, value)
  10. if key not in target_dict:
  11. logger.warn('Skipping unexpected key in config: {}'
  12. .format(key))
  13. continue
  14. if isinstance(target_dict[key], dict) and \
  15. isinstance(value, dict):
  16. update_dict(target_dict[key], value, validate_item=validate_item)
  17. else:
  18. target_dict[key] = value
  19. # -----------------------------------------------------------------------------
  20. def get_default_config():
  21. config_file = osp.join(here, 'default_config.yaml')
  22. with open(config_file) as f:
  23. config = yaml.load(f)
  24. return config
  25. def validate_config_item(key, value):
  26. if key == 'validate_label' and value not in [None, 'exact', 'instance']:
  27. raise ValueError('Unexpected value `{}` for key `{}`'
  28. .format(value, key))
  29. def get_config(config_from_args=None, config_file=None):
  30. # default config
  31. config = get_default_config()
  32. if config_from_args is not None:
  33. update_dict(config, config_from_args,
  34. validate_item=validate_config_item)
  35. save_config_file = False
  36. if config_file is None:
  37. home = os.path.expanduser('~')
  38. config_file = os.path.join(home, '.labelmerc')
  39. save_config_file = True
  40. if os.path.exists(config_file):
  41. with open(config_file) as f:
  42. user_config = yaml.load(f) or {}
  43. update_dict(config, user_config, validate_item=validate_config_item)
  44. if save_config_file:
  45. try:
  46. with open(config_file, 'w') as f:
  47. yaml.safe_dump(config, f, default_flow_style=False)
  48. except Exception:
  49. logger.warn('Failed to save config: {}'.format(config_file))
  50. return config