crowdhuman2coco.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # Copyright (c) OpenMMLab. All rights reserved.
  2. import argparse
  3. import json
  4. import os
  5. import os.path as osp
  6. from collections import defaultdict
  7. import mmengine
  8. from PIL import Image
  9. from tqdm import tqdm
  10. def parse_args():
  11. parser = argparse.ArgumentParser(
  12. description='CrowdHuman to COCO Video format')
  13. parser.add_argument(
  14. '-i',
  15. '--input',
  16. help='root directory of CrowdHuman annotations',
  17. )
  18. parser.add_argument(
  19. '-o',
  20. '--output',
  21. help='directory to save coco formatted label file',
  22. )
  23. return parser.parse_args()
  24. def load_odgt(filename):
  25. with open(filename, 'r') as f:
  26. lines = f.readlines()
  27. data_infos = [json.loads(line.strip('\n')) for line in lines]
  28. return data_infos
  29. def convert_crowdhuman(ann_dir, save_dir, mode='train'):
  30. """Convert CrowdHuman dataset in COCO style.
  31. Args:
  32. ann_dir (str): The path of CrowdHuman dataset.
  33. save_dir (str): The path to save annotation files.
  34. mode (str): Convert train dataset or validation dataset. Options are
  35. 'train', 'val'. Default: 'train'.
  36. """
  37. assert mode in ['train', 'val']
  38. records = dict(img_id=1, ann_id=1)
  39. outputs = defaultdict(list)
  40. outputs['categories'] = [dict(id=1, name='pedestrian')]
  41. data_infos = load_odgt(osp.join(ann_dir, f'annotation_{mode}.odgt'))
  42. for data_info in tqdm(data_infos):
  43. img_name = osp.join('Images', f"{data_info['ID']}.jpg")
  44. img = Image.open(osp.join(ann_dir, mode, img_name))
  45. width, height = img.size[:2]
  46. image = dict(
  47. file_name=img_name,
  48. height=height,
  49. width=width,
  50. id=records['img_id'])
  51. outputs['images'].append(image)
  52. if mode != 'test':
  53. for ann_info in data_info['gtboxes']:
  54. bbox = ann_info['fbox']
  55. if 'extra' in ann_info and 'ignore' in ann_info[
  56. 'extra'] and ann_info['extra']['ignore'] == 1:
  57. iscrowd = True
  58. else:
  59. iscrowd = False
  60. ann = dict(
  61. id=records['ann_id'],
  62. image_id=records['img_id'],
  63. category_id=outputs['categories'][0]['id'],
  64. vis_bbox=ann_info['vbox'],
  65. bbox=bbox,
  66. area=bbox[2] * bbox[3],
  67. iscrowd=iscrowd)
  68. outputs['annotations'].append(ann)
  69. records['ann_id'] += 1
  70. records['img_id'] += 1
  71. if not osp.isdir(save_dir):
  72. os.makedirs(save_dir)
  73. mmengine.dump(outputs, osp.join(save_dir, f'crowdhuman_{mode}.json'))
  74. print(f'-----CrowdHuman {mode} set------')
  75. print(f'total {records["img_id"] - 1} images')
  76. if mode != 'test':
  77. print(f'{records["ann_id"] - 1} pedestrians are annotated.')
  78. print('-----------------------')
  79. def main():
  80. args = parse_args()
  81. convert_crowdhuman(args.input, args.output, mode='train')
  82. convert_crowdhuman(args.input, args.output, mode='val')
  83. if __name__ == '__main__':
  84. main()