__main__.py 5.8 KB

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