# -------------------------------------------------------- # SiamMask # Licensed under The MIT License # Written by Qiang Wang (wangqiang2015 at ia.ac.cn) # -------------------------------------------------------- from os.path import join, realpath, dirname, exists, isdir from os import listdir import logging import glob import numpy as np import json from collections import OrderedDict def get_dataset_zoo(): root = realpath(join(dirname(__file__), '../data')) zoos = listdir(root) def valid(x): y = join(root, x) if not isdir(y): return False return exists(join(y, 'list.txt')) \ or exists(join(y, 'train', 'meta.json')) \ or exists(join(y, 'ImageSets', '2016', 'val.txt')) \ or exists(join(y, 'ImageSets', '2017', 'test-dev.txt')) zoos = list(filter(valid, zoos)) return zoos dataset_zoo = get_dataset_zoo() def load_dataset(dataset): info = OrderedDict() if 'VOT' in dataset: base_path = join(realpath(dirname(__file__)), '../data', dataset) if not exists(base_path): logging.error("Please download test dataset!!!") exit() list_path = join(base_path, 'list.txt') with open(list_path) as f: videos = [v.strip() for v in f.readlines()] for video in videos: video_path = join(base_path, video) image_path = join(video_path, '*.jpg') image_files = sorted(glob.glob(image_path)) if len(image_files) == 0: # VOT2018 image_path = join(video_path, 'color', '*.jpg') image_files = sorted(glob.glob(image_path)) gt_path = join(video_path, 'groundtruth.txt') gt = np.loadtxt(gt_path, delimiter=',').astype(np.float64) if gt.shape[1] == 4: gt = np.column_stack((gt[:, 0], gt[:, 1], gt[:, 0], gt[:, 1] + gt[:, 3]-1, gt[:, 0] + gt[:, 2]-1, gt[:, 1] + gt[:, 3]-1, gt[:, 0] + gt[:, 2]-1, gt[:, 1])) info[video] = {'image_files': image_files, 'gt': gt, 'name': video} elif 'DAVIS' in dataset and 'TEST' not in dataset: base_path = join(realpath(dirname(__file__)), '../data', 'DAVIS') list_path = join(realpath(dirname(__file__)), '../data', 'DAVIS', 'ImageSets', dataset[-4:], 'val.txt') with open(list_path) as f: videos = [v.strip() for v in f.readlines()] for video in videos: info[video] = {} info[video]['anno_files'] = sorted(glob.glob(join(base_path, 'Annotations/480p', video, '*.png'))) info[video]['image_files'] = sorted(glob.glob(join(base_path, 'JPEGImages/480p', video, '*.jpg'))) info[video]['name'] = video elif 'ytb_vos' in dataset: base_path = join(realpath(dirname(__file__)), '../data', 'ytb_vos', 'valid') json_path = join(realpath(dirname(__file__)), '../data', 'ytb_vos', 'valid', 'meta.json') meta = json.load(open(json_path, 'r')) meta = meta['videos'] info = dict() for v in meta.keys(): objects = meta[v]['objects'] frames = [] anno_frames = [] info[v] = dict() for obj in objects: frames += objects[obj]['frames'] anno_frames += [objects[obj]['frames'][0]] frames = sorted(np.unique(frames)) info[v]['anno_files'] = [join(base_path, 'Annotations', v, im_f+'.png') for im_f in frames] info[v]['anno_init_files'] = [join(base_path, 'Annotations', v, im_f + '.png') for im_f in anno_frames] info[v]['image_files'] = [join(base_path, 'JPEGImages', v, im_f+'.jpg') for im_f in frames] info[v]['name'] = v info[v]['start_frame'] = dict() info[v]['end_frame'] = dict() for obj in objects: start_file = objects[obj]['frames'][0] end_file = objects[obj]['frames'][-1] info[v]['start_frame'][obj] = frames.index(start_file) info[v]['end_frame'][obj] = frames.index(end_file) elif 'TEST' in dataset: base_path = join(realpath(dirname(__file__)), '../data', 'DAVIS2017TEST') list_path = join(realpath(dirname(__file__)), '../data', 'DAVIS2017TEST', 'ImageSets', '2017', 'test-dev.txt') with open(list_path) as f: videos = [v.strip() for v in f.readlines()] for video in videos: info[video] = {} info[video]['anno_files'] = sorted(glob.glob(join(base_path, 'Annotations/480p', video, '*.png'))) info[video]['image_files'] = sorted(glob.glob(join(base_path, 'JPEGImages/480p', video, '*.jpg'))) info[video]['name'] = video else: logging.error('Not support') exit() return info