json_to_dataset.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import argparse
  2. import json
  3. import os
  4. import os.path as osp
  5. import warnings
  6. import matplotlib
  7. matplotlib.use('Agg')
  8. import numpy as np
  9. import PIL.Image
  10. import yaml
  11. from labelme import utils
  12. def main():
  13. warnings.warn("This script is aimed to demonstrate how to convert the\n"
  14. "JSON file to a single image dataset, and not to handle\n"
  15. "multiple JSON files to generate a real-use dataset.")
  16. parser = argparse.ArgumentParser()
  17. parser.add_argument('json_file')
  18. parser.add_argument('-o', '--out', default=None)
  19. args = parser.parse_args()
  20. json_file = args.json_file
  21. if args.out is None:
  22. out_dir = osp.basename(json_file).replace('.', '_')
  23. out_dir = osp.join(osp.dirname(json_file), out_dir)
  24. else:
  25. out_dir = args.out
  26. if not osp.exists(out_dir):
  27. os.mkdir(out_dir)
  28. data = json.load(open(json_file))
  29. img = utils.img_b64_to_array(data['imageData'])
  30. lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
  31. captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
  32. lbl_viz = utils.draw_label(lbl, img, captions)
  33. PIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))
  34. PIL.Image.fromarray(lbl).save(osp.join(out_dir, 'label.png'))
  35. PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
  36. with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
  37. for lbl_name in lbl_names:
  38. f.write(lbl_name + '\n')
  39. warnings.warn('info.yaml is being replaced by label_names.txt')
  40. info = dict(label_names=lbl_names)
  41. with open(osp.join(out_dir, 'info.yaml'), 'w') as f:
  42. yaml.safe_dump(info, f, default_flow_style=False)
  43. print('Saved to: %s' % out_dir)
  44. if __name__ == '__main__':
  45. main()