import pandas as pd import numpy as np import os.path as osp import os import json import tqdm import argparse from generate_mots_format_files import save_seqinfo def parse_args(): parser = argparse.ArgumentParser() parser.add_argument('--motsynth-path', help="Directory path containing the 'annotations' directory with .json files") parser.add_argument('--save-path', help='Root file in which the new annoation files will be stored. If not provided, motsynth-root will be used') parser.add_argument('--save-dir', default='mot_annotations', help="name of directory within 'save-path'in which MOTS annotation files will be stored") args = parser.parse_args() if args.save_path is None: args.save_path = args.motsynth_path return args def main(args): ann_dir = osp.join(args.motsynth_path, 'annotations') mot_ann_dir = osp.join(args.save_path, args.save_dir) seqs = [f'{seq_num:03}' for seq_num in range(768) if seq_num not in (629, 757, 524, 652)] for seq in tqdm.tqdm(seqs): ann_path = osp.join(ann_dir, f'{seq}.json') with open(ann_path) as f: seq_ann = json.load(f) rows = [] img_id2frame = {im['id']: im['frame_n'] for im in seq_ann['images']} for ann in seq_ann['annotations']: # We compute the 3D location as the mid point between both feet keypoints in 3D kps = np.array(ann['keypoints_3d']).reshape(-1, 4) feet_pos_3d = kps[[-1, -4], :3].mean(axis = 0).round(4) row = {'frame': img_id2frame[ann['image_id']],# STARTS AT 0!!! 'id': ann['ped_id'], 'bb_left': ann['bbox'][0] + 1, # Make it 1-based?? 'bb_top': ann['bbox'][1] + 1, 'bb_width': ann['bbox'][2], 'bb_height': ann['bbox'][3], 'conf': 1 - ann['iscrowd'], 'class': 1 if ann['iscrowd'] == 0 else 8, # Class 8 means distractor. It is the one used by Trackeval as 'iscrowd' # We compute visibility as the proportion of visible keypoints 'vis': (np.array(ann['keypoints'])[2::3] ==2).mean().round(2), 'x': feet_pos_3d[0], 'y': feet_pos_3d[1], 'z': feet_pos_3d[2]} rows.append(row) # Save gt.txt file # Format in https://github.com/dendorferpatrick/MOTChallengeEvalKit/tree/master/MOT mot_ann = pd.DataFrame(rows, columns = ['frame', 'id', 'bb_left', 'bb_top', 'bb_width', 'bb_height', 'conf','class', 'vis', 'x', 'y', 'z']) gt_dir = osp.join(mot_ann_dir, seq, 'gt') os.makedirs(gt_dir, exist_ok=True) mot_ann.to_csv(osp.join(gt_dir, 'gt.txt'), header=None, index=None, sep=',') # Save seqinfo.ini seqinfo_path = osp.join(mot_ann_dir, seq, 'seqinfo.ini') save_seqinfo(seqinfo_path, info = seq_ann['info']) if __name__ =='__main__': args = parse_args() main(args)