convert_crowdhuman_to_coco.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import os
  2. import numpy as np
  3. import json
  4. from PIL import Image
  5. import argparse
  6. def parse_args():
  7. parser = argparse.ArgumentParser(description='YOLO-Tutorial')
  8. # dataset
  9. parser.add_argument('--root', default='/mnt/share/ssd2/dataset/CrowdHuman/',
  10. help='data root')
  11. return parser.parse_args()
  12. def load_func(fpath):
  13. print('fpath', fpath)
  14. assert os.path.exists(fpath)
  15. with open(fpath,'r') as fid:
  16. lines = fid.readlines()
  17. records =[json.loads(line.strip('\n')) for line in lines]
  18. return records
  19. if __name__ == '__main__':
  20. args = parse_args()
  21. DATA_PATH = args.root
  22. OUT_PATH = DATA_PATH + 'annotations/'
  23. SPLITS = ['val', 'train']
  24. DEBUG = False
  25. if not os.path.exists(OUT_PATH):
  26. os.mkdir(OUT_PATH)
  27. for split in SPLITS:
  28. data_path = DATA_PATH + split
  29. out_path = OUT_PATH + '{}.json'.format(split)
  30. out = {'images': [], 'annotations': [], 'categories': [{'id': 1, 'name': 'person'}]}
  31. ann_path = DATA_PATH + 'annotation_{}.odgt'.format(split)
  32. anns_data = load_func(ann_path)
  33. image_cnt = 0
  34. ann_cnt = 0
  35. video_cnt = 0
  36. for ann_data in anns_data:
  37. image_cnt += 1
  38. file_path = DATA_PATH + 'CrowdHuman_{}/'.format(split) + 'Images/' + '{}.jpg'.format(ann_data['ID'])
  39. im = Image.open(file_path)
  40. image_info = {'file_name': '{}.jpg'.format(ann_data['ID']),
  41. 'id': image_cnt,
  42. 'height': im.size[1],
  43. 'width': im.size[0]}
  44. out['images'].append(image_info)
  45. if split != 'test':
  46. anns = ann_data['gtboxes']
  47. for i in range(len(anns)):
  48. ann_cnt += 1
  49. fbox = anns[i]['fbox']
  50. ann = {'id': ann_cnt,
  51. 'category_id': 1,
  52. 'image_id': image_cnt,
  53. 'track_id': -1,
  54. 'bbox_vis': anns[i]['vbox'],
  55. 'bbox': fbox,
  56. 'area': fbox[2] * fbox[3],
  57. 'iscrowd': 1 if 'extra' in anns[i] and \
  58. 'ignore' in anns[i]['extra'] and \
  59. anns[i]['extra']['ignore'] == 1 else 0}
  60. out['annotations'].append(ann)
  61. print('loaded {} for {} images and {} samples'.format(split, len(out['images']), len(out['annotations'])))
  62. json.dump(out, open(out_path, 'w'))