oguzakif's picture
init repo
d4b77ac
# --------------------------------------------------------
# SiamMask
# Licensed under The MIT License
# Written by Qiang Wang (wangqiang2015 at ia.ac.cn)
# --------------------------------------------------------
from os.path import join
from os import listdir
import json
import numpy as np
print('load json (raw vid info), please wait 20 seconds~')
vid = json.load(open('vid.json', 'r'))
def check_size(frame_sz, bbox):
min_ratio = 0.1
max_ratio = 0.75
# only accept objects >10% and <75% of the total frame
area_ratio = np.sqrt((bbox[2]-bbox[0])*(bbox[3]-bbox[1])/float(np.prod(frame_sz)))
ok = (area_ratio > min_ratio) and (area_ratio < max_ratio)
return ok
def check_borders(frame_sz, bbox):
dist_from_border = 0.05 * (bbox[2] - bbox[0] + bbox[3] - bbox[1])/2
ok = (bbox[0] > dist_from_border) and (bbox[1] > dist_from_border) and \
((frame_sz[0] - bbox[2]) > dist_from_border) and \
((frame_sz[1] - bbox[3]) > dist_from_border)
return ok
snippets = dict()
n_snippets = 0
n_videos = 0
for subset in vid:
for video in subset:
n_videos += 1
frames = video['frame']
id_set = []
id_frames = [[]] * 60 # at most 60 objects
for f, frame in enumerate(frames):
objs = frame['objs']
frame_sz = frame['frame_sz']
for obj in objs:
trackid = obj['trackid']
occluded = obj['occ']
bbox = obj['bbox']
# if occluded:
# continue
#
# if not(check_size(frame_sz, bbox) and check_borders(frame_sz, bbox)):
# continue
#
# if obj['c'] in ['n01674464', 'n01726692', 'n04468005', 'n02062744']:
# continue
if trackid not in id_set:
id_set.append(trackid)
id_frames[trackid] = []
id_frames[trackid].append(f)
if len(id_set) > 0:
snippets[video['base_path']] = dict()
for selected in id_set:
frame_ids = sorted(id_frames[selected])
sequences = np.split(frame_ids, np.array(np.where(np.diff(frame_ids) > 1)[0]) + 1)
sequences = [s for s in sequences if len(s) > 1] # remove isolated frame.
for seq in sequences:
snippet = dict()
for frame_id in seq:
frame = frames[frame_id]
for obj in frame['objs']:
if obj['trackid'] == selected:
o = obj
continue
snippet[frame['img_path'].split('.')[0]] = o['bbox']
snippets[video['base_path']]['{:02d}'.format(selected)] = snippet
n_snippets += 1
print('video: {:d} snippets_num: {:d}'.format(n_videos, n_snippets))
train = {k:v for (k,v) in snippets.items() if 'train' in k}
val = {k:v for (k,v) in snippets.items() if 'val' in k}
json.dump(train, open('train.json', 'w'), indent=4, sort_keys=True)
json.dump(val, open('val.json', 'w'), indent=4, sort_keys=True)
print('done!')