labelme_json_to_dataset 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/env python
  2. import argparse
  3. import json
  4. import os
  5. import os.path as osp
  6. import warnings
  7. import numpy as np
  8. import PIL.Image
  9. import yaml
  10. from labelme import utils
  11. def main():
  12. parser = argparse.ArgumentParser()
  13. parser.add_argument('json_file')
  14. parser.add_argument('-o', '--out', default=None)
  15. args = parser.parse_args()
  16. json_file = args.json_file
  17. if args.out is None:
  18. out_dir = osp.basename(json_file).replace('.', '_')
  19. out_dir = osp.join(osp.dirname(json_file), out_dir)
  20. else:
  21. out_dir = args.out
  22. if not osp.exists(out_dir):
  23. os.mkdir(out_dir)
  24. data = json.load(open(json_file))
  25. img = utils.img_b64_to_array(data['imageData'])
  26. lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
  27. captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
  28. lbl_viz = utils.draw_label(lbl, img, captions)
  29. PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
  30. PIL.Image.fromarray(lbl).save(osp.join(out_dir, 'label.png'))
  31. PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
  32. with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
  33. for lbl_name in lbl_names:
  34. f.write(lbl_name + '\n')
  35. warnings.warn('info.yaml is being replaced by label_names.txt')
  36. info = dict(label_names=lbl_names)
  37. with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
  38. yaml.safe_dump(info, f, default_flow_style=False)
  39. print('Saved to: %s' % out_dir)
  40. if __name__ == '__main__':
  41. main()