labelme2voc.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #!/usr/bin/env python
  2. from __future__ import print_function
  3. import argparse
  4. import glob
  5. import os
  6. import os.path as osp
  7. import sys
  8. import imgviz
  9. import numpy as np
  10. import labelme
  11. def main():
  12. parser = argparse.ArgumentParser(
  13. formatter_class=argparse.ArgumentDefaultsHelpFormatter
  14. )
  15. parser.add_argument("input_dir", help="Input annotated directory")
  16. parser.add_argument("output_dir", help="Output dataset directory")
  17. parser.add_argument(
  18. "--labels", help="Labels file or comma separated text", required=True
  19. )
  20. parser.add_argument(
  21. "--noobject", help="Flag not to generate object label", action="store_true"
  22. )
  23. parser.add_argument(
  24. "--nonpy", help="Flag not to generate .npy files", action="store_true"
  25. )
  26. parser.add_argument(
  27. "--noviz", help="Flag to disable visualization", action="store_true"
  28. )
  29. args = parser.parse_args()
  30. if osp.exists(args.output_dir):
  31. print("Output directory already exists:", args.output_dir)
  32. sys.exit(1)
  33. os.makedirs(args.output_dir)
  34. os.makedirs(osp.join(args.output_dir, "JPEGImages"))
  35. os.makedirs(osp.join(args.output_dir, "SegmentationClass"))
  36. if not args.nonpy:
  37. os.makedirs(osp.join(args.output_dir, "SegmentationClassNpy"))
  38. if not args.noviz:
  39. os.makedirs(osp.join(args.output_dir, "SegmentationClassVisualization"))
  40. if not args.noobject:
  41. os.makedirs(osp.join(args.output_dir, "SegmentationObject"))
  42. if not args.nonpy:
  43. os.makedirs(osp.join(args.output_dir, "SegmentationObjectNpy"))
  44. if not args.noviz:
  45. os.makedirs(osp.join(args.output_dir, "SegmentationObjectVisualization"))
  46. print("Creating dataset:", args.output_dir)
  47. if osp.exists(args.labels):
  48. with open(args.labels) as f:
  49. labels = [label.strip() for label in f if label]
  50. else:
  51. labels = [label.strip() for label in args.labels.split(",")]
  52. class_names = []
  53. class_name_to_id = {}
  54. for i, label in enumerate(labels):
  55. class_id = i - 1 # starts with -1
  56. class_name = label.strip()
  57. class_name_to_id[class_name] = class_id
  58. if class_id == -1:
  59. assert class_name == "__ignore__"
  60. continue
  61. elif class_id == 0:
  62. assert class_name == "_background_"
  63. class_names.append(class_name)
  64. class_names = tuple(class_names)
  65. print("class_names:", class_names)
  66. out_class_names_file = osp.join(args.output_dir, "class_names.txt")
  67. with open(out_class_names_file, "w") as f:
  68. f.writelines("\n".join(class_names))
  69. print("Saved class_names:", out_class_names_file)
  70. for filename in sorted(glob.glob(osp.join(args.input_dir, "*.json"))):
  71. print("Generating dataset from:", filename)
  72. label_file = labelme.LabelFile(filename=filename)
  73. base = osp.splitext(osp.basename(filename))[0]
  74. out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")
  75. out_clsp_file = osp.join(args.output_dir, "SegmentationClass", base + ".png")
  76. if not args.nonpy:
  77. out_cls_file = osp.join(
  78. args.output_dir, "SegmentationClassNpy", base + ".npy"
  79. )
  80. if not args.noviz:
  81. out_clsv_file = osp.join(
  82. args.output_dir,
  83. "SegmentationClassVisualization",
  84. base + ".jpg",
  85. )
  86. if not args.noobject:
  87. out_insp_file = osp.join(
  88. args.output_dir, "SegmentationObject", base + ".png"
  89. )
  90. if not args.nonpy:
  91. out_ins_file = osp.join(
  92. args.output_dir, "SegmentationObjectNpy", base + ".npy"
  93. )
  94. if not args.noviz:
  95. out_insv_file = osp.join(
  96. args.output_dir,
  97. "SegmentationObjectVisualization",
  98. base + ".jpg",
  99. )
  100. img = labelme.utils.img_data_to_arr(label_file.imageData)
  101. imgviz.io.imsave(out_img_file, img)
  102. cls, ins = labelme.utils.shapes_to_label(
  103. img_shape=img.shape,
  104. shapes=label_file.shapes,
  105. label_name_to_value=class_name_to_id,
  106. )
  107. ins[cls == -1] = 0 # ignore it.
  108. # class label
  109. labelme.utils.lblsave(out_clsp_file, cls)
  110. if not args.nonpy:
  111. np.save(out_cls_file, cls)
  112. if not args.noviz:
  113. clsv = imgviz.label2rgb(
  114. cls,
  115. imgviz.rgb2gray(img),
  116. label_names=class_names,
  117. font_size=15,
  118. loc="rb",
  119. )
  120. imgviz.io.imsave(out_clsv_file, clsv)
  121. if not args.noobject:
  122. # instance label
  123. labelme.utils.lblsave(out_insp_file, ins)
  124. if not args.nonpy:
  125. np.save(out_ins_file, ins)
  126. if not args.noviz:
  127. instance_ids = np.unique(ins)
  128. instance_names = [str(i) for i in range(max(instance_ids) + 1)]
  129. insv = imgviz.label2rgb(
  130. ins,
  131. imgviz.rgb2gray(img),
  132. label_names=instance_names,
  133. font_size=15,
  134. loc="rb",
  135. )
  136. imgviz.io.imsave(out_insv_file, insv)
  137. if __name__ == "__main__":
  138. main()