labelme2voc.py 4.8 KB

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