-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathtimelens_data.py
More file actions
executable file
·102 lines (80 loc) · 3.42 KB
/
timelens_data.py
File metadata and controls
executable file
·102 lines (80 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Copyright (c) 2025 Jun Zhang. Licensed under the BSD-3-Clause License.
import json
import os
import re
def parse_query(query):
"Clean and normalize a text query by removing unnecessary whitespace and trailing periods"
return re.sub(r"\s+", " ", query).strip().strip(".").strip()
class ActivitynetTimeLensDataset:
ANNO_PATH_TEST = "data/TimeLens-Bench/activitynet-timelens.json"
VIDEO_ROOT = "data/TimeLens-Bench/videos/activitynet"
DATASET_SOURCE = "ActivityNet-TimeLens"
@classmethod
def load_annos(cls, split="test"):
assert split == "test", f"Invalid split: {split}"
with open(cls.ANNO_PATH_TEST, "r") as f:
raw_annos = json.load(f)
annos = []
for vid, raw_anno in raw_annos.items():
video_path = os.path.join(cls.VIDEO_ROOT, vid + ".mp4")
# if not os.path.exists(video_path):
# raise FileNotFoundError(f"Video path does not exist: {video_path}")
for span, query in zip(raw_anno["spans"], raw_anno["queries"]):
anno = dict(
source=cls.DATASET_SOURCE,
data_type="grounding",
video_path=video_path,
duration=raw_anno["duration"],
query=parse_query(query),
span=[span],
)
annos.append(anno)
return annos
class QVHighlightsTimeLensDataset(ActivitynetTimeLensDataset):
ANNO_PATH_TEST = "data/TimeLens-Bench/qvhighlights-timelens.json"
VIDEO_ROOT = "data/TimeLens-Bench/videos/qvhighlights"
DATASET_SOURCE = "QVHighlights-TimeLens"
class CharadesTimeLensDataset(ActivitynetTimeLensDataset):
ANNO_PATH_TEST = "data/TimeLens-Bench/charades-timelens.json"
VIDEO_ROOT = "data/TimeLens-Bench/videos/charades"
DATASET_SOURCE = "Charades-TimeLens"
class TimeLens100KDataset:
ANNO_PATH_TRAIN = "data/TimeLens-100K/timelens-100k.jsonl"
VIDEO_ROOT = "data/TimeLens-100K/videos"
@classmethod
def load_annos(self, split="train"):
assert split == "train", f"Invalid split: {split}"
raw_anno = []
with open(self.ANNO_PATH_TRAIN, "r", encoding="utf-8") as f:
for line in f:
data = json.loads(line)
raw_anno.append(data)
annos = []
for raw_anno in raw_anno:
video_path = os.path.join(self.VIDEO_ROOT, raw_anno["video_path"])
# if not os.path.exists(video_path):
# raise FileNotFoundError(f"Video path does not exist: {video_path}")
for event in raw_anno["events"]:
query = parse_query(event["query"])
span = event["span"]
anno = dict(
source=raw_anno["source"],
data_type="grounding",
video_path=video_path,
duration=raw_anno["duration"],
query=query,
span=span,
)
annos.append(anno)
return annos
DATASET_DICT = {
"activitynet-timelens": ActivitynetTimeLensDataset,
"qvhighlights-timelens": QVHighlightsTimeLensDataset,
"charades-timelens": CharadesTimeLensDataset,
"timelens-100k": TimeLens100KDataset,
}
if __name__ == "__main__":
# Example usage
DATASET_NAME = "timelens-100k"
annos = DATASET_DICT[DATASET_NAME].load_annos()
print(f"Loaded {len(annos)} annotations from {DATASET_NAME}")