labelme2voc.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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("--labels", help="labels file", required=True)
  18. parser.add_argument(
  19. "--noviz", help="no visualization", action="store_true"
  20. )
  21. args = parser.parse_args()
  22. if osp.exists(args.output_dir):
  23. print("Output directory already exists:", args.output_dir)
  24. sys.exit(1)
  25. os.makedirs(args.output_dir)
  26. os.makedirs(osp.join(args.output_dir, "JPEGImages"))
  27. os.makedirs(osp.join(args.output_dir, "SegmentationClass"))
  28. os.makedirs(osp.join(args.output_dir, "SegmentationClassPNG"))
  29. if not args.noviz:
  30. os.makedirs(
  31. osp.join(args.output_dir, "SegmentationClassVisualization")
  32. )
  33. print("Creating dataset:", args.output_dir)
  34. class_names = []
  35. class_name_to_id = {}
  36. for i, line in enumerate(open(args.labels).readlines()):
  37. class_id = i - 1 # starts with -1
  38. class_name = line.strip()
  39. class_name_to_id[class_name] = class_id
  40. if class_id == -1:
  41. assert class_name == "__ignore__"
  42. continue
  43. elif class_id == 0:
  44. assert class_name == "_background_"
  45. class_names.append(class_name)
  46. class_names = tuple(class_names)
  47. print("class_names:", class_names)
  48. out_class_names_file = osp.join(args.output_dir, "class_names.txt")
  49. with open(out_class_names_file, "w") as f:
  50. f.writelines("\n".join(class_names))
  51. print("Saved class_names:", out_class_names_file)
  52. for filename in glob.glob(osp.join(args.input_dir, "*.json")):
  53. print("Generating dataset from:", filename)
  54. label_file = labelme.LabelFile(filename=filename)
  55. base = osp.splitext(osp.basename(filename))[0]
  56. out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")
  57. out_lbl_file = osp.join(
  58. args.output_dir, "SegmentationClass", base + ".npy"
  59. )
  60. out_png_file = osp.join(
  61. args.output_dir, "SegmentationClassPNG", base + ".png"
  62. )
  63. if not args.noviz:
  64. out_viz_file = osp.join(
  65. args.output_dir,
  66. "SegmentationClassVisualization",
  67. base + ".jpg",
  68. )
  69. with open(out_img_file, "wb") as f:
  70. f.write(label_file.imageData)
  71. img = labelme.utils.img_data_to_arr(label_file.imageData)
  72. lbl, _ = labelme.utils.shapes_to_label(
  73. img_shape=img.shape,
  74. shapes=label_file.shapes,
  75. label_name_to_value=class_name_to_id,
  76. )
  77. labelme.utils.lblsave(out_png_file, lbl)
  78. np.save(out_lbl_file, lbl)
  79. if not args.noviz:
  80. viz = imgviz.label2rgb(
  81. label=lbl,
  82. img=imgviz.rgb2gray(img),
  83. font_size=15,
  84. label_names=class_names,
  85. loc="rb",
  86. )
  87. imgviz.io.imsave(out_viz_file, viz)
  88. if __name__ == "__main__":
  89. main()