Spaces:
Build error
Build error
""" | |
TODOs: | |
- argparse | |
- List sequences by number | |
- Get rid of asserts | |
""" | |
import pandas as pd | |
import os.path as osp | |
import os | |
import json | |
import configparser | |
import tqdm | |
import argparse | |
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='mots_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 save_seqinfo(seqinfo_path, info): | |
seqinfo = configparser.ConfigParser() | |
seqinfo.optionxform = str # Otherwise capital letters are ignored in keys | |
seqinfo['Sequence'] = dict(name=info['seq_name'], | |
frameRate=info['fps'], | |
seqLength=info['sequence_length'], | |
imWidth= info['img_width'], | |
imHeight= info['img_height'], | |
weather=info['weather'], | |
time=info['time'], | |
isNight=info['is_night'], | |
isMoving=info['is_moving'], | |
FOV=info['cam_fov'], | |
imExt='.jpg', | |
fx=1158, | |
fy=1158, | |
cx=960, | |
cy=540) | |
with open(seqinfo_path, 'w') as configfile: # save | |
seqinfo.write(configfile, space_around_delimiters=False) | |
def main(args): | |
ann_dir = osp.join(args.motsynth_path, 'annotations') | |
mots_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']: | |
assert ann['category_id'] == 1 | |
if ann['area']: # Include only objects with non-empty masks | |
if not ann['iscrowd']: | |
mots_id = 2000 + ann['ped_id'] | |
else: # ID = 10000 means that the instance should be ignored during eval. | |
mots_id = 10000 | |
row = {'time_frame': img_id2frame[ann['image_id']],# STARTS AT 0!!! | |
'id': mots_id, | |
'class_id': 2, | |
'img_height': ann['segmentation']['size'][0], | |
'img_width': ann['segmentation']['size'][1], | |
'rle': ann['segmentation']['counts']} | |
rows.append(row) | |
# Save gt.txt file | |
# Format in https://www.vision.rwth-aachen.de/page/mots | |
mots_ann = pd.DataFrame(rows, columns = ['time_frame', 'id', 'class_id', 'img_height', 'img_width', 'rle']) | |
gt_dir = osp.join(mots_ann_dir, seq, 'gt') | |
os.makedirs(gt_dir, exist_ok=True) | |
mots_ann.to_csv(osp.join(gt_dir, 'gt.txt'), header=None, index=None, sep=' ') | |
# Save seqinfo.ini | |
seqinfo_path = osp.join(mots_ann_dir, seq, 'seqinfo.ini') | |
save_seqinfo(seqinfo_path, info = seq_ann['info']) | |
if __name__ =='__main__': | |
args = parse_args() | |
main(args) |