main.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import argparse
  2. import codecs
  3. import logging
  4. import os
  5. import os.path as osp
  6. import sys
  7. import yaml
  8. from qtpy import QtCore
  9. from qtpy import QtWidgets
  10. from labelme import __appname__
  11. from labelme import __version__
  12. from labelme.app import MainWindow
  13. from labelme.config import get_config
  14. from labelme.logger import logger
  15. from labelme.utils import newIcon
  16. def main():
  17. parser = argparse.ArgumentParser()
  18. parser.add_argument(
  19. '--version', '-V', action='store_true', help='show version'
  20. )
  21. parser.add_argument(
  22. '--reset-config', action='store_true', help='reset qt config'
  23. )
  24. parser.add_argument(
  25. '--logger-level',
  26. default='info',
  27. choices=['debug', 'info', 'warning', 'fatal', 'error'],
  28. help='logger level',
  29. )
  30. parser.add_argument('filename', nargs='?', help='image or label filename')
  31. parser.add_argument(
  32. '--output',
  33. '-O',
  34. '-o',
  35. help='output file or directory (if it ends with .json it is '
  36. 'recognized as file, else as directory)'
  37. )
  38. default_config_file = os.path.join(os.path.expanduser('~'), '.labelmerc')
  39. parser.add_argument(
  40. '--config',
  41. dest='config_file',
  42. help='config file (default: %s)' % default_config_file,
  43. default=default_config_file,
  44. )
  45. # config for the gui
  46. parser.add_argument(
  47. '--nodata',
  48. dest='store_data',
  49. action='store_false',
  50. help='stop storing image data to JSON file',
  51. default=argparse.SUPPRESS,
  52. )
  53. parser.add_argument(
  54. '--autosave',
  55. dest='auto_save',
  56. action='store_true',
  57. help='auto save',
  58. default=argparse.SUPPRESS,
  59. )
  60. parser.add_argument(
  61. '--nosortlabels',
  62. dest='sort_labels',
  63. action='store_false',
  64. help='stop sorting labels',
  65. default=argparse.SUPPRESS,
  66. )
  67. parser.add_argument(
  68. '--flags',
  69. help='comma separated list of flags OR file containing flags',
  70. default=argparse.SUPPRESS,
  71. )
  72. parser.add_argument(
  73. '--labelflags',
  74. dest='label_flags',
  75. help='yaml string of label specific flags OR file containing json '
  76. 'string of label specific flags (ex. {person-\d+: [male, tall], '
  77. 'dog-\d+: [black, brown, white], .*: [occluded]})',
  78. default=argparse.SUPPRESS,
  79. )
  80. parser.add_argument(
  81. '--labels',
  82. help='comma separated list of labels OR file containing labels',
  83. default=argparse.SUPPRESS,
  84. )
  85. parser.add_argument(
  86. '--validatelabel',
  87. dest='validate_label',
  88. choices=['exact', 'instance'],
  89. help='label validation types',
  90. default=argparse.SUPPRESS,
  91. )
  92. parser.add_argument(
  93. '--keep-prev',
  94. action='store_true',
  95. help='keep annotation of previous frame',
  96. default=argparse.SUPPRESS,
  97. )
  98. parser.add_argument(
  99. '--epsilon',
  100. type=float,
  101. help='epsilon to find nearest vertex on canvas',
  102. default=argparse.SUPPRESS,
  103. )
  104. args = parser.parse_args()
  105. if args.version:
  106. print('{0} {1}'.format(__appname__, __version__))
  107. sys.exit(0)
  108. logger.setLevel(getattr(logging, args.logger_level.upper()))
  109. if hasattr(args, 'flags'):
  110. if os.path.isfile(args.flags):
  111. with codecs.open(args.flags, 'r', encoding='utf-8') as f:
  112. args.flags = [l.strip() for l in f if l.strip()]
  113. else:
  114. args.flags = [l for l in args.flags.split(',') if l]
  115. if hasattr(args, 'labels'):
  116. if os.path.isfile(args.labels):
  117. with codecs.open(args.labels, 'r', encoding='utf-8') as f:
  118. args.labels = [l.strip() for l in f if l.strip()]
  119. else:
  120. args.labels = [l for l in args.labels.split(',') if l]
  121. if hasattr(args, 'label_flags'):
  122. if os.path.isfile(args.label_flags):
  123. with codecs.open(args.label_flags, 'r', encoding='utf-8') as f:
  124. args.label_flags = yaml.load(f)
  125. else:
  126. args.label_flags = yaml.load(args.label_flags)
  127. config_from_args = args.__dict__
  128. config_from_args.pop('version')
  129. reset_config = config_from_args.pop('reset_config')
  130. filename = config_from_args.pop('filename')
  131. output = config_from_args.pop('output')
  132. config_file = config_from_args.pop('config_file')
  133. config = get_config(config_from_args, config_file)
  134. if not config['labels'] and config['validate_label']:
  135. logger.error('--labels must be specified with --validatelabel or '
  136. 'validate_label: true in the config file '
  137. '(ex. ~/.labelmerc).')
  138. sys.exit(1)
  139. output_file = None
  140. output_dir = None
  141. if output is not None:
  142. if output.endswith('.json'):
  143. output_file = output
  144. else:
  145. output_dir = output
  146. translator = QtCore.QTranslator()
  147. translator.load(
  148. QtCore.QLocale.system().name(),
  149. osp.dirname(osp.abspath(__file__)) + '/translate'
  150. )
  151. app = QtWidgets.QApplication(sys.argv)
  152. app.setApplicationName(__appname__)
  153. app.setWindowIcon(newIcon('icon'))
  154. app.installTranslator(translator)
  155. win = MainWindow(
  156. config=config,
  157. filename=filename,
  158. output_file=output_file,
  159. output_dir=output_dir,
  160. )
  161. if reset_config:
  162. logger.info('Resetting Qt config: %s' % win.settings.fileName())
  163. win.settings.clear()
  164. sys.exit(0)
  165. win.show()
  166. win.raise_()
  167. sys.exit(app.exec_())
  168. # this main block is required to generate executable by pyinstaller
  169. if __name__ == '__main__':
  170. main()