rawalkhirodkar's picture
Add initial commit
28c256d
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
import argparse
import json
import os
import os.path as osp
from collections import defaultdict
import mmengine
from PIL import Image
from tqdm import tqdm
def parse_args():
parser = argparse.ArgumentParser(
description='CrowdHuman to COCO Video format')
parser.add_argument(
'-i',
'--input',
help='root directory of CrowdHuman annotations',
)
parser.add_argument(
'-o',
'--output',
help='directory to save coco formatted label file',
)
return parser.parse_args()
def load_odgt(filename):
with open(filename, 'r') as f:
lines = f.readlines()
data_infos = [json.loads(line.strip('\n')) for line in lines]
return data_infos
def convert_crowdhuman(ann_dir, save_dir, mode='train'):
"""Convert CrowdHuman dataset in COCO style.
Args:
ann_dir (str): The path of CrowdHuman dataset.
save_dir (str): The path to save annotation files.
mode (str): Convert train dataset or validation dataset. Options are
'train', 'val'. Default: 'train'.
"""
assert mode in ['train', 'val']
records = dict(img_id=1, ann_id=1)
outputs = defaultdict(list)
outputs['categories'] = [dict(id=1, name='pedestrian')]
data_infos = load_odgt(osp.join(ann_dir, f'annotation_{mode}.odgt'))
for data_info in tqdm(data_infos):
img_name = osp.join('Images', f"{data_info['ID']}.jpg")
img = Image.open(osp.join(ann_dir, mode, img_name))
width, height = img.size[:2]
image = dict(
file_name=img_name,
height=height,
width=width,
id=records['img_id'])
outputs['images'].append(image)
if mode != 'test':
for ann_info in data_info['gtboxes']:
bbox = ann_info['fbox']
if 'extra' in ann_info and 'ignore' in ann_info[
'extra'] and ann_info['extra']['ignore'] == 1:
iscrowd = True
else:
iscrowd = False
ann = dict(
id=records['ann_id'],
image_id=records['img_id'],
category_id=outputs['categories'][0]['id'],
vis_bbox=ann_info['vbox'],
bbox=bbox,
area=bbox[2] * bbox[3],
iscrowd=iscrowd)
outputs['annotations'].append(ann)
records['ann_id'] += 1
records['img_id'] += 1
if not osp.isdir(save_dir):
os.makedirs(save_dir)
mmengine.dump(outputs, osp.join(save_dir, f'crowdhuman_{mode}.json'))
print(f'-----CrowdHuman {mode} set------')
print(f'total {records["img_id"] - 1} images')
if mode != 'test':
print(f'{records["ann_id"] - 1} pedestrians are annotated.')
print('-----------------------')
def main():
args = parse_args()
convert_crowdhuman(args.input, args.output, mode='train')
convert_crowdhuman(args.input, args.output, mode='val')
if __name__ == '__main__':
main()