Files
icassp2027-experiment/third_party/EgoSpeak/LSTR/tools/generate_targets_epic_kitchen.py
T

81 lines
3.4 KiB
Python

import argparse
import numpy as np
import pandas as pd
import os.path as osp
def str2sec(string):
hh, mm, ss = string.split(':')
return float(hh) * 3600 + float(mm) * 60 + float(ss)
def main():
parser = argparse.ArgumentParser(description='Generate targets')
parser.add_argument('--dataset', type=str,
choices=['EK55', 'EK100'], default='EK55')
parser.add_argument('--data-path', type=str,
default='/scratch/cluster/yzhao/Datasets/EPIC-KITCHENS/')
parser.add_argument('--targets-path', type=str,
default='/scratch/cluster/yzhao/Datasets/'
'EPIC-KITCHENS/features/target_perframe/')
parser.add_argument('--fps', type=int, default=30)
parser.add_argument('--tick', type=float, default=7.5)
parser.add_argument('--anno-path', type=str,
default='external/rulstm/RULSTM/data/ek55/')
parser.add_argument('--class-type', type=str, default='action',
choices=['verb', 'noun', 'action'])
args = parser.parse_args()
# initialize the targets
targets = {}
if args.class_type == 'action':
num_classes = 2513 + 1
elif args.class_type == 'verb':
actions = pd.read_csv(osp.join(args.anno_path, 'actions.csv'))
a_to_v = {a[1]['id'] + 1: a[1]['verb'] + 1
for a in actions.iterrows()}
num_classes = max(a_to_v.values()) + 1
elif args.class_type == 'noun':
actions = pd.read_csv(osp.join(args.anno_path, 'actions.csv'))
a_to_n = {a[1]['id'] + 1: a[1]['noun'] + 1
for a in actions.iterrows()}
num_classes = max(a_to_n.values()) + 1
for subset in ['training', 'validation']:
vids = [line.strip() for line in open('{}/{}_videos.csv'.format(args.anno_path, subset))]
anno_per_video = {}
for line in open('{}/{}.csv'.format(args.anno_path, subset)):
idx, vid, f_start, f_end, c_verb, c_noun, c_verbnoun = line.strip().split(',')
vid = vid.strip()
if vid not in anno_per_video:
anno_per_video[vid] = [(int(f_start), int(f_end), int(c_verb), int(c_noun), int(c_verbnoun))]
else:
anno_per_video[vid].append((int(f_start), int(f_end), int(c_verb), int(c_noun), int(c_verbnoun)))
for vid in vids:
feature = np.load('{}/features/rgb_kinetics_resnet50/{}.npy'.format(args.data_path, vid))
feature_len = feature.shape[0]
targets[vid] = np.zeros((feature_len,
num_classes))
targets[vid][:, 0] = 1
for anno in anno_per_video[vid]:
print(vid, anno)
ss = int(np.floor(anno[0] / args.tick))
ee = min(int(np.ceil(anno[1] / args.tick)), feature_len)
if args.class_type == 'action':
ci = anno[4]
elif args.class_type == 'verb':
ci = anno[2]
elif args.class_type == 'noun':
ci = anno[3]
for si in range(ss, ee):
targets[vid][si, ci + 1] = 1
targets[vid][si, 0] = 0
print('Dumping npy files..')
for vid in targets:
np.save(args.targets_path + '{}.npy'.format(vid), targets[vid])
if __name__ == '__main__':
main()