Youngsun Lim commited on
Commit
f543cdc
·
1 Parent(s): 93a6e21
Files changed (8) hide show
  1. README.md +4 -5
  2. app.py +1018 -0
  3. make_json.py +105 -0
  4. make_my_repo_dataset.py +279 -0
  5. requirements.txt +3 -0
  6. test.py +21 -0
  7. upload_videos_toHF.py +53 -0
  8. videos.json +1502 -0
README.md CHANGED
@@ -1,13 +1,12 @@
1
  ---
2
- title: Video Eval
3
  emoji: 👁
4
- colorFrom: pink
5
- colorTo: gray
6
  sdk: gradio
7
- sdk_version: 5.49.1
8
  app_file: app.py
9
  pinned: false
10
- short_description: 'Human Evaluation: Action Consistency & Physical Plausibility'
11
  ---
12
 
13
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: Videoeval Humaneval
3
  emoji: 👁
4
+ colorFrom: gray
5
+ colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 5.47.2
8
  app_file: app.py
9
  pinned: false
 
10
  ---
11
 
12
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,1018 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os, io, csv, json, random
2
+ from datetime import datetime
3
+ import gradio as gr
4
+ from huggingface_hub import HfApi, hf_hub_download
5
+
6
+ import subprocess, pathlib, hashlib
7
+
8
+ import secrets, time, string
9
+
10
+
11
+ # 사용자가 '선택'을 완료한 값 (초기엔 None)
12
+ selected_action = gr.State(None)
13
+ selected_phys = gr.State(None)
14
+
15
+ def _recompute_save(pid_text: str, sel_a, sel_p):
16
+ ok = bool(pid_text and pid_text.strip()) and (sel_a is not None) and (sel_p is not None)
17
+ return gr.update(interactive=ok, variant=("primary" if ok else "secondary"))
18
+
19
+
20
+ REWARD_FILE = "reward_codes.csv" # 리워드 코드 기록용 파일 (HF dataset 안에 저장)
21
+ def _read_codes_bytes():
22
+ try:
23
+ p = hf_hub_download(
24
+ repo_id=REPO_ID, filename=REWARD_FILE, repo_type="dataset",
25
+ token=HF_TOKEN, local_dir="/tmp", local_dir_use_symlinks=False
26
+ )
27
+ return open(p, "rb").read()
28
+ except Exception:
29
+ return None
30
+
31
+ def _append_code(old_bytes, row):
32
+ s = io.StringIO()
33
+ w = csv.writer(s)
34
+ if not old_bytes:
35
+ # 새 헤더
36
+ w.writerow(["ts_iso", "participant_id", "reward_code", "total_done"])
37
+ else:
38
+ s.write(old_bytes.decode("utf-8", errors="ignore"))
39
+ w.writerow(row)
40
+ return s.getvalue().encode("utf-8")
41
+
42
+ def _persist_reward_code(pid: str, code: str, total_done: int):
43
+ """리워드 코드를 HF에 reward_codes.csv로 누적 저장(append)."""
44
+ old = _read_codes_bytes()
45
+ row = [datetime.utcnow().isoformat(), pid.strip(), code, int(total_done)]
46
+ newb = _append_code(old, row)
47
+ api.upload_file(
48
+ path_or_fileobj=io.BytesIO(newb),
49
+ path_in_repo=REWARD_FILE,
50
+ repo_id=REPO_ID,
51
+ repo_type="dataset",
52
+ token=HF_TOKEN,
53
+ commit_message="append reward code"
54
+ )
55
+
56
+ def _gen_reward_code(pid: str, length: int = 10, forbid_ambiguous: bool=True) -> str:
57
+ """
58
+ 참가자에게 보여줄 랜덤 코드. 충돌 위험 매우 낮음.
59
+ - PID + 시각 + 보안랜덤으로 시드
60
+ - 대문자/숫자 조합
61
+ """
62
+ alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" if forbid_ambiguous else string.ascii_uppercase + string.digits
63
+ # secrets 기반 난수 + pid/time 섞어서 해시 비슷한 효과
64
+ rnd = secrets.token_hex(8) + pid + str(time.time_ns())
65
+ # 섞고 뽑기
66
+ rng = secrets.SystemRandom()
67
+ return "".join(rng.choice(alphabet) for _ in range(length))
68
+
69
+
70
+
71
+
72
+ MUTED_CACHE_DIR = "/tmp/hf_video_cache_muted"
73
+ pathlib.Path(MUTED_CACHE_DIR).mkdir(parents=True, exist_ok=True)
74
+
75
+ def _sha1_8(s: str) -> str:
76
+ return hashlib.sha1(s.encode("utf-8")).hexdigest()[:8]
77
+
78
+ def ensure_muted_copy(src_path: str) -> str:
79
+ """
80
+ 주어진 mp4에서 오디오 트랙을 제거(-an)한 무음 복사본을 캐시에 생성.
81
+ 이미 있으면 그 파일 경로 반환.
82
+ 실패하면 원본 경로 반환.
83
+ """
84
+ if not src_path or not os.path.exists(src_path):
85
+ return src_path
86
+ out = os.path.join(MUTED_CACHE_DIR, _sha1_8(src_path) + ".mp4")
87
+ if os.path.exists(out):
88
+ return out
89
+ try:
90
+ subprocess.run(
91
+ ["ffmpeg", "-y", "-i", src_path, "-c:v", "copy", "-an", out],
92
+ stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=True
93
+ )
94
+ return out if os.path.exists(out) else src_path
95
+ except Exception:
96
+ return src_path
97
+
98
+
99
+ FEEDBACK_FILE = "final_feedback.csv"
100
+
101
+ def _read_feedback_bytes():
102
+ try:
103
+ p = hf_hub_download(
104
+ repo_id=REPO_ID, filename=FEEDBACK_FILE, repo_type="dataset",
105
+ token=HF_TOKEN, local_dir="/tmp", local_dir_use_symlinks=False
106
+ )
107
+ return open(p, "rb").read()
108
+ except Exception:
109
+ return None
110
+
111
+ def _append_feedback(old_bytes, row):
112
+ s = io.StringIO()
113
+ w = csv.writer(s)
114
+ if not old_bytes:
115
+ # 최종 코멘트 전용 CSV 헤더
116
+ w.writerow(["ts_iso", "participant_id", "final_comment"])
117
+ else:
118
+ s.write(old_bytes.decode("utf-8", errors="ignore"))
119
+ w.writerow(row)
120
+ return s.getvalue().encode("utf-8")
121
+
122
+ def push_final_feedback(participant_id: str, comment: str):
123
+ """마지막에 받는 자유 코멘트를 FEEDBACK_FILE로 저장."""
124
+ if not participant_id or not participant_id.strip():
125
+ return gr.update(visible=True, value="❗ Missing participant ID.")
126
+ if comment is None or not str(comment).strip():
127
+ # 비어있으면 저장하지 않고 안내만
128
+ return gr.update(visible=True, value="ℹ️ No comment entered — nothing to submit.")
129
+
130
+ try:
131
+ old = _read_feedback_bytes()
132
+ row = [datetime.utcnow().isoformat(), participant_id.strip(), comment.strip()]
133
+ newb = _append_feedback(old, row)
134
+
135
+ if not REPO_ID:
136
+ return gr.update(visible=True, value="❗ RESULTS_REPO is not set.")
137
+ if not HF_TOKEN:
138
+ return gr.update(visible=True, value="❗ HF_TOKEN is missing. Set a write token for the dataset repo.")
139
+
140
+ api.upload_file(
141
+ path_or_fileobj=io.BytesIO(newb),
142
+ path_in_repo=FEEDBACK_FILE,
143
+ repo_id=REPO_ID,
144
+ repo_type="dataset",
145
+ token=HF_TOKEN,
146
+ commit_message="append final feedback"
147
+ )
148
+ return gr.update(visible=True, value="✅ Thanks! Your feedback was submitted.")
149
+ except Exception as e:
150
+ return gr.update(
151
+ visible=True,
152
+ value=f"❌ Feedback save failed: {type(e).__name__}: {e}"
153
+ )
154
+
155
+
156
+ # -------------------- Config --------------------
157
+ REPO_ID = os.getenv("RESULTS_REPO", "dghadiya/video_eval") # 업로드한 리포와 일치
158
+ HF_TOKEN = os.getenv("HF_TOKEN")
159
+ RESULTS_FILE = "results.csv"
160
+ TOTAL_PER_PARTICIPANT = 30 # 목표 평가 개수(세션 기준)
161
+
162
+
163
+ # videos.json 예시: {"url": "...mp4", "id": "BodyWeightSquats__XXXX.mp4", "action": "BodyWeightSquats"}
164
+ with open("videos.json", "r", encoding="utf-8") as f:
165
+ V = json.load(f)
166
+
167
+ api = HfApi()
168
+
169
+ # 교수님 지침(그대로, 굵게 처리 포함)
170
+ # INSTRUCTION_MD = """
171
+ # **Task:** You will watch a series of **AI-generated videos**. For each video, your job is to rate how well the person’s action in the AI-generated video matches the action specified as "**expected action**". Some things to keep in mind:
172
+ # - The generated video should **capture** the expected action **throughout the video**.
173
+ # - Try to **focus only** on the expected action and do **not** judge **video quality**, **attractiveness**, **background**, **camera motion**, or **objects**.
174
+ # - You will be **paid** once **all the videos are viewed and rated**.
175
+ # """
176
+ INSTRUCTION_MD = """
177
+ **Task:** You will watch a series of **AI-generated videos**.
178
+ For each video, your job is to rate:
179
+
180
+ 1. **Action Consistency** - how well the person’s action matches the action specified as the "**Expected action**".
181
+ 2. **Physical Plausibility** - how natural and physically possible the motion looks.
182
+
183
+ Some things to keep in mind:
184
+ - Try to **focus only** on the expected action and motion quality, and do **not** judge **video quality**, **attractiveness**, **background**, **camera motion**, or **objects**.
185
+ - For **physical plausibility**, look for **smooth and realistic** motion without impossible poses, missing limbs, or extreme stretching.
186
+ - Action consistency and physical plausibility are **not mutually exclusive** with each other.
187
+ - **Physically plausible motion does not imply correct depiction of action.**
188
+ - **A video cannot portray action consistency if it has physically impossible movements.**
189
+ - **0: indicates really poor depiction, 10: represents perfect, realistic depiction**
190
+ - The **Save & Next** button will be enabled **only after you have clicked or adjusted both sliders at least once**.
191
+ - You will be **paid** once **all the videos are viewed and rated**.
192
+ """
193
+
194
+ # -------------------- Helper funcs --------------------
195
+ def _load_eval_counts():
196
+ """
197
+ Hugging Face dataset의 results.csv를 읽어 video_id별 평가 개수(dict)를 반환.
198
+ 없으면 0으로 초기화.
199
+ """
200
+ # 모든 id를 0으로 초기화
201
+ counts = {}
202
+ for v in V:
203
+ vid = _get_video_id(v)
204
+ counts[vid] = 0
205
+
206
+ b = _read_csv_bytes()
207
+ if not b:
208
+ return counts
209
+
210
+ s = io.StringIO(b.decode("utf-8", errors="ignore"))
211
+ r = csv.reader(s)
212
+ rows = list(r)
213
+ if not rows:
214
+ return counts
215
+
216
+ # 헤더 파악
217
+ header = rows[0]
218
+ body = rows[1:] if header and ("video_id" in header or "overall" in header) else rows
219
+ vid_col = None
220
+ if header and "video_id" in header:
221
+ vid_col = header.index("video_id")
222
+
223
+ for row in body:
224
+ try:
225
+ vid = row[vid_col] if vid_col is not None else row[2] # 기본 포맷: ts, pid, video_id, overall, notes
226
+ if vid in counts:
227
+ counts[vid] += 1
228
+ except Exception:
229
+ continue
230
+ return counts
231
+
232
+ def _get_video_id(v: dict) -> str:
233
+ if "id" in v and v["id"]:
234
+ return v["id"]
235
+ # id가 없으면 URL 파일명으로 대체
236
+ return os.path.basename(v.get("url", ""))
237
+
238
+ def _read_csv_bytes():
239
+ try:
240
+ p = hf_hub_download(
241
+ repo_id=REPO_ID, filename=RESULTS_FILE, repo_type="dataset",
242
+ token=HF_TOKEN, local_dir="/tmp", local_dir_use_symlinks=False
243
+ )
244
+ return open(p, "rb").read()
245
+ except Exception:
246
+ return None
247
+
248
+
249
+ # def _append(old_bytes, row):
250
+ # s = io.StringIO()
251
+ # w = csv.writer(s)
252
+ # if not old_bytes:
253
+ # # ✅ 새 헤더
254
+ # w.writerow(["ts_iso", "participant_id", "video_id", "overall", "notes"])
255
+ # else:
256
+ # s.write(old_bytes.decode("utf-8", errors="ignore"))
257
+ # w.writerow(row)
258
+ # return s.getvalue().encode("utf-8")
259
+
260
+ def _append(old_bytes, row):
261
+ s = io.StringIO()
262
+ w = csv.writer(s)
263
+ if not old_bytes:
264
+ # ✅ new header with two scores
265
+ w.writerow(["ts_iso", "participant_id", "video_id",
266
+ "action_consistency", "physical_plausibility", "notes"])
267
+ else:
268
+ s.write(old_bytes.decode("utf-8", errors="ignore"))
269
+ w.writerow(row)
270
+ return s.getvalue().encode("utf-8")
271
+
272
+
273
+ # def push(participant_id, video_id, score, notes=""):
274
+ # if not participant_id or not participant_id.strip():
275
+ # return gr.update(visible=True, value="❗ Please enter your Participant ID before proceeding.")
276
+ # if not video_id or score is None:
277
+ # return gr.update(visible=True, value="❗ Fill out all fields.")
278
+
279
+ # try:
280
+ # old = _read_csv_bytes()
281
+ # row = [
282
+ # datetime.utcnow().isoformat(),
283
+ # participant_id.strip(),
284
+ # video_id, # ✅ action 대신 video_id 저장
285
+ # float(score), # overall
286
+ # notes or ""
287
+ # ]
288
+ # newb = _append(old, row)
289
+
290
+ # if not REPO_ID:
291
+ # return gr.update(visible=True, value="❗ RESULTS_REPO is not set.")
292
+ # if not HF_TOKEN:
293
+ # return gr.update(visible=True, value="❗ HF_TOKEN is missing. Set a write token for the dataset repo.")
294
+
295
+ # api.upload_file(
296
+ # path_or_fileobj=io.BytesIO(newb),
297
+ # path_in_repo=RESULTS_FILE,
298
+ # repo_id=REPO_ID,
299
+ # repo_type="dataset",
300
+ # token=HF_TOKEN,
301
+ # commit_message="append"
302
+ # )
303
+ # return gr.update(visible=True, value=f"✅ Saved successfully!")
304
+ # except Exception as e:
305
+ # return gr.update(
306
+ # visible=True,
307
+ # value=f"❌ Save failed: {type(e).__name__}: {e}\n"
308
+ # f"- Check HF_TOKEN permission\n- Check REPO_ID\n- Create dataset repo if missing"
309
+ # )
310
+
311
+ def push(participant_id, video_id, action_score, phys_score, notes=""):
312
+ if not participant_id or not participant_id.strip():
313
+ return gr.update(visible=True, value="❗ Please enter your Participant ID before proceeding.")
314
+ if not video_id or action_score is None or phys_score is None:
315
+ return gr.update(visible=True, value="❗ Fill out all fields.")
316
+
317
+ try:
318
+ old = _read_csv_bytes()
319
+ row = [
320
+ datetime.utcnow().isoformat(),
321
+ participant_id.strip(),
322
+ video_id,
323
+ float(action_score),
324
+ float(phys_score),
325
+ notes or ""
326
+ ]
327
+ newb = _append(old, row)
328
+
329
+ if not REPO_ID:
330
+ return gr.update(visible=True, value="❗ RESULTS_REPO is not set.")
331
+ if not HF_TOKEN:
332
+ return gr.update(visible=True, value="❗ HF_TOKEN is missing. Set a write token for the dataset repo.")
333
+
334
+ api.upload_file(
335
+ path_or_fileobj=io.BytesIO(newb),
336
+ path_in_repo=RESULTS_FILE,
337
+ repo_id=REPO_ID,
338
+ repo_type="dataset",
339
+ token=HF_TOKEN,
340
+ commit_message="append"
341
+ )
342
+ return gr.update(visible=True, value=f"✅ Saved successfully!")
343
+ except Exception as e:
344
+ return gr.update(
345
+ visible=True,
346
+ value=f"❌ Save failed: {type(e).__name__}: {e}\n"
347
+ f"- Check HF_TOKEN permission\n- Check REPO_ID\n- Create dataset repo if missing"
348
+ )
349
+
350
+
351
+ def _extract_action(v):
352
+ if "action" in v and v["action"]:
353
+ return v["action"]
354
+ raw = v.get("id", "")
355
+ return raw.split("__")[0].split(".")[0]
356
+
357
+ def pick_one():
358
+ v = random.choice(V)
359
+ return v["url"], _extract_action(v)
360
+
361
+ def _progress_html(done, total):
362
+ pct = int(100 * done / max(1, total))
363
+ return f"""
364
+ <div style="border:1px solid #ddd; height:20px; border-radius:6px; overflow:hidden; margin-top:6px;">
365
+ <div style="height:100%; width:{pct}%; background:#3b82f6;"></div>
366
+ </div>
367
+ <div style="font-size:12px; margin-top:4px;">{done} / {total}</div>
368
+ """
369
+
370
+ def _build_order_with_anchor(total:int, anchor_idx:int, repeats:int, pool_size:int, min_gap:int=1):
371
+ """
372
+ total: TOTAL_PER_PARTICIPANT (e.g., 30)
373
+ anchor_idx: index of the anchor video in V (0 for first item)
374
+ repeats: how many times to show anchor (e.g., 5)
375
+ pool_size: len(V)
376
+ min_gap: 최소 간격(인접 금지 => 1)
377
+
378
+ return: list of indices (length=total)
379
+ """
380
+ assert repeats <= total, "repeats must be <= total"
381
+ assert pool_size >= 1, "videos pool must be non-empty"
382
+
383
+ # 1) 다른 비디오 25개(중복 없이) 뽑기
384
+ others_needed = total - repeats
385
+ # anchor를 제외한 후보 인덱스
386
+ candidates = list(range(1, pool_size)) if anchor_idx == 0 else [i for i in range(pool_size) if i != anchor_idx]
387
+ if len(candidates) < others_needed:
388
+ raise ValueError("Not enough unique non-anchor videos to fill the schedule without duplication.")
389
+
390
+ others = random.sample(candidates, k=others_needed)
391
+
392
+ # 2) 기본 시퀀스(others)를 무작위로 섞기
393
+ random.shuffle(others)
394
+
395
+ # 3) 앵커를 min_gap를 만족하도록 삽입할 위치 선정
396
+ # 30개를 5구간으로 나눠, 각 구간 내에서 충돌 덜 나게 배치
397
+ # (간단하고 안정적인 방식)
398
+ seq = others[:] # 길이=25
399
+ anchor_positions = []
400
+ segment = total // repeats # 30//5 = 6
401
+
402
+ for k in range(repeats):
403
+ # 각 구간 [k*segment, (k+1)*segment) 안에서 후보 위치를 고름
404
+ lo = k * segment
405
+ hi = (k + 1) * segment if k < repeats - 1 else total # 마지막은 끝까지
406
+ # 경계 내 임의 오프셋 선택 (여유를 두고 충돌을 피함)
407
+ candidate_pos = random.randrange(lo, hi)
408
+
409
+ # 인접 금지 보정: 이미 배정된 anchor 위치들과의 거리가 min_gap 이상 되도록 조정
410
+ # 필요 시 좌우로 근접한 빈 슬롯 탐색
411
+ def ok(pos):
412
+ return all(abs(pos - p) >= min_gap + 1 for p in anchor_positions) # 연속금지 => 거리 >= 2
413
+
414
+ # 근방 탐색 폭
415
+ found = None
416
+ for delta in range(0, segment): # 구간 크기 내에서 탐색
417
+ # 좌/우 번갈아가며 후보 시도
418
+ for sign in (+1, -1):
419
+ pos = candidate_pos + sign * delta
420
+ if 0 <= pos < total and ok(pos):
421
+ found = pos
422
+ break
423
+ if found is not None:
424
+ break
425
+
426
+ if found is None:
427
+ # 최후: 0..total-1 범위에서 아무 데나 충돌 없는 곳 찾기
428
+ for pos in range(total):
429
+ if ok(pos):
430
+ found = pos
431
+ break
432
+ if found is None:
433
+ raise RuntimeError("Failed to place anchor without adjacency. Try different strategy or loosen min_gap.")
434
+
435
+ anchor_positions.append(found)
436
+
437
+ # 4) others를 기반으로 길이 total의 빈 시퀀스를 만들고 anchor를 주입
438
+ # 우선 빈 리스트를 만들고 anchor 위치를 채운 후, 나머지를 others로 채움
439
+ result = [None] * total
440
+ for pos in anchor_positions:
441
+ result[pos] = anchor_idx
442
+
443
+ # others 포인터
444
+ j = 0
445
+ for i in range(total):
446
+ if result[i] is None:
447
+ result[i] = others[j]
448
+ j += 1
449
+
450
+ # 안전체크
451
+ assert len(result) == total
452
+ # 인접 anchor 없는지 확인
453
+ for i in range(1, total):
454
+ assert not (result[i] == anchor_idx and result[i-1] == anchor_idx), "Adjacent anchors found."
455
+ # anchor 개수 확인
456
+ assert sum(1 for x in result if x == anchor_idx) == repeats, "Anchor count mismatch."
457
+
458
+ return result
459
+
460
+
461
+ # -------------------- Example videos (download to local cache) --------------------
462
+ EXAMPLES = {
463
+ "BodyWeightSquats": {
464
+ "real": "examples/BodyWeightSquats_real.mp4",
465
+ "bad": "examples/BodyWeightSquats_bad.mp4",
466
+ },
467
+ "WallPushUps": {
468
+ "real": "examples/WallPushUps_real.mp4",
469
+ "bad": "examples/WallPushUps_bad.mp4",
470
+ },
471
+ }
472
+ EX_CACHE = {}
473
+ for cls, files in EXAMPLES.items():
474
+ EX_CACHE[cls] = {"real": None, "bad": None}
475
+ for kind, fname in files.items():
476
+ try:
477
+ EX_CACHE[cls][kind] = hf_hub_download(
478
+ repo_id=REPO_ID,
479
+ filename=fname,
480
+ repo_type="dataset",
481
+ token=HF_TOKEN,
482
+ local_dir="/tmp",
483
+ local_dir_use_symlinks=False,
484
+ )
485
+ except Exception as e:
486
+ print(f"[WARN] example missing: {cls} {kind} -> {fname}: {e}")
487
+
488
+ for cls in EX_CACHE:
489
+ for kind in EX_CACHE[cls]:
490
+ if EX_CACHE[cls][kind]:
491
+ EX_CACHE[cls][kind] = ensure_muted_copy(EX_CACHE[cls][kind])
492
+
493
+
494
+ CLEAN_BG_CSS = r"""
495
+ /* 전체 페이지 배경을 흰색으로 (Spaces의 회색 배경 제거) */
496
+ html, body { background:#ffffff !important; }
497
+
498
+ /* Intro/Eval 섹션의 래퍼 박스만 투명 처리 (입력창/슬라이더 등 컨트롤은 놔둠) */
499
+ #intro .gr-panel, #intro .gr-group, #intro .gr-box, #intro .gr-row, #intro .gr-column,
500
+ #eval .gr-panel, #eval .gr-group, #eval .gr-box, #eval .gr-row, #eval .gr-column {
501
+ background: transparent !important;
502
+ box-shadow: none !important;
503
+ border-color: transparent !important;
504
+ }
505
+
506
+ /* 비디오 카드 주변 툴바(작은 회색 박스)도 투명하게 */
507
+ #intro [data-testid="block-video"] .prose,
508
+ #eval [data-testid="block-video"] .prose {
509
+ background: transparent !important;
510
+ box-shadow: none !important;
511
+ border-color: transparent !important;
512
+ }
513
+ """
514
+ # -------------------- UI --------------------
515
+
516
+ with gr.Blocks(css=CLEAN_BG_CSS) as demo:
517
+ # Blocks 안, 어디서든 한 번만 추가(권장 위치: Blocks 시작 직후)
518
+ gr.HTML("""
519
+ <script>
520
+ (function(){
521
+ // 모든 일반 DOM + Shadow DOM 안의 <video>까지 찾아 음소거
522
+ function eachNodeWithShadow(root, fn){
523
+ const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
524
+ fn(root);
525
+ while (walker.nextNode()){
526
+ const el = walker.currentNode;
527
+ fn(el);
528
+ if (el.shadowRoot){
529
+ eachNodeWithShadow(el.shadowRoot, fn);
530
+ }
531
+ }
532
+ }
533
+
534
+ function muteVideoEl(v){
535
+ try{
536
+ // 재생 전에 반드시 muted 속성이 있어야 브라우저가 소리 차단
537
+ v.muted = true;
538
+ v.volume = 0.0;
539
+ v.setAttribute('muted','');
540
+ v.setAttribute('playsinline','');
541
+ v.setAttribute('preload','metadata');
542
+
543
+ // 사용자가 볼륨/음소거를 바꿔도 다시 0으로
544
+ if (!v._muteHooked){
545
+ v.addEventListener('volumechange', () => {
546
+ if (!v.muted || v.volume > 0) { v.muted = true; v.volume = 0.0; }
547
+ });
548
+ v.addEventListener('play', () => {
549
+ v.muted = true; v.volume = 0.0;
550
+ });
551
+ v._muteHooked = true;
552
+ }
553
+ }catch(e){}
554
+ }
555
+
556
+ function muteAll(root){
557
+ eachNodeWithShadow(root || document, (el)=>{
558
+ if (el.tagName && el.tagName.toLowerCase() === 'video'){
559
+ muteVideoEl(el);
560
+ }else if (el.querySelectorAll){
561
+ el.querySelectorAll('video').forEach(muteVideoEl);
562
+ }
563
+ });
564
+ }
565
+
566
+ // 초기 렌더에서
567
+ muteAll(document);
568
+
569
+ // 이후 DOM 변화 감시(Shadow DOM 내부 변화도 포착)
570
+ const obs = new MutationObserver(() => muteAll(document));
571
+ obs.observe(document, {subtree:true, childList:true, attributes:false});
572
+ })();
573
+ </script>
574
+ """)
575
+
576
+
577
+ order_state = gr.State(value=[]) # v4에서는 value= 권장
578
+ ptr_state = gr.State(value=0)
579
+ cur_video_id = gr.State(value="")
580
+ reward_code_state = gr.State(value="") # 완료 시 생성한 코드 저장(중복 생성 방지)
581
+
582
+ selected_action = gr.State(value=None) # 아직 선택 없음
583
+ selected_phys = gr.State(value=None) # 아직 선택 없음
584
+
585
+ # ------------------ PAGE 1: Intro + Examples ------------------
586
+ # page_intro = gr.Group(visible=True)
587
+ page_intro = gr.Group(visible=True, elem_id="intro")
588
+ with page_intro:
589
+ # gr.Markdown("## 🎯 Action Consistency Human Evaluation")
590
+ gr.Markdown("## 🎯 Human Evaluation: Action Consistency & Physical Plausibility")
591
+
592
+ gr.Markdown(INSTRUCTION_MD)
593
+
594
+ understood = gr.Checkbox(label="I have read and understand the task.", value=False)
595
+ start_btn = gr.Button("Yes, start", variant="secondary", interactive=False)
596
+
597
+ def _toggle_start(checked: bool):
598
+ return gr.update(interactive=checked, variant=("primary" if checked else "secondary"))
599
+ understood.change(_toggle_start, inputs=understood, outputs=start_btn)
600
+
601
+ # Examples: Squats
602
+ with gr.Group():
603
+ gr.Markdown("### Examples: BodyWeightSquats")
604
+ with gr.Row():
605
+ with gr.Column():
606
+ gr.Markdown("**Expected depiction of action**")
607
+ gr.Video(value=EX_CACHE["BodyWeightSquats"]["real"], height=240, autoplay=False, elem_id="ex_squats_real",)
608
+ with gr.Column():
609
+ gr.Markdown("**Poorly generated action**")
610
+ gr.Video(value=EX_CACHE["BodyWeightSquats"]["bad"], height=240, autoplay=False)
611
+ if not (EX_CACHE["BodyWeightSquats"]["real"] and EX_CACHE["BodyWeightSquats"]["bad"]):
612
+ gr.Markdown("> ⚠️ Upload `examples/BodyWeightSquats_real.mp4` and `_bad.mp4` to show both samples.")
613
+
614
+ # Examples: WallPushUps
615
+ with gr.Group():
616
+ gr.Markdown("### Examples: WallPushUps")
617
+ with gr.Row():
618
+ with gr.Column():
619
+ gr.Markdown("**Expected depiction of action**")
620
+ gr.Video(value=EX_CACHE["WallPushUps"]["real"], height=240, autoplay=False, elem_id="ex_wallpushups_real",)
621
+ with gr.Column():
622
+ gr.Markdown("**Poorly generated action**")
623
+ gr.Video(value=EX_CACHE["WallPushUps"]["bad"], height=240, autoplay=False)
624
+ if not (EX_CACHE["WallPushUps"]["real"] and EX_CACHE["WallPushUps"]["bad"]):
625
+ gr.Markdown("> ⚠️ Upload `examples/WallPushUps_real.mp4` and `_bad.mp4` to show both samples.")
626
+
627
+ gr.HTML("""
628
+ <script>
629
+ (function(){
630
+ const ids = [
631
+ "ex_squats_real",
632
+ "ex_wallpushups_real",
633
+ ];
634
+ function muteById(id){
635
+ const host = document.getElementById(id);
636
+ if(!host) return;
637
+ // gr.Video는 Shadow DOM 내부에 <video>가 랜더링됨
638
+ const roots = [host, host.shadowRoot].filter(Boolean);
639
+ roots.forEach(root=>{
640
+ const vids = root.querySelectorAll('video');
641
+ vids.forEach(v=>{
642
+ try{
643
+ v.muted = true;
644
+ v.volume = 0.0;
645
+ v.setAttribute('muted','');
646
+ v.setAttribute('playsinline','');
647
+ // 사용자가 바꿔도 즉시 원복
648
+ if(!v._exMuteHooked){
649
+ v.addEventListener('volumechange', ()=>{
650
+ if(!v.muted || v.volume > 0){ v.muted = true; v.volume = 0.0; }
651
+ });
652
+ v.addEventListener('play', ()=>{
653
+ v.muted = true; v.volume = 0.0;
654
+ });
655
+ v._exMuteHooked = true;
656
+ }
657
+ }catch(e){}
658
+ });
659
+ });
660
+ }
661
+ function apply(){
662
+ ids.forEach(muteById);
663
+ }
664
+ // 초기 + DOM변경 시 적용
665
+ apply();
666
+ new MutationObserver(apply).observe(document, {subtree:true, childList:true});
667
+ })();
668
+ </script>
669
+ """)
670
+
671
+
672
+ # ------------------ PAGE 2: Evaluation ------------------
673
+ page_eval = gr.Group(visible=False, elem_id="eval")
674
+ with page_eval:
675
+ # PID 입력
676
+ with gr.Row():
677
+ pid = gr.Textbox(label="Participant ID (required)", placeholder="e.g., Youngsun-2025/10/24")
678
+
679
+ # 지침(원문) + 비디오 + 진행바 / 오른쪽에 슬라이더 + Save&Next
680
+ with gr.Row(): #equal_height=True
681
+ with gr.Column(scale=1):
682
+ gr.Markdown(INSTRUCTION_MD) # 교수님 문구 그대로
683
+ video = gr.Video(label="Video", height=360)
684
+ progress = gr.HTML(_progress_html(0, TOTAL_PER_PARTICIPANT))
685
+
686
+ with gr.Column(scale=1):
687
+ action_tb = gr.Textbox(label="Expected action", interactive=False)
688
+ # NEW: two separate sliders
689
+ score_action = gr.Slider(
690
+ minimum=0.0, maximum=10.0, step=0.1, value=5.0,
691
+ label="Action Consistency (0.0 - 10.0)"
692
+ )
693
+ score_phys = gr.Slider(
694
+ minimum=0.0, maximum=10.0, step=0.1, value=5.0,
695
+ label="Physical Plausibility (0.0 - 10.0)"
696
+ )
697
+
698
+ save_next = gr.Button("💾 Save & Next ▶", variant="secondary", interactive=False)
699
+
700
+
701
+ status = gr.Markdown(visible=False)
702
+ done_state = gr.State(0)
703
+
704
+ # PID 입력에 따라 Save&Next 토글
705
+ def _toggle_by_pid(pid_text: str):
706
+ enabled = bool(pid_text and pid_text.strip())
707
+ return gr.update(interactive=enabled, variant=("primary" if enabled else "secondary"))
708
+ # pid.change(_toggle_by_pid, inputs=pid, outputs=save_next)
709
+
710
+
711
+ def _on_action_release(val: float, pid_text: str, sel_p):
712
+ # 사용자가 액션 슬라이더를 한 번이라도 놓으면 선택 완료
713
+ return val, _recompute_save(pid_text, val, sel_p)
714
+
715
+ def _on_phys_release(val: float, pid_text: str, sel_a):
716
+ return val, _recompute_save(pid_text, sel_a, val)
717
+
718
+ # release: 마우스를 놓을 때 1회 확정
719
+ score_action.release(_on_action_release,
720
+ inputs=[score_action, pid, selected_phys],
721
+ outputs=[selected_action, save_next])
722
+
723
+ score_phys.release(_on_phys_release,
724
+ inputs=[score_phys, pid, selected_action],
725
+ outputs=[selected_phys, save_next])
726
+
727
+ # PID가 바뀌면 현재 선택 상태로 Save 버튼 재계산
728
+ pid.change(_recompute_save,
729
+ inputs=[pid, selected_action, selected_phys],
730
+ outputs=save_next)
731
+
732
+ page_thanks = gr.Group(visible=False)
733
+ with page_thanks:
734
+ reward_msg = gr.Markdown(visible=False)
735
+ reward_code_box = gr.Textbox(label="Your reward code (copy & paste)", interactive=False, visible=False)
736
+ reward_pid_box = gr.Textbox(label="Your participant ID", interactive=False, visible=False)
737
+
738
+ gr.Markdown("### Any comments (optional)")
739
+ feedback_tb = gr.Textbox(
740
+ label="Any comments (optional)",
741
+ placeholder="Leave any feedback for the study organizers (optional).",
742
+ lines=4
743
+ )
744
+ feedback_submit = gr.Button("Submit feedback")
745
+ feedback_status = gr.Markdown(visible=False)
746
+
747
+
748
+
749
+ # -------- 페이지 전환 & 첫 로드 --------
750
+ ANCHOR_IDX = 0 # videos.json의 맨 첫 비디오
751
+ ANCHOR_REPEATS = 5 # 앵커 5회
752
+ MIN_GAP = 1 # 앵커 연속 금지(인접 금지)
753
+
754
+ def _build_order_least_first_with_anchor(total:int, anchor_idx:int, repeats:int, min_gap:int=1):
755
+ """
756
+ - results.csv를 읽어 video_id별 카운트를 계산
757
+ - 앵커(첫 비디오) 5회 포함, 연속 금지
758
+ - 나머지는 '가장 적게 평가된 순'으로 중복 없이 채움
759
+ """
760
+ assert repeats <= total
761
+ N = len(V)
762
+ assert N >= 1
763
+
764
+ # 0) id 매핑
765
+ def vid_of(i): return _get_video_id(V[i])
766
+
767
+ # 1) 현재 누적 카운트 로드
768
+ counts = _load_eval_counts()
769
+
770
+ # 2) 앵커 제외 후보(중복 없이) 정렬: 카운트 오름차순, 동률은 랜덤 셔플
771
+ anchor_vid = vid_of(anchor_idx)
772
+ candidates = [i for i in range(N) if i != anchor_idx]
773
+ # 동률 랜덤화를 위해 일단 셔플
774
+ random.shuffle(candidates)
775
+ candidates.sort(key=lambda i: counts.get(vid_of(i), 0))
776
+
777
+ others_needed = total - repeats
778
+ if len(candidates) < others_needed:
779
+ raise ValueError("Not enough unique non-anchor videos to fill the schedule without duplication.")
780
+
781
+ others = candidates[:others_needed] # 중복 없이 선택
782
+
783
+ # 3) others를 베이스 시퀀스로(랜덤 살짝 섞기)
784
+ random.shuffle(others)
785
+
786
+ # 4) 앵커를 구간 배치(연속 금지)
787
+ seq = [None] * total
788
+ segment = total // repeats if repeats > 0 else total
789
+ anchor_positions = []
790
+ for k in range(repeats):
791
+ lo = k * segment
792
+ hi = (k + 1) * segment if k < repeats - 1 else total
793
+ cand = random.randrange(lo, hi)
794
+
795
+ def ok(pos):
796
+ return all(abs(pos - p) >= (min_gap + 1) for p in anchor_positions)
797
+
798
+ found = None
799
+ for d in range(0, max(1, segment)):
800
+ for sgn in (+1, -1):
801
+ pos = cand + sgn * d
802
+ if 0 <= pos < total and ok(pos):
803
+ found = pos
804
+ break
805
+ if found is not None:
806
+ break
807
+ if found is None:
808
+ # 마지막 수단: 전체 탐색
809
+ for pos in range(total):
810
+ if ok(pos):
811
+ found = pos
812
+ break
813
+ if found is None:
814
+ raise RuntimeError("Failed to place anchor without adjacency.")
815
+ anchor_positions.append(found)
816
+
817
+ for pos in anchor_positions:
818
+ seq[pos] = anchor_idx
819
+
820
+ # 5) 빈 자리를 others로 채우기
821
+ j = 0
822
+ for i in range(total):
823
+ if seq[i] is None:
824
+ seq[i] = others[j]
825
+ j += 1
826
+
827
+ # 6) 안전 체크
828
+ assert sum(1 for x in seq if x == anchor_idx) == repeats
829
+ for i in range(1, total):
830
+ assert not (seq[i] == anchor_idx and seq[i-1] == anchor_idx), "Adjacent anchors found."
831
+
832
+ return seq
833
+
834
+ def _start_and_load_first():
835
+ total = TOTAL_PER_PARTICIPANT
836
+ order = _build_order_least_first_with_anchor(
837
+ total=total,
838
+ anchor_idx=ANCHOR_IDX,
839
+ repeats=ANCHOR_REPEATS,
840
+ min_gap=MIN_GAP
841
+ )
842
+ first_idx = order[0]
843
+ v0 = V[first_idx]
844
+ return (
845
+ gr.update(visible=False),
846
+ gr.update(visible=True),
847
+ gr.update(visible=False),
848
+ v0["url"],
849
+ _extract_action(v0),
850
+ 5.0, # score_action default
851
+ 5.0, # score_phys default ✅ NEW
852
+ gr.update(visible=False, value=""),
853
+ 0,
854
+ _progress_html(0, TOTAL_PER_PARTICIPANT),
855
+ order,
856
+ 1,
857
+ _get_video_id(v0), # cur_video_id
858
+ "",
859
+ None, # ⬅️ selected_action 초기화(= 아직 선택 안됨)
860
+ None, # ⬅️ selected_phys 초기화
861
+
862
+ gr.update(interactive=False, variant="secondary"), # ⬅️ Save 버튼 잠금
863
+ )
864
+
865
+
866
+ start_btn.click(
867
+ _start_and_load_first,
868
+ inputs=[],
869
+ outputs=[
870
+ page_intro, page_eval, page_thanks,
871
+ video, action_tb,
872
+ score_action, score_phys, # <-- two sliders
873
+ status,
874
+ done_state, progress, order_state, ptr_state, cur_video_id,
875
+ reward_code_state,
876
+ selected_action, selected_phys,
877
+ save_next,
878
+ ]
879
+ )
880
+
881
+
882
+
883
+ def save_and_next(participant_id, cur_vid, action_score, phys_score,
884
+ done_cnt, order, ptr, reward_code):
885
+ try:
886
+ if not participant_id or not participant_id.strip():
887
+ return (
888
+ gr.update(visible=True),
889
+ gr.update(visible=False),
890
+ gr.update(visible=True, value="❗ Please enter your Participant ID."),
891
+ gr.update(), gr.update(),
892
+ done_cnt,
893
+ _progress_html(done_cnt, TOTAL_PER_PARTICIPANT),
894
+ 5.0, # reset action slider
895
+ 5.0, # reset phys slider ✅
896
+ ptr,
897
+ cur_vid,
898
+ reward_code,
899
+ gr.update(visible=False),
900
+ gr.update(visible=False),
901
+ gr.update(visible=False),
902
+ None, # ⬅️ selected_action reset
903
+ None, # ⬅️ selected_phys reset
904
+ gr.update(interactive=False, variant="secondary"), # ⬅️ lock button
905
+ )
906
+
907
+ # save both scores
908
+ status_msg = push(participant_id, cur_vid, action_score, phys_score, "")
909
+ new_done = int(done_cnt) + 1
910
+
911
+ if new_done >= TOTAL_PER_PARTICIPANT or ptr >= len(order):
912
+ code = reward_code.strip() or _gen_reward_code(participant_id, length=10)
913
+ try:
914
+ _persist_reward_code(participant_id, code, new_done)
915
+ except Exception:
916
+ pass
917
+
918
+ thanks_text = (
919
+ "## 🎉 Thank you so much!\n"
920
+ "Your responses have been recorded. You may now close this window.\n\n"
921
+ "**Below are your reward code and ID.** Please copy them and submit them to **AMT** to receive your payment."
922
+ )
923
+ return (
924
+ gr.update(visible=False),
925
+ gr.update(visible=True),
926
+ status_msg,
927
+ None,
928
+ "",
929
+ TOTAL_PER_PARTICIPANT,
930
+ _progress_html(TOTAL_PER_PARTICIPANT, TOTAL_PER_PARTICIPANT),
931
+ 5.0, # reset action
932
+ 5.0, # reset phys
933
+ len(order),
934
+ cur_vid,
935
+ code,
936
+ gr.update(visible=True, value=thanks_text),
937
+ gr.update(visible=True, value=code),
938
+ gr.update(visible=True, value=participant_id.strip()),
939
+ None, # ⬅️ selected_action reset
940
+ None, # ⬅️ selected_phys reset
941
+ gr.update(interactive=False, variant="secondary"),
942
+ )
943
+
944
+ # next video
945
+ next_idx = order[ptr]
946
+ v = V[next_idx]
947
+ next_vid = _get_video_id(v)
948
+
949
+ return (
950
+ gr.update(visible=True),
951
+ gr.update(visible=False),
952
+ status_msg,
953
+ v["url"],
954
+ _extract_action(v),
955
+ new_done,
956
+ _progress_html(new_done, TOTAL_PER_PARTICIPANT),
957
+ 5.0, # reset action
958
+ 5.0, # reset phys
959
+ ptr + 1,
960
+ next_vid,
961
+ reward_code,
962
+ gr.update(visible=False),
963
+ gr.update(visible=False),
964
+ gr.update(visible=False),
965
+ None, # ⬅️ selected_action reset
966
+ None, # ⬅️ selected_phys reset
967
+ gr.update(interactive=False, variant="secondary"),
968
+ )
969
+ except Exception as e:
970
+ return (
971
+ gr.update(visible=True),
972
+ gr.update(visible=False),
973
+ gr.update(visible=True, value=f"❌ Error: {type(e).__name__}: {e}"),
974
+ gr.update(), gr.update(),
975
+ done_cnt,
976
+ _progress_html(done_cnt, TOTAL_PER_PARTICIPANT),
977
+ 5.0,
978
+ 5.0,
979
+ ptr,
980
+ cur_vid,
981
+ reward_code,
982
+ gr.update(visible=False),
983
+ gr.update(visible=False),
984
+ gr.update(visible=False),
985
+ None, # ⬅️ reset on error too
986
+ None,
987
+ gr.update(interactive=False, variant="secondary"),
988
+ )
989
+
990
+
991
+
992
+ save_next.click(
993
+ save_and_next,
994
+ inputs=[pid, cur_video_id, score_action, score_phys, done_state, order_state, ptr_state, reward_code_state],
995
+ outputs=[
996
+ page_eval, page_thanks,
997
+ status, video, action_tb,
998
+ done_state, progress, score_action, score_phys,
999
+ ptr_state, cur_video_id,
1000
+ reward_code_state,
1001
+ reward_msg, reward_code_box, reward_pid_box,
1002
+
1003
+ selected_action, selected_phys, # ⬅️ 추가
1004
+ save_next, # ⬅️ 버튼 상태 갱신
1005
+ ]
1006
+ )
1007
+ feedback_submit.click(
1008
+ push_final_feedback,
1009
+ # 완료 후 page_thanks에서 보여주는 participant ID 박스를 사용 (값이 채워져 있음)
1010
+ inputs=[reward_pid_box, feedback_tb],
1011
+ outputs=feedback_status
1012
+ )
1013
+
1014
+
1015
+
1016
+ if __name__ == "__main__":
1017
+ # demo.launch()
1018
+ demo.launch(ssr_mode=False)
make_json.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # make_json.py (혹은 build_videos_json.py)
2
+
3
+ import json, os, re, random
4
+ from typing import Optional
5
+ from huggingface_hub import list_repo_files
6
+
7
+ REPO = os.getenv("VIDEO_DATASET_REPO", "SGTLIM/ucf101_eval_unified")
8
+ INCLUDE_FOLDERS = [s.strip() for s in os.getenv("VIDEO_INCLUDE_FOLDERS", "").split(",") if s.strip()]
9
+ OUT_PATH = "videos.json"
10
+ ADD_DOWNLOAD_PARAM = False # 원격 재생 문제 있으면 False 유지
11
+
12
+ # 10개 액션의 표준명(대소문자 포함)
13
+ ALLOWED_ACTIONS = {
14
+ "BodyWeightSquats","HulaHoop","JumpingJack","PullUps","PushUps",
15
+ "Shotput","SoccerJuggling","TennisSwing","ThrowDiscus","WallPushups",
16
+ }
17
+
18
+ # 흔한 철자/대소문자/언더스코어 변형 → 표준명으로 치환
19
+ ALIAS = {
20
+ "bodyweightsquats":"BodyWeightSquats",
21
+ "body_weight_squats":"BodyWeightSquats",
22
+ "bodysquats":"BodyWeightSquats",
23
+
24
+ "hulahoop":"HulaHoop",
25
+
26
+ "jumpingjack":"JumpingJack",
27
+
28
+ "pullups":"PullUps",
29
+
30
+ "pushups":"PushUps",
31
+
32
+ "shotput":"Shotput",
33
+
34
+ "soccerjuggling":"SoccerJuggling",
35
+ "soccer_juggling":"SoccerJuggling",
36
+
37
+ "tennisswing":"TennisSwing",
38
+ "tennis_swing":"TennisSwing",
39
+
40
+ "throwdiscus":"ThrowDiscus",
41
+ "throw_discus":"ThrowDiscus",
42
+
43
+ "wallpushups":"WallPushups",
44
+ "wall_pushups":"WallPushups",
45
+ }
46
+
47
+ def normalize_action(s: str) -> Optional[str]:
48
+ key = re.sub(r"[^A-Za-z0-9]+", "_", s).lower().strip("_")
49
+ canon = ALIAS.get(key)
50
+ return canon if canon in ALLOWED_ACTIONS else None
51
+
52
+ def is_index_token(tok: str) -> bool:
53
+ return bool(re.fullmatch(r"\d{2,3}", tok))
54
+
55
+ def extract_action_from_id(path_in_repo: str) -> Optional[str]:
56
+ """
57
+ <Model>_(...optional tokens...)_<Action>_<Index>_(hash).mp4
58
+ → 오른쪽부터 스캔해 첫 숫자 토큰(2~3자리)을 'Index'로 간주,
59
+ 그 바로 앞 토큰을 액션으로 사용.
60
+ """
61
+ name = path_in_repo.rsplit("/", 1)[-1]
62
+ stem = name.rsplit(".", 1)[0]
63
+ toks = stem.split("_")
64
+ # 오른쪽→왼쪽 방향으로 숫자 토큰을 찾는다 (예: 01, 10, 123)
65
+ for i in range(len(toks)-1, -1, -1):
66
+ t = toks[i]
67
+ if re.fullmatch(r"\d{2,3}", t):
68
+ if i - 1 >= 0:
69
+ action = toks[i - 1]
70
+ return normalize_action(action)
71
+ break
72
+ return None
73
+
74
+
75
+ def main():
76
+ base_url = f"https://huggingface.co/datasets/{REPO}/resolve/main/"
77
+ files = list_repo_files(repo_id=REPO, repo_type="dataset")
78
+ mp4s = [f for f in files if f.lower().endswith(".mp4")]
79
+ if INCLUDE_FOLDERS:
80
+ mp4s = [f for f in mp4s if any(f.startswith(folder + "/") for folder in INCLUDE_FOLDERS)]
81
+
82
+ videos, bad = [], []
83
+ for p in mp4s:
84
+ action = extract_action_from_id(p)
85
+ if action is None or action not in ALLOWED_ACTIONS:
86
+ bad.append(p); continue
87
+ url = base_url + p + ("?download=1" if ADD_DOWNLOAD_PARAM else "")
88
+ videos.append({"url": url, "id": p, "action": action})
89
+
90
+ random.shuffle(videos)
91
+ with open(OUT_PATH, "w", encoding="utf-8") as fp:
92
+ json.dump(videos, fp, ensure_ascii=False, indent=2)
93
+
94
+ print(f"[DONE] wrote {OUT_PATH} with {len(videos)} items from repo={REPO}")
95
+ from collections import Counter
96
+ c = Counter(v["action"] for v in videos)
97
+ for a in sorted(ALLOWED_ACTIONS):
98
+ print(f" {a:16s} = {c.get(a,0)}")
99
+ if bad:
100
+ print(f"[INFO] skipped (not matched to ALLOWED after normalize): {len(bad)}")
101
+ for x in bad[:10]:
102
+ print(" -", x)
103
+
104
+ if __name__ == "__main__":
105
+ main()
make_my_repo_dataset.py ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import os, re, csv, hashlib, shutil, subprocess
3
+ from pathlib import Path
4
+ from collections import defaultdict
5
+ from typing import List, Tuple
6
+ from huggingface_hub import HfApi, list_repo_files, hf_hub_download, create_repo
7
+ from huggingface_hub import whoami
8
+ from huggingface_hub import CommitOperationAdd
9
+ from huggingface_hub import snapshot_download
10
+ import time, glob
11
+
12
+ # ========= CONFIG =========
13
+ SRC_REPO = "XThomasBU/video_evals_ucf101"
14
+ SRC_SUBDIRS = ["Hunyuan_videos", "Opensora_768", "RunwayGen4", "wan21_videos"] # 필요한 것만
15
+
16
+ # 너의 로컬 Wan2.2(60개)도 포함
17
+ WAN22_LOCAL_ROOT = Path("/projectnb/ivc-ml/youngsun/Video_Eval/Datasets/Wan2p2/Generated_UCF")
18
+ WAN22_TARGET_SUBDIR = "Wan2.2" # 목적지 리포의 상위 폴더명(우리가 쓰던 이름 유지)
19
+
20
+ DEST_REPO = "SGTLIM/ucf101_eval_unified" # ← 네 계정으로 고정
21
+ DEST_REPO_IS_PRIVATE = False
22
+
23
+ # 용량 넉넉한 작업 디렉토리( /tmp 대신 /projectnb )
24
+ WORKDIR = Path("/projectnb/ivc-ml/youngsun/tmp_ucf_unified")
25
+ STAGING = WORKDIR / "staging" # 스테이징 루트
26
+ DL_ROOT = WORKDIR / "downloads" # 원본 다운로드 저장소
27
+ MAKE_SILENT = False
28
+ TOKEN = os.getenv("HF_TOKEN")
29
+ # =========================
30
+
31
+ # /tmp 대신 WORKDIR을 임시/캐시로 사용
32
+ os.environ.setdefault("TMPDIR", str(WORKDIR / "_tmp"))
33
+ os.environ.setdefault("HF_HOME", "/projectnb/ivc-ml/youngsun/.cache/huggingface")
34
+
35
+ # 디렉토리 보장
36
+ (WORKDIR / "_tmp").mkdir(parents=True, exist_ok=True)
37
+ STAGING.mkdir(parents=True, exist_ok=True)
38
+ DL_ROOT.mkdir(parents=True, exist_ok=True)
39
+
40
+
41
+ # 액션명 정규화(필요시 추가)
42
+ ALIAS = {
43
+ "bodyweightsquats":"body_weight_squats",
44
+ "bodysquats":"body_weight_squats",
45
+ "body_weight_squats":"body_weight_squats",
46
+ "hulahoop":"hula_hoop",
47
+ "jumpingjack":"jumping_jack",
48
+ "pullups":"pull_ups",
49
+ "pushups":"push_ups",
50
+ "throwdiscus":"throw_discus",
51
+ "wallpushups":"wall_pushups",
52
+ }
53
+
54
+
55
+ def camel_action(s: str) -> str:
56
+ # 'body_weight_squats' -> 'BodyWeightSquats'
57
+ parts = s.strip("_").split("_")
58
+ return "".join(p.capitalize() for p in parts if p)
59
+
60
+ def extract_action_from_remote(rel_remote: str) -> str:
61
+ """
62
+ HF 리포의 '원본 경로'에서만 액션을 뽑는다.
63
+ 예: Hunyuan_videos/v_BodyWeightSquats_g05_c01.mp4 -> body_weight_squats
64
+ """
65
+ base = os.path.basename(rel_remote)
66
+ m = re.match(r"^v_([A-Za-z0-9]+)_", base) # 반드시 v_<Action>_...
67
+ if m:
68
+ return slugify_action(m.group(1))
69
+ # (예외 케이스 최소화: 원본 리포는 v_패턴이므로 여기까지 올 일 거의 없음)
70
+ return slugify_action(base.split("_", 1)[0])
71
+
72
+
73
+
74
+ def slugify_action(s: str) -> str:
75
+ s = s.strip().lower().replace(" ", "_")
76
+ s = re.sub(r"[^a-z0-9_]+", "_", s)
77
+ s = re.sub(r"_+", "_", s).strip("_")
78
+ return ALIAS.get(s, s)
79
+
80
+ def model_slug(s: str) -> str:
81
+ s = s.strip().lower()
82
+ s = s.replace(" ", "_")
83
+ s = re.sub(r"[^a-z0-9_]+", "_", s)
84
+ s = re.sub(r"_+", "_", s).strip("_")
85
+ return s
86
+
87
+ def sha1_8(p: Path) -> str:
88
+ h = hashlib.sha1()
89
+ with open(p, "rb") as f:
90
+ for chunk in iter(lambda: f.read(1024*1024), b""):
91
+ h.update(chunk)
92
+ return h.hexdigest()[:8]
93
+
94
+ def ensure_ffmpeg():
95
+ # MAKE_SILENT=False 이면 ffmpeg 체크 안 함
96
+ if MAKE_SILENT and not shutil.which("ffmpeg"):
97
+ raise RuntimeError("ffmpeg not found, but MAKE_SILENT=True")
98
+
99
+ def mute_copy(src: Path, dst: Path):
100
+ # (지금은 쓰지 않지만, 옵션 되살리기 대비로 남겨둠)
101
+ cmd = ["ffmpeg","-y","-i",str(src),"-c:v","copy","-an",str(dst)]
102
+ try:
103
+ subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
104
+ except subprocess.CalledProcessError:
105
+ cmd = [
106
+ "ffmpeg","-y","-i",str(src),
107
+ "-vf","format=yuv420p","-movflags","+faststart",
108
+ "-c:v","libx264","-crf","18","-preset","veryfast",
109
+ "-an",str(dst)
110
+ ]
111
+ subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
112
+
113
+ def extract_action_from_filename(fn: str) -> str:
114
+ # 예: v_BodyWeightSquats_g05_c01.mp4 → BodyWeightSquats
115
+ m = re.match(r"v_([A-Za-z0-9]+)", fn)
116
+ if m:
117
+ return slugify_action(m.group(1))
118
+ parts = fn.split("/")
119
+ if len(parts) >= 2:
120
+ return slugify_action(parts[-2])
121
+ stem = Path(fn).stem
122
+ stem = re.sub(r"^\w+_", "", stem)
123
+ return slugify_action(stem)
124
+
125
+ def stage_from_hf_model(api, model_dir, rows):
126
+ # 1) 원본 리포 파일 목록에서 이 폴더의 mp4만 고르기
127
+ all_remote = list_repo_files(repo_id=SRC_REPO, repo_type="dataset", token=TOKEN)
128
+ remotes = [p for p in all_remote if p.startswith(model_dir + "/") and p.lower().endswith(".mp4")]
129
+ print(f"[FETCH] {model_dir}: {len(remotes)} remote mp4 files")
130
+ if not remotes:
131
+ print(f"[WARN] no matches under {model_dir}")
132
+ return
133
+
134
+ # 2) 이 모델 전용 다운로드 폴��를 매번 깨끗하게 생성
135
+ dl_dir = DL_ROOT / model_dir
136
+ if dl_dir.exists():
137
+ shutil.rmtree(dl_dir)
138
+ dl_dir.mkdir(parents=True, exist_ok=True)
139
+
140
+ # 3) (remote_path, local_path) 쌍으로 보관 (액션 추출은 remote_path로!)
141
+ pairs = []
142
+ for rel_remote in remotes:
143
+ local = hf_hub_download(
144
+ repo_id=SRC_REPO,
145
+ filename=rel_remote, # ← 원본 경로 유지
146
+ repo_type="dataset",
147
+ token=TOKEN,
148
+ local_dir=str(dl_dir),
149
+ local_dir_use_symlinks=False,
150
+ )
151
+ pairs.append((rel_remote, local))
152
+
153
+ # 4) 스테이징으로 이동 + 올바른 이름으로 리네임
154
+ folder_name = model_dir # 예: 'Hunyuan_videos', 'RunwayGen4', ...
155
+ dst_dir = STAGING / folder_name
156
+ dst_dir.mkdir(parents=True, exist_ok=True)
157
+
158
+ counters = defaultdict(int)
159
+ moved = 0
160
+ for rel_remote, local in sorted(pairs):
161
+ # ✅ 액션은 '원본 경로'에서만 추출
162
+ action_slug = extract_action_from_remote(rel_remote) # 'body_weight_squats'
163
+ print(action_slug)
164
+ action_camel = camel_action(action_slug) # 'BodyWeightSquats'
165
+ print(action_camel)
166
+ counters[action_slug] += 1
167
+ idx = counters[action_slug]
168
+ h8 = sha1_8(Path(local))
169
+
170
+ # ✅ 최종 규칙: Model_Action_두자리_해시8.mp4
171
+ new_name = f"{folder_name}_{action_camel}_{idx:02d}_{h8}.mp4"
172
+
173
+ dst = dst_dir / new_name
174
+ shutil.move(local, dst)
175
+ moved += 1
176
+
177
+ rows.append([f"hf://{SRC_REPO}/{rel_remote}", folder_name, action_slug, idx, h8, f"{folder_name}/{new_name}"])
178
+
179
+ print(f"[STAGED] {model_dir}: moved {moved} files to {dst_dir}")
180
+
181
+ def stage_from_local_wan22(rows: List[List[str]]):
182
+ pretty_model = "Wan2.2"
183
+ counters = defaultdict(int)
184
+ for class_dir in sorted([p for p in WAN22_LOCAL_ROOT.iterdir() if p.is_dir()]):
185
+ action = slugify_action(class_dir.name)
186
+ for mp4 in sorted([p for p in class_dir.iterdir() if p.suffix.lower()==".mp4"]):
187
+ counters[action] += 1
188
+ idx = counters[action]
189
+ h8 = sha1_8(mp4)
190
+ # new_name = f"wan2p2_{action}_{idx:02d}_{h8}.mp4"
191
+ pretty_model = WAN22_TARGET_SUBDIR # ex) 'Wan2.2'
192
+ camel = camel_action(action) # ex) 'PushUps'
193
+ new_name = f"{pretty_model}_{camel}_{idx:02d}_{h8}.mp4"
194
+ dst_dir = STAGING / pretty_model
195
+ dst_dir.mkdir(parents=True, exist_ok=True)
196
+ dst = dst_dir / new_name
197
+ if MAKE_SILENT:
198
+ mute_copy(mp4, dst)
199
+ else:
200
+ shutil.copy2(mp4, dst) # 🔊 원본 그대로
201
+ rows.append([str(mp4), pretty_model, action, idx, h8, f"{pretty_model}/{new_name}"])
202
+
203
+ def main():
204
+ if not TOKEN:
205
+ raise SystemExit("Set HF_TOKEN with write permission.")
206
+ ensure_ffmpeg()
207
+
208
+ # 🔻 작업 디렉토리 초기화 (여기 추가)
209
+ if STAGING.exists():
210
+ shutil.rmtree(STAGING)
211
+ if DL_ROOT.exists():
212
+ shutil.rmtree(DL_ROOT)
213
+ STAGING.mkdir(parents=True, exist_ok=True)
214
+ DL_ROOT.mkdir(parents=True, exist_ok=True)
215
+
216
+ api = HfApi()
217
+ try:
218
+ create_repo(repo_id=DEST_REPO, repo_type="dataset", private=DEST_REPO_IS_PRIVATE, token=TOKEN, exist_ok=True)
219
+ except Exception:
220
+ pass
221
+
222
+ rows: List[List[str]] = []
223
+
224
+ # 1) 원본 리포에서 4개 모델 폴더만 스테이징
225
+ for sub in SRC_SUBDIRS:
226
+ stage_from_hf_model(api, sub, rows)
227
+
228
+ # 2) 로컬 Wan2.2(60개) 추가
229
+ stage_from_local_wan22(rows)
230
+
231
+ # 3) 매핑 csv 저장
232
+ with open(STAGING / "mapping.csv", "w", newline="", encoding="utf-8") as f:
233
+ w = csv.writer(f)
234
+ w.writerow(["source","model","action","idx","hash8","dest_path"])
235
+ w.writerows(rows)
236
+
237
+ # 4) 폴더별로 명시적 추가 커밋(변경감지 우회)
238
+ subdirs_to_push = ["Hunyuan_videos", "Opensora_768", "RunwayGen4", "wan21_videos"] #, "Wan2.2"
239
+ for sd in subdirs_to_push:
240
+ sd_path = STAGING / sd
241
+ if not sd_path.exists():
242
+ print(f"[WARN] skip missing subdir: {sd}")
243
+ continue
244
+ files = sorted(str(p) for p in sd_path.rglob("*.mp4"))
245
+ if not files:
246
+ print(f"[WARN] skip empty subdir: {sd}")
247
+ continue
248
+
249
+ print(f"[PUSH] {sd} ... ({len(files)} files)")
250
+ ops = []
251
+ for fp in files:
252
+ rel_in_repo = os.path.relpath(fp, start=STAGING) # 예: Hunyuan_videos/xxx.mp4
253
+ ops.append(CommitOperationAdd(path_in_repo=rel_in_repo, path_or_fileobj=fp))
254
+
255
+ api.create_commit(
256
+ repo_id=DEST_REPO,
257
+ repo_type="dataset",
258
+ operations=ops,
259
+ commit_message=f"Add {sd} ({len(files)} files)",
260
+ token=TOKEN,
261
+ )
262
+
263
+ # mapping.csv 업로드
264
+ map_csv = STAGING / "mapping.csv"
265
+ if map_csv.exists():
266
+ api.upload_file(
267
+ path_or_fileobj=str(map_csv),
268
+ path_in_repo="mapping.csv",
269
+ repo_id=DEST_REPO,
270
+ repo_type="dataset",
271
+ token=TOKEN,
272
+ commit_message="Add mapping.csv",
273
+ )
274
+
275
+ print(f"[DONE] Pushed to https://huggingface.co/datasets/{DEST_REPO}")
276
+
277
+ if __name__ == "__main__":
278
+ main()
279
+
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ gradio==4.44.0
2
+ huggingface_hub>=0.25.0
3
+
test.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import list_repo_files
2
+ from collections import Counter
3
+
4
+ REPO="SGTLIM/ucf101_eval_unified"
5
+ files = list_repo_files(repo_id=REPO, repo_type="dataset")
6
+ mp4s = [f for f in files if f.lower().endswith(".mp4")]
7
+ by_top = Counter(f.split("/",1)[0] for f in mp4s)
8
+ print(by_top) # 각 최상위 폴더별 mp4 개수
9
+
10
+ # 액션 파싱(두 자리 인덱스 앞 토큰)
11
+ import re
12
+ def act(p):
13
+ stem = p.rsplit("/",1)[-1].rsplit(".",1)[0].split("_")
14
+ for i,t in enumerate(stem):
15
+ if re.fullmatch(r"\d{2,3}", t):
16
+ return stem[i-1] if i>0 else None
17
+ return None
18
+
19
+ for folder in ["Wan2.2","RunwayGen4","Hunyuan_videos","Opensora_768","wan21_videos"]:
20
+ xs = [f for f in mp4s if f.startswith(folder + "/")]
21
+ print(folder, len(xs), "files")
upload_videos_toHF.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from huggingface_hub import HfApi
3
+
4
+ # 1) 환경변수/설정
5
+ HF_TOKEN = os.environ["HF_TOKEN"] # 반드시 Write 권한 토큰이어야 함
6
+ # whoami()["name"] 결과(또는 조직명)로 맞춰 쓰기
7
+ OWNER = os.getenv("HF_OWNER", "sgtlim") # 필요시: export HF_OWNER=your_name_or_org
8
+ REPO_ID = f"{OWNER}/videoeval_results" # 업로드할 데이터셋 리포
9
+
10
+ # 2) 로컬 파일 경로 (네가 준 경로 그대로)
11
+ WALLPUSHUPS_REAL = "/projectnb/ivc-ml/xthomas/SHARED/video_evals/ucf101_10classes/WallPushups/v_WallPushups_g01_c01.mp4"
12
+ WALLPUSHUPS_BAD = "/projectnb/ivc-ml/xthomas/SHARED/video_evals/YOUTUBE_DATA/WallPushups__EE329FD74B.mp4"
13
+
14
+ # 3) HF 내 저장 경로 (app.py에서 이 경로로 다운로드할 거임)
15
+ WALLPUSHUPS_REAL_IN_REPO = "examples/WallPushUps_real.mp4"
16
+ WALLPUSHUPS_BAD_IN_REPO = "examples/WallPushUps_bad.mp4"
17
+
18
+ api = HfApi()
19
+
20
+ # A) 데이터셋 리포 생성(이미 있으면 패스)
21
+ api.create_repo(
22
+ repo_id=REPO_ID,
23
+ repo_type="dataset",
24
+ private=True,
25
+ exist_ok=True,
26
+ token=HF_TOKEN,
27
+ )
28
+
29
+ # B) 업로드
30
+ api.upload_file(
31
+ path_or_fileobj=WALLPUSHUPS_REAL,
32
+ path_in_repo=WALLPUSHUPS_REAL_IN_REPO,
33
+ repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN,
34
+ commit_message="add WallPushUps real/good example"
35
+ )
36
+
37
+ api.upload_file(
38
+ path_or_fileobj=WALLPUSHUPS_BAD,
39
+ path_in_repo=WALLPUSHUPS_BAD_IN_REPO,
40
+ repo_id=REPO_ID, repo_type="dataset", token=HF_TOKEN,
41
+ commit_message="add WallPushUps generated/bad example"
42
+ )
43
+
44
+ # C) 확인용 출력 (app.py에서 쓸 URL/파일명)
45
+ print("✅ Uploaded to dataset:", REPO_ID)
46
+ print(" -", WALLPUSHUPS_REAL_IN_REPO)
47
+ print(" -", WALLPUSHUPS_BAD_IN_REPO)
48
+ print("\nUse these in app.py hf_hub_download(filename=...):")
49
+ print(" filename='examples/WallPushUps_real.mp4'")
50
+ print(" filename='examples/WallPushUps_bad.mp4'")
51
+ print("\nDirect URLs (repo public일 때만 브라우저 재생):")
52
+ print(f" https://huggingface.co/datasets/{REPO_ID}/resolve/main/examples/WallPushUps_real.mp4")
53
+ print(f" https://huggingface.co/datasets/{REPO_ID}/resolve/main/examples/WallPushUps_bad.mp4")
videos.json ADDED
@@ -0,0 +1,1502 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_03_g09_c02.mp4",
4
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_03_g09_c02.mp4",
5
+ "action": "BodyWeightSquats"
6
+ },
7
+ {
8
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_02_df41b139.mp4",
9
+ "id": "Opensora_768/Opensora_768_WallPushups_02_df41b139.mp4",
10
+ "action": "WallPushups"
11
+ },
12
+ {
13
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_05_f710180a.mp4",
14
+ "id": "wan21_videos/wan21_videos_PushUps_05_f710180a.mp4",
15
+ "action": "PushUps"
16
+ },
17
+ {
18
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_06_3e4cc58d.mp4",
19
+ "id": "Opensora_768/Opensora_768_PullUps_06_3e4cc58d.mp4",
20
+ "action": "PullUps"
21
+ },
22
+ {
23
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_02_832c4e43.mp4",
24
+ "id": "wan21_videos/wan21_videos_HulaHoop_02_832c4e43.mp4",
25
+ "action": "HulaHoop"
26
+ },
27
+ {
28
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_01_11916263.mp4",
29
+ "id": "Opensora_768/Opensora_768_Shotput_01_11916263.mp4",
30
+ "action": "Shotput"
31
+ },
32
+ {
33
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_01_e5ac30e6.mp4",
34
+ "id": "wan21_videos/wan21_videos_PullUps_01_e5ac30e6.mp4",
35
+ "action": "PullUps"
36
+ },
37
+ {
38
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_01_90e8d35b.mp4",
39
+ "id": "RunwayGen4/RunwayGen4_Shotput_01_90e8d35b.mp4",
40
+ "action": "Shotput"
41
+ },
42
+ {
43
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_04_39be32d1.mp4",
44
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_04_39be32d1.mp4",
45
+ "action": "SoccerJuggling"
46
+ },
47
+ {
48
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_03_a2b2002a.mp4",
49
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_03_a2b2002a.mp4",
50
+ "action": "SoccerJuggling"
51
+ },
52
+ {
53
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_01_82a22401.mp4",
54
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_01_82a22401.mp4",
55
+ "action": "ThrowDiscus"
56
+ },
57
+ {
58
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_05_11e62665.mp4",
59
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_05_11e62665.mp4",
60
+ "action": "TennisSwing"
61
+ },
62
+ {
63
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_01_6735a09e.mp4",
64
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_01_6735a09e.mp4",
65
+ "action": "WallPushups"
66
+ },
67
+ {
68
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_06_10c02b51.mp4",
69
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_06_10c02b51.mp4",
70
+ "action": "BodyWeightSquats"
71
+ },
72
+ {
73
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_06_g20_c02.mp4",
74
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_06_g20_c02.mp4",
75
+ "action": "ThrowDiscus"
76
+ },
77
+ {
78
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_04_67083fd4.mp4",
79
+ "id": "wan21_videos/wan21_videos_WallPushups_04_67083fd4.mp4",
80
+ "action": "WallPushups"
81
+ },
82
+ {
83
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_02_g05_c02.mp4",
84
+ "id": "Wan2.2/Wan2.2_PullUps_02_g05_c02.mp4",
85
+ "action": "PullUps"
86
+ },
87
+ {
88
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_01_d65dd9bc.mp4",
89
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_01_d65dd9bc.mp4",
90
+ "action": "SoccerJuggling"
91
+ },
92
+ {
93
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_01_73f1e099.mp4",
94
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_01_73f1e099.mp4",
95
+ "action": "BodyWeightSquats"
96
+ },
97
+ {
98
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_02_fed4f169.mp4",
99
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_02_fed4f169.mp4",
100
+ "action": "ThrowDiscus"
101
+ },
102
+ {
103
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_05_9a245f8f.mp4",
104
+ "id": "wan21_videos/wan21_videos_WallPushups_05_9a245f8f.mp4",
105
+ "action": "WallPushups"
106
+ },
107
+ {
108
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_03_9c29d14e.mp4",
109
+ "id": "wan21_videos/wan21_videos_PushUps_03_9c29d14e.mp4",
110
+ "action": "PushUps"
111
+ },
112
+ {
113
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_05_3020a232.mp4",
114
+ "id": "wan21_videos/wan21_videos_HulaHoop_05_3020a232.mp4",
115
+ "action": "HulaHoop"
116
+ },
117
+ {
118
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_03_0a427fad.mp4",
119
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_03_0a427fad.mp4",
120
+ "action": "HulaHoop"
121
+ },
122
+ {
123
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_01_c1476478.mp4",
124
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_01_c1476478.mp4",
125
+ "action": "BodyWeightSquats"
126
+ },
127
+ {
128
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_02_bd228306.mp4",
129
+ "id": "RunwayGen4/RunwayGen4_WallPushups_02_bd228306.mp4",
130
+ "action": "WallPushups"
131
+ },
132
+ {
133
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_02_1ce3fa83.mp4",
134
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_02_1ce3fa83.mp4",
135
+ "action": "JumpingJack"
136
+ },
137
+ {
138
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_06_4802675c.mp4",
139
+ "id": "Opensora_768/Opensora_768_WallPushups_06_4802675c.mp4",
140
+ "action": "WallPushups"
141
+ },
142
+ {
143
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_06_0b0c0499.mp4",
144
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_06_0b0c0499.mp4",
145
+ "action": "TennisSwing"
146
+ },
147
+ {
148
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_03_b9e4ccfb.mp4",
149
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_03_b9e4ccfb.mp4",
150
+ "action": "SoccerJuggling"
151
+ },
152
+ {
153
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_01_g01_c01.mp4",
154
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_01_g01_c01.mp4",
155
+ "action": "ThrowDiscus"
156
+ },
157
+ {
158
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_01_08d40ea1.mp4",
159
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_01_08d40ea1.mp4",
160
+ "action": "BodyWeightSquats"
161
+ },
162
+ {
163
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_03_5f272f54.mp4",
164
+ "id": "wan21_videos/wan21_videos_HulaHoop_03_5f272f54.mp4",
165
+ "action": "HulaHoop"
166
+ },
167
+ {
168
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_03_71c5dede.mp4",
169
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_03_71c5dede.mp4",
170
+ "action": "ThrowDiscus"
171
+ },
172
+ {
173
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_04_93fbc0f1.mp4",
174
+ "id": "Opensora_768/Opensora_768_PullUps_04_93fbc0f1.mp4",
175
+ "action": "PullUps"
176
+ },
177
+ {
178
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_06_adf9f91c.mp4",
179
+ "id": "Opensora_768/Opensora_768_JumpingJack_06_adf9f91c.mp4",
180
+ "action": "JumpingJack"
181
+ },
182
+ {
183
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_05_g17_c03.mp4",
184
+ "id": "Wan2.2/Wan2.2_PullUps_05_g17_c03.mp4",
185
+ "action": "PullUps"
186
+ },
187
+ {
188
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_05_28871043.mp4",
189
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_05_28871043.mp4",
190
+ "action": "JumpingJack"
191
+ },
192
+ {
193
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_04_0a37734f.mp4",
194
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_04_0a37734f.mp4",
195
+ "action": "SoccerJuggling"
196
+ },
197
+ {
198
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_04_g13_c02.mp4",
199
+ "id": "Wan2.2/Wan2.2_JumpingJack_04_g13_c02.mp4",
200
+ "action": "JumpingJack"
201
+ },
202
+ {
203
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_01_f55f845b.mp4",
204
+ "id": "wan21_videos/wan21_videos_Shotput_01_f55f845b.mp4",
205
+ "action": "Shotput"
206
+ },
207
+ {
208
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_04_6061e7dd.mp4",
209
+ "id": "wan21_videos/wan21_videos_PushUps_04_6061e7dd.mp4",
210
+ "action": "PushUps"
211
+ },
212
+ {
213
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_02_0270e570.mp4",
214
+ "id": "wan21_videos/wan21_videos_PullUps_02_0270e570.mp4",
215
+ "action": "PullUps"
216
+ },
217
+ {
218
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_05_g20_c01.mp4",
219
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_05_g20_c01.mp4",
220
+ "action": "SoccerJuggling"
221
+ },
222
+ {
223
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_03_g08_c01.mp4",
224
+ "id": "Wan2.2/Wan2.2_Shotput_03_g08_c01.mp4",
225
+ "action": "Shotput"
226
+ },
227
+ {
228
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_05_b12b8572.mp4",
229
+ "id": "wan21_videos/wan21_videos_JumpingJack_05_b12b8572.mp4",
230
+ "action": "JumpingJack"
231
+ },
232
+ {
233
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_03_d2e17171.mp4",
234
+ "id": "Opensora_768/Opensora_768_Shotput_03_d2e17171.mp4",
235
+ "action": "Shotput"
236
+ },
237
+ {
238
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_06_b24bf4fa.mp4",
239
+ "id": "Opensora_768/Opensora_768_Shotput_06_b24bf4fa.mp4",
240
+ "action": "Shotput"
241
+ },
242
+ {
243
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_04_3baca80d.mp4",
244
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_04_3baca80d.mp4",
245
+ "action": "BodyWeightSquats"
246
+ },
247
+ {
248
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_01_g01_c01.mp4",
249
+ "id": "Wan2.2/Wan2.2_Shotput_01_g01_c01.mp4",
250
+ "action": "Shotput"
251
+ },
252
+ {
253
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_01_79c4ce29.mp4",
254
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_01_79c4ce29.mp4",
255
+ "action": "ThrowDiscus"
256
+ },
257
+ {
258
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_06_g16_c01.mp4",
259
+ "id": "Wan2.2/Wan2.2_JumpingJack_06_g16_c01.mp4",
260
+ "action": "JumpingJack"
261
+ },
262
+ {
263
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_02_13da5d63.mp4",
264
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_02_13da5d63.mp4",
265
+ "action": "HulaHoop"
266
+ },
267
+ {
268
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_04_g07_c02.mp4",
269
+ "id": "Wan2.2/Wan2.2_HulaHoop_04_g07_c02.mp4",
270
+ "action": "HulaHoop"
271
+ },
272
+ {
273
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_05_g09_c04.mp4",
274
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_05_g09_c04.mp4",
275
+ "action": "ThrowDiscus"
276
+ },
277
+ {
278
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_05_d23839a8.mp4",
279
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_05_d23839a8.mp4",
280
+ "action": "JumpingJack"
281
+ },
282
+ {
283
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_03_49fd58cd.mp4",
284
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_03_49fd58cd.mp4",
285
+ "action": "ThrowDiscus"
286
+ },
287
+ {
288
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_03_8ab576a5.mp4",
289
+ "id": "Opensora_768/Opensora_768_HulaHoop_03_8ab576a5.mp4",
290
+ "action": "HulaHoop"
291
+ },
292
+ {
293
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_01_e57bc009.mp4",
294
+ "id": "Opensora_768/Opensora_768_HulaHoop_01_e57bc009.mp4",
295
+ "action": "HulaHoop"
296
+ },
297
+ {
298
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_03_eb4d0c41.mp4",
299
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_03_eb4d0c41.mp4",
300
+ "action": "ThrowDiscus"
301
+ },
302
+ {
303
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_04_91dddb7e.mp4",
304
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_04_91dddb7e.mp4",
305
+ "action": "JumpingJack"
306
+ },
307
+ {
308
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_03_g10_c01.mp4",
309
+ "id": "Wan2.2/Wan2.2_PullUps_03_g10_c01.mp4",
310
+ "action": "PullUps"
311
+ },
312
+ {
313
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_04_fbfb6a1a.mp4",
314
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_04_fbfb6a1a.mp4",
315
+ "action": "BodyWeightSquats"
316
+ },
317
+ {
318
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_05_574342ae.mp4",
319
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_05_574342ae.mp4",
320
+ "action": "ThrowDiscus"
321
+ },
322
+ {
323
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_05_2215e29d.mp4",
324
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_05_2215e29d.mp4",
325
+ "action": "SoccerJuggling"
326
+ },
327
+ {
328
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_05_g19_c02.mp4",
329
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_05_g19_c02.mp4",
330
+ "action": "BodyWeightSquats"
331
+ },
332
+ {
333
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_02_d712a6a5.mp4",
334
+ "id": "Opensora_768/Opensora_768_Shotput_02_d712a6a5.mp4",
335
+ "action": "Shotput"
336
+ },
337
+ {
338
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_06_f9e2715d.mp4",
339
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_06_f9e2715d.mp4",
340
+ "action": "ThrowDiscus"
341
+ },
342
+ {
343
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_04_8520c287.mp4",
344
+ "id": "wan21_videos/wan21_videos_HulaHoop_04_8520c287.mp4",
345
+ "action": "HulaHoop"
346
+ },
347
+ {
348
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_05_g12_c06.mp4",
349
+ "id": "Wan2.2/Wan2.2_TennisSwing_05_g12_c06.mp4",
350
+ "action": "TennisSwing"
351
+ },
352
+ {
353
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_04_g08_c05.mp4",
354
+ "id": "Wan2.2/Wan2.2_Shotput_04_g08_c05.mp4",
355
+ "action": "Shotput"
356
+ },
357
+ {
358
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_02_g07_c01.mp4",
359
+ "id": "Wan2.2/Wan2.2_JumpingJack_02_g07_c01.mp4",
360
+ "action": "JumpingJack"
361
+ },
362
+ {
363
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_04_18a5ef3e.mp4",
364
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_04_18a5ef3e.mp4",
365
+ "action": "SoccerJuggling"
366
+ },
367
+ {
368
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_02_64a15481.mp4",
369
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_02_64a15481.mp4",
370
+ "action": "TennisSwing"
371
+ },
372
+ {
373
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_03_47356c05.mp4",
374
+ "id": "Opensora_768/Opensora_768_Tennisswing_03_47356c05.mp4",
375
+ "action": "TennisSwing"
376
+ },
377
+ {
378
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_05_a0c8bfa8.mp4",
379
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_05_a0c8bfa8.mp4",
380
+ "action": "BodyWeightSquats"
381
+ },
382
+ {
383
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_03_g09_c02.mp4",
384
+ "id": "Wan2.2/Wan2.2_JumpingJack_03_g09_c02.mp4",
385
+ "action": "JumpingJack"
386
+ },
387
+ {
388
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_02_240aed12.mp4",
389
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_02_240aed12.mp4",
390
+ "action": "BodyWeightSquats"
391
+ },
392
+ {
393
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_01_a8b512c7.mp4",
394
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_01_a8b512c7.mp4",
395
+ "action": "TennisSwing"
396
+ },
397
+ {
398
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_01_g05_c03.mp4",
399
+ "id": "Wan2.2/Wan2.2_JumpingJack_01_g05_c03.mp4",
400
+ "action": "JumpingJack"
401
+ },
402
+ {
403
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_04_318adee0.mp4",
404
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_04_318adee0.mp4",
405
+ "action": "JumpingJack"
406
+ },
407
+ {
408
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_06_30c9ec8f.mp4",
409
+ "id": "Opensora_768/Opensora_768_Tennisswing_06_30c9ec8f.mp4",
410
+ "action": "TennisSwing"
411
+ },
412
+ {
413
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_02_17850a86.mp4",
414
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_02_17850a86.mp4",
415
+ "action": "ThrowDiscus"
416
+ },
417
+ {
418
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_02_89bf331d.mp4",
419
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_02_89bf331d.mp4",
420
+ "action": "WallPushups"
421
+ },
422
+ {
423
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_06_987dae31.mp4",
424
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_06_987dae31.mp4",
425
+ "action": "BodyWeightSquats"
426
+ },
427
+ {
428
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_05_91865afa.mp4",
429
+ "id": "wan21_videos/wan21_videos_PullUps_05_91865afa.mp4",
430
+ "action": "PullUps"
431
+ },
432
+ {
433
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_03_4581452a.mp4",
434
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_03_4581452a.mp4",
435
+ "action": "JumpingJack"
436
+ },
437
+ {
438
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_04_g09_c06.mp4",
439
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_04_g09_c06.mp4",
440
+ "action": "BodyWeightSquats"
441
+ },
442
+ {
443
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_04_f4c10c1b.mp4",
444
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_04_f4c10c1b.mp4",
445
+ "action": "BodyWeightSquats"
446
+ },
447
+ {
448
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_06_fe64e6e4.mp4",
449
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_06_fe64e6e4.mp4",
450
+ "action": "ThrowDiscus"
451
+ },
452
+ {
453
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_06_e15aa0f4.mp4",
454
+ "id": "wan21_videos/wan21_videos_JumpingJack_06_e15aa0f4.mp4",
455
+ "action": "JumpingJack"
456
+ },
457
+ {
458
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_04_0945e41a.mp4",
459
+ "id": "Opensora_768/Opensora_768_WallPushups_04_0945e41a.mp4",
460
+ "action": "WallPushups"
461
+ },
462
+ {
463
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_01_386e724e.mp4",
464
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_01_386e724e.mp4",
465
+ "action": "HulaHoop"
466
+ },
467
+ {
468
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_02_f6efa427.mp4",
469
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_02_f6efa427.mp4",
470
+ "action": "PushUps"
471
+ },
472
+ {
473
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_06_4bb54a60.mp4",
474
+ "id": "wan21_videos/wan21_videos_PushUps_06_4bb54a60.mp4",
475
+ "action": "PushUps"
476
+ },
477
+ {
478
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_06_95938615.mp4",
479
+ "id": "wan21_videos/wan21_videos_WallPushups_06_95938615.mp4",
480
+ "action": "WallPushups"
481
+ },
482
+ {
483
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_06_08a68f99.mp4",
484
+ "id": "Opensora_768/Opensora_768_PushUps_06_08a68f99.mp4",
485
+ "action": "PushUps"
486
+ },
487
+ {
488
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_02_8f65ba58.mp4",
489
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_02_8f65ba58.mp4",
490
+ "action": "SoccerJuggling"
491
+ },
492
+ {
493
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_01_32383339.mp4",
494
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_01_32383339.mp4",
495
+ "action": "Shotput"
496
+ },
497
+ {
498
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_01_b985f8b4.mp4",
499
+ "id": "RunwayGen4/RunwayGen4_PushUps_01_b985f8b4.mp4",
500
+ "action": "PushUps"
501
+ },
502
+ {
503
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_04_e7f0f85b.mp4",
504
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_04_e7f0f85b.mp4",
505
+ "action": "BodyWeightSquats"
506
+ },
507
+ {
508
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_01_ca2d3151.mp4",
509
+ "id": "Opensora_768/Opensora_768_WallPushups_01_ca2d3151.mp4",
510
+ "action": "WallPushups"
511
+ },
512
+ {
513
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_03_99b2f12a.mp4",
514
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_03_99b2f12a.mp4",
515
+ "action": "BodyWeightSquats"
516
+ },
517
+ {
518
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_02_3dc2da40.mp4",
519
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_02_3dc2da40.mp4",
520
+ "action": "HulaHoop"
521
+ },
522
+ {
523
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_05_e2097551.mp4",
524
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_05_e2097551.mp4",
525
+ "action": "ThrowDiscus"
526
+ },
527
+ {
528
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_02_57557eb1.mp4",
529
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_02_57557eb1.mp4",
530
+ "action": "SoccerJuggling"
531
+ },
532
+ {
533
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_05_1f721e90.mp4",
534
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_05_1f721e90.mp4",
535
+ "action": "SoccerJuggling"
536
+ },
537
+ {
538
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_06_ca3f4082.mp4",
539
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_06_ca3f4082.mp4",
540
+ "action": "SoccerJuggling"
541
+ },
542
+ {
543
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_01_g02_c01.mp4",
544
+ "id": "Wan2.2/Wan2.2_PullUps_01_g02_c01.mp4",
545
+ "action": "PullUps"
546
+ },
547
+ {
548
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_03_g04_c03.mp4",
549
+ "id": "Wan2.2/Wan2.2_TennisSwing_03_g04_c03.mp4",
550
+ "action": "TennisSwing"
551
+ },
552
+ {
553
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_06_9cccde00.mp4",
554
+ "id": "wan21_videos/wan21_videos_Tennisswing_06_9cccde00.mp4",
555
+ "action": "TennisSwing"
556
+ },
557
+ {
558
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_03_a4328fd6.mp4",
559
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_03_a4328fd6.mp4",
560
+ "action": "ThrowDiscus"
561
+ },
562
+ {
563
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_06_15022cab.mp4",
564
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_06_15022cab.mp4",
565
+ "action": "SoccerJuggling"
566
+ },
567
+ {
568
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_03_6081e23f.mp4",
569
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_03_6081e23f.mp4",
570
+ "action": "HulaHoop"
571
+ },
572
+ {
573
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_04_ef655b57.mp4",
574
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_04_ef655b57.mp4",
575
+ "action": "SoccerJuggling"
576
+ },
577
+ {
578
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_02_36dd721e.mp4",
579
+ "id": "RunwayGen4/RunwayGen4_PullUps_02_36dd721e.mp4",
580
+ "action": "PullUps"
581
+ },
582
+ {
583
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_01_0b048d15.mp4",
584
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_01_0b048d15.mp4",
585
+ "action": "HulaHoop"
586
+ },
587
+ {
588
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_01_g02_c01.mp4",
589
+ "id": "Wan2.2/Wan2.2_HulaHoop_01_g02_c01.mp4",
590
+ "action": "HulaHoop"
591
+ },
592
+ {
593
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_02_g03_c01.mp4",
594
+ "id": "Wan2.2/Wan2.2_PushUps_02_g03_c01.mp4",
595
+ "action": "PushUps"
596
+ },
597
+ {
598
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_01_a33de3b1.mp4",
599
+ "id": "RunwayGen4/RunwayGen4_PullUps_01_a33de3b1.mp4",
600
+ "action": "PullUps"
601
+ },
602
+ {
603
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_02_g03_c02.mp4",
604
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_02_g03_c02.mp4",
605
+ "action": "ThrowDiscus"
606
+ },
607
+ {
608
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_05_2bafb529.mp4",
609
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_05_2bafb529.mp4",
610
+ "action": "PullUps"
611
+ },
612
+ {
613
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_04_0a2b0df0.mp4",
614
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_04_0a2b0df0.mp4",
615
+ "action": "PullUps"
616
+ },
617
+ {
618
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_04_37efe5b6.mp4",
619
+ "id": "Opensora_768/Opensora_768_Tennisswing_04_37efe5b6.mp4",
620
+ "action": "TennisSwing"
621
+ },
622
+ {
623
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_02_2ae6723f.mp4",
624
+ "id": "Opensora_768/Opensora_768_JumpingJack_02_2ae6723f.mp4",
625
+ "action": "JumpingJack"
626
+ },
627
+ {
628
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_04_g13_c03.mp4",
629
+ "id": "Wan2.2/Wan2.2_PullUps_04_g13_c03.mp4",
630
+ "action": "PullUps"
631
+ },
632
+ {
633
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_01_1a3ca8e1.mp4",
634
+ "id": "wan21_videos/wan21_videos_WallPushups_01_1a3ca8e1.mp4",
635
+ "action": "WallPushups"
636
+ },
637
+ {
638
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_02_c2a20010.mp4",
639
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_02_c2a20010.mp4",
640
+ "action": "ThrowDiscus"
641
+ },
642
+ {
643
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_03_g05_c01.mp4",
644
+ "id": "Wan2.2/Wan2.2_WallPushups_03_g05_c01.mp4",
645
+ "action": "WallPushups"
646
+ },
647
+ {
648
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_02_13954784.mp4",
649
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_02_13954784.mp4",
650
+ "action": "ThrowDiscus"
651
+ },
652
+ {
653
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_05_20abe027.mp4",
654
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_05_20abe027.mp4",
655
+ "action": "ThrowDiscus"
656
+ },
657
+ {
658
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_02_16fedfb4.mp4",
659
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_02_16fedfb4.mp4",
660
+ "action": "BodyWeightSquats"
661
+ },
662
+ {
663
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_04_870cd7b3.mp4",
664
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_04_870cd7b3.mp4",
665
+ "action": "PushUps"
666
+ },
667
+ {
668
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_04_g07_c02.mp4",
669
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_04_g07_c02.mp4",
670
+ "action": "ThrowDiscus"
671
+ },
672
+ {
673
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_03_135eddba.mp4",
674
+ "id": "Opensora_768/Opensora_768_WallPushups_03_135eddba.mp4",
675
+ "action": "WallPushups"
676
+ },
677
+ {
678
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_03_2d063f70.mp4",
679
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_03_2d063f70.mp4",
680
+ "action": "PushUps"
681
+ },
682
+ {
683
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_03_0de0f8f8.mp4",
684
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_03_0de0f8f8.mp4",
685
+ "action": "JumpingJack"
686
+ },
687
+ {
688
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_04_cce5438f.mp4",
689
+ "id": "RunwayGen4/RunwayGen4_Shotput_04_cce5438f.mp4",
690
+ "action": "Shotput"
691
+ },
692
+ {
693
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_02_g02_c03.mp4",
694
+ "id": "Wan2.2/Wan2.2_HulaHoop_02_g02_c03.mp4",
695
+ "action": "HulaHoop"
696
+ },
697
+ {
698
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_02_g03_c01.mp4",
699
+ "id": "Wan2.2/Wan2.2_TennisSwing_02_g03_c01.mp4",
700
+ "action": "TennisSwing"
701
+ },
702
+ {
703
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_04_751371c5.mp4",
704
+ "id": "Opensora_768/Opensora_768_JumpingJack_04_751371c5.mp4",
705
+ "action": "JumpingJack"
706
+ },
707
+ {
708
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_02_g05_c01.mp4",
709
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_02_g05_c01.mp4",
710
+ "action": "BodyWeightSquats"
711
+ },
712
+ {
713
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_02_de98f87e.mp4",
714
+ "id": "Opensora_768/Opensora_768_PushUps_02_de98f87e.mp4",
715
+ "action": "PushUps"
716
+ },
717
+ {
718
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_06_g19_c03.mp4",
719
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_06_g19_c03.mp4",
720
+ "action": "BodyWeightSquats"
721
+ },
722
+ {
723
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_06_g23_c02.mp4",
724
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_06_g23_c02.mp4",
725
+ "action": "SoccerJuggling"
726
+ },
727
+ {
728
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_06_ca03aa4a.mp4",
729
+ "id": "wan21_videos/wan21_videos_PullUps_06_ca03aa4a.mp4",
730
+ "action": "PullUps"
731
+ },
732
+ {
733
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_01_8c670248.mp4",
734
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_01_8c670248.mp4",
735
+ "action": "TennisSwing"
736
+ },
737
+ {
738
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_05_05f546db.mp4",
739
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_05_05f546db.mp4",
740
+ "action": "PushUps"
741
+ },
742
+ {
743
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_04_f7083375.mp4",
744
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_04_f7083375.mp4",
745
+ "action": "ThrowDiscus"
746
+ },
747
+ {
748
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_05_d33be2c6.mp4",
749
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_05_d33be2c6.mp4",
750
+ "action": "Shotput"
751
+ },
752
+ {
753
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_01_g02_c01.mp4",
754
+ "id": "Wan2.2/Wan2.2_WallPushups_01_g02_c01.mp4",
755
+ "action": "WallPushups"
756
+ },
757
+ {
758
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_01_039c991e.mp4",
759
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_01_039c991e.mp4",
760
+ "action": "SoccerJuggling"
761
+ },
762
+ {
763
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_03_124bba2d.mp4",
764
+ "id": "Opensora_768/Opensora_768_PushUps_03_124bba2d.mp4",
765
+ "action": "PushUps"
766
+ },
767
+ {
768
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_06_27b32002.mp4",
769
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_06_27b32002.mp4",
770
+ "action": "PullUps"
771
+ },
772
+ {
773
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_06_1337a14b.mp4",
774
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_06_1337a14b.mp4",
775
+ "action": "BodyWeightSquats"
776
+ },
777
+ {
778
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_02_37b966f6.mp4",
779
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_02_37b966f6.mp4",
780
+ "action": "TennisSwing"
781
+ },
782
+ {
783
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_04_57ce405a.mp4",
784
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_04_57ce405a.mp4",
785
+ "action": "WallPushups"
786
+ },
787
+ {
788
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_05_g14_c01.mp4",
789
+ "id": "Wan2.2/Wan2.2_PushUps_05_g14_c01.mp4",
790
+ "action": "PushUps"
791
+ },
792
+ {
793
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_03_7fa39ef8.mp4",
794
+ "id": "wan21_videos/wan21_videos_Tennisswing_03_7fa39ef8.mp4",
795
+ "action": "TennisSwing"
796
+ },
797
+ {
798
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_01_4592ec5d.mp4",
799
+ "id": "Opensora_768/Opensora_768_Tennisswing_01_4592ec5d.mp4",
800
+ "action": "TennisSwing"
801
+ },
802
+ {
803
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_04_92589630.mp4",
804
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_04_92589630.mp4",
805
+ "action": "HulaHoop"
806
+ },
807
+ {
808
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_03_01897670.mp4",
809
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_03_01897670.mp4",
810
+ "action": "SoccerJuggling"
811
+ },
812
+ {
813
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_01_d18d1fc8.mp4",
814
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_01_d18d1fc8.mp4",
815
+ "action": "ThrowDiscus"
816
+ },
817
+ {
818
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_04_8b697353.mp4",
819
+ "id": "wan21_videos/wan21_videos_Shotput_04_8b697353.mp4",
820
+ "action": "Shotput"
821
+ },
822
+ {
823
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_05_5a005076.mp4",
824
+ "id": "wan21_videos/wan21_videos_Shotput_05_5a005076.mp4",
825
+ "action": "Shotput"
826
+ },
827
+ {
828
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_02_daf8c2a3.mp4",
829
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_02_daf8c2a3.mp4",
830
+ "action": "Shotput"
831
+ },
832
+ {
833
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_01_0461b27e.mp4",
834
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_01_0461b27e.mp4",
835
+ "action": "SoccerJuggling"
836
+ },
837
+ {
838
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_01_2d802da3.mp4",
839
+ "id": "wan21_videos/wan21_videos_HulaHoop_01_2d802da3.mp4",
840
+ "action": "HulaHoop"
841
+ },
842
+ {
843
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_05_g07_c05.mp4",
844
+ "id": "Wan2.2/Wan2.2_HulaHoop_05_g07_c05.mp4",
845
+ "action": "HulaHoop"
846
+ },
847
+ {
848
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_06_688aa3f1.mp4",
849
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_06_688aa3f1.mp4",
850
+ "action": "Shotput"
851
+ },
852
+ {
853
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_04_a9559b18.mp4",
854
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_04_a9559b18.mp4",
855
+ "action": "ThrowDiscus"
856
+ },
857
+ {
858
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_01_85c12aa7.mp4",
859
+ "id": "wan21_videos/wan21_videos_Tennisswing_01_85c12aa7.mp4",
860
+ "action": "TennisSwing"
861
+ },
862
+ {
863
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_01_d04d7e41.mp4",
864
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_01_d04d7e41.mp4",
865
+ "action": "SoccerJuggling"
866
+ },
867
+ {
868
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_02_854b5a52.mp4",
869
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_02_854b5a52.mp4",
870
+ "action": "BodyWeightSquats"
871
+ },
872
+ {
873
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_HulaHoop_06_0010c541.mp4",
874
+ "id": "wan21_videos/wan21_videos_HulaHoop_06_0010c541.mp4",
875
+ "action": "HulaHoop"
876
+ },
877
+ {
878
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_01_g02_c01.mp4",
879
+ "id": "Wan2.2/Wan2.2_TennisSwing_01_g02_c01.mp4",
880
+ "action": "TennisSwing"
881
+ },
882
+ {
883
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_06_b98c70ea.mp4",
884
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_06_b98c70ea.mp4",
885
+ "action": "SoccerJuggling"
886
+ },
887
+ {
888
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_06_b4d9ddbb.mp4",
889
+ "id": "RunwayGen4/RunwayGen4_PushUps_06_b4d9ddbb.mp4",
890
+ "action": "PushUps"
891
+ },
892
+ {
893
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_04_g11_c01.mp4",
894
+ "id": "Wan2.2/Wan2.2_TennisSwing_04_g11_c01.mp4",
895
+ "action": "TennisSwing"
896
+ },
897
+ {
898
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_01_6c42fbe6.mp4",
899
+ "id": "Opensora_768/Opensora_768_PushUps_01_6c42fbe6.mp4",
900
+ "action": "PushUps"
901
+ },
902
+ {
903
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_05_73b46dc2.mp4",
904
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_05_73b46dc2.mp4",
905
+ "action": "WallPushups"
906
+ },
907
+ {
908
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_01_62d9a6d5.mp4",
909
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_01_62d9a6d5.mp4",
910
+ "action": "PullUps"
911
+ },
912
+ {
913
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_04_g10_c03.mp4",
914
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_04_g10_c03.mp4",
915
+ "action": "SoccerJuggling"
916
+ },
917
+ {
918
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_02_09a7c221.mp4",
919
+ "id": "wan21_videos/wan21_videos_Tennisswing_02_09a7c221.mp4",
920
+ "action": "TennisSwing"
921
+ },
922
+ {
923
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_05_531ccb86.mp4",
924
+ "id": "Opensora_768/Opensora_768_HulaHoop_05_531ccb86.mp4",
925
+ "action": "HulaHoop"
926
+ },
927
+ {
928
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_06_48e36083.mp4",
929
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_06_48e36083.mp4",
930
+ "action": "BodyWeightSquats"
931
+ },
932
+ {
933
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_03_fd0e908f.mp4",
934
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_03_fd0e908f.mp4",
935
+ "action": "TennisSwing"
936
+ },
937
+ {
938
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_01_g01_c01.mp4",
939
+ "id": "Wan2.2/Wan2.2_PushUps_01_g01_c01.mp4",
940
+ "action": "PushUps"
941
+ },
942
+ {
943
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_03_8a12d8b5.mp4",
944
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_03_8a12d8b5.mp4",
945
+ "action": "TennisSwing"
946
+ },
947
+ {
948
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_03_8c53eed6.mp4",
949
+ "id": "RunwayGen4/RunwayGen4_PushUps_03_8c53eed6.mp4",
950
+ "action": "PushUps"
951
+ },
952
+ {
953
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_06_a22fa5b2.mp4",
954
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_06_a22fa5b2.mp4",
955
+ "action": "PushUps"
956
+ },
957
+ {
958
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_05_befb8f0c.mp4",
959
+ "id": "Opensora_768/Opensora_768_JumpingJack_05_befb8f0c.mp4",
960
+ "action": "JumpingJack"
961
+ },
962
+ {
963
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_ThrowDiscus_06_96ee399f.mp4",
964
+ "id": "RunwayGen4/RunwayGen4_ThrowDiscus_06_96ee399f.mp4",
965
+ "action": "ThrowDiscus"
966
+ },
967
+ {
968
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_05_c1130eb4.mp4",
969
+ "id": "wan21_videos/wan21_videos_Tennisswing_05_c1130eb4.mp4",
970
+ "action": "TennisSwing"
971
+ },
972
+ {
973
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_02_d87a2478.mp4",
974
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_02_d87a2478.mp4",
975
+ "action": "PullUps"
976
+ },
977
+ {
978
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_05_8e657567.mp4",
979
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_05_8e657567.mp4",
980
+ "action": "HulaHoop"
981
+ },
982
+ {
983
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_03_4851dc25.mp4",
984
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_03_4851dc25.mp4",
985
+ "action": "BodyWeightSquats"
986
+ },
987
+ {
988
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_06_g17_c01.mp4",
989
+ "id": "Wan2.2/Wan2.2_PushUps_06_g17_c01.mp4",
990
+ "action": "PushUps"
991
+ },
992
+ {
993
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_04_0bdf3a08.mp4",
994
+ "id": "Opensora_768/Opensora_768_HulaHoop_04_0bdf3a08.mp4",
995
+ "action": "HulaHoop"
996
+ },
997
+ {
998
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_02_2887dc9e.mp4",
999
+ "id": "wan21_videos/wan21_videos_JumpingJack_02_2887dc9e.mp4",
1000
+ "action": "JumpingJack"
1001
+ },
1002
+ {
1003
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_BodyWeightSquats_01_c65e1949.mp4",
1004
+ "id": "wan21_videos/wan21_videos_BodyWeightSquats_01_c65e1949.mp4",
1005
+ "action": "BodyWeightSquats"
1006
+ },
1007
+ {
1008
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_02_36e022c0.mp4",
1009
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_02_36e022c0.mp4",
1010
+ "action": "JumpingJack"
1011
+ },
1012
+ {
1013
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_05_a5b2ac15.mp4",
1014
+ "id": "RunwayGen4/RunwayGen4_WallPushups_05_a5b2ac15.mp4",
1015
+ "action": "WallPushups"
1016
+ },
1017
+ {
1018
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_06_g16_c02.mp4",
1019
+ "id": "Wan2.2/Wan2.2_Shotput_06_g16_c02.mp4",
1020
+ "action": "Shotput"
1021
+ },
1022
+ {
1023
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_03_a04022d8.mp4",
1024
+ "id": "RunwayGen4/RunwayGen4_Shotput_03_a04022d8.mp4",
1025
+ "action": "Shotput"
1026
+ },
1027
+ {
1028
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_03_d31b1955.mp4",
1029
+ "id": "wan21_videos/wan21_videos_Shotput_03_d31b1955.mp4",
1030
+ "action": "Shotput"
1031
+ },
1032
+ {
1033
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_04_91ded27c.mp4",
1034
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_04_91ded27c.mp4",
1035
+ "action": "TennisSwing"
1036
+ },
1037
+ {
1038
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_03_g04_c01.mp4",
1039
+ "id": "Wan2.2/Wan2.2_PushUps_03_g04_c01.mp4",
1040
+ "action": "PushUps"
1041
+ },
1042
+ {
1043
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_05_g12_c03.mp4",
1044
+ "id": "Wan2.2/Wan2.2_Shotput_05_g12_c03.mp4",
1045
+ "action": "Shotput"
1046
+ },
1047
+ {
1048
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_06_7160fb8b.mp4",
1049
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_06_7160fb8b.mp4",
1050
+ "action": "WallPushups"
1051
+ },
1052
+ {
1053
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_04_b0f7a67b.mp4",
1054
+ "id": "Opensora_768/Opensora_768_PushUps_04_b0f7a67b.mp4",
1055
+ "action": "PushUps"
1056
+ },
1057
+ {
1058
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_06_14a33e9e.mp4",
1059
+ "id": "Opensora_768/Opensora_768_HulaHoop_06_14a33e9e.mp4",
1060
+ "action": "HulaHoop"
1061
+ },
1062
+ {
1063
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_05_5efcfaee.mp4",
1064
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_05_5efcfaee.mp4",
1065
+ "action": "TennisSwing"
1066
+ },
1067
+ {
1068
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_05_1bf77fb7.mp4",
1069
+ "id": "Opensora_768/Opensora_768_Tennisswing_05_1bf77fb7.mp4",
1070
+ "action": "TennisSwing"
1071
+ },
1072
+ {
1073
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_03_7b07b169.mp4",
1074
+ "id": "wan21_videos/wan21_videos_PullUps_03_7b07b169.mp4",
1075
+ "action": "PullUps"
1076
+ },
1077
+ {
1078
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_04_9fee46c2.mp4",
1079
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_04_9fee46c2.mp4",
1080
+ "action": "HulaHoop"
1081
+ },
1082
+ {
1083
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_06_9137a496.mp4",
1084
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_06_9137a496.mp4",
1085
+ "action": "JumpingJack"
1086
+ },
1087
+ {
1088
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_HulaHoop_02_083e5e16.mp4",
1089
+ "id": "Opensora_768/Opensora_768_HulaHoop_02_083e5e16.mp4",
1090
+ "action": "HulaHoop"
1091
+ },
1092
+ {
1093
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PullUps_04_7ec3a3f2.mp4",
1094
+ "id": "wan21_videos/wan21_videos_PullUps_04_7ec3a3f2.mp4",
1095
+ "action": "PullUps"
1096
+ },
1097
+ {
1098
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_03_56724bec.mp4",
1099
+ "id": "RunwayGen4/RunwayGen4_PullUps_03_56724bec.mp4",
1100
+ "action": "PullUps"
1101
+ },
1102
+ {
1103
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_05_ee3f4c96.mp4",
1104
+ "id": "RunwayGen4/RunwayGen4_PullUps_05_ee3f4c96.mp4",
1105
+ "action": "PullUps"
1106
+ },
1107
+ {
1108
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_03_g07_c01.mp4",
1109
+ "id": "Wan2.2/Wan2.2_HulaHoop_03_g07_c01.mp4",
1110
+ "action": "HulaHoop"
1111
+ },
1112
+ {
1113
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_04_3e061e33.mp4",
1114
+ "id": "Opensora_768/Opensora_768_Shotput_04_3e061e33.mp4",
1115
+ "action": "Shotput"
1116
+ },
1117
+ {
1118
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PullUps_03_ad01d9cc.mp4",
1119
+ "id": "Hunyuan_videos/Hunyuan_videos_PullUps_03_ad01d9cc.mp4",
1120
+ "action": "PullUps"
1121
+ },
1122
+ {
1123
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PullUps_06_g19_c01.mp4",
1124
+ "id": "Wan2.2/Wan2.2_PullUps_06_g19_c01.mp4",
1125
+ "action": "PullUps"
1126
+ },
1127
+ {
1128
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_02_e1b81fe5.mp4",
1129
+ "id": "wan21_videos/wan21_videos_Shotput_02_e1b81fe5.mp4",
1130
+ "action": "Shotput"
1131
+ },
1132
+ {
1133
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_06_0a886c54.mp4",
1134
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_06_0a886c54.mp4",
1135
+ "action": "SoccerJuggling"
1136
+ },
1137
+ {
1138
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_06_303e0ca0.mp4",
1139
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_06_303e0ca0.mp4",
1140
+ "action": "JumpingJack"
1141
+ },
1142
+ {
1143
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_JumpingJack_01_68d301af.mp4",
1144
+ "id": "Hunyuan_videos/Hunyuan_videos_JumpingJack_01_68d301af.mp4",
1145
+ "action": "JumpingJack"
1146
+ },
1147
+ {
1148
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_02_7fc3b521.mp4",
1149
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_02_7fc3b521.mp4",
1150
+ "action": "SoccerJuggling"
1151
+ },
1152
+ {
1153
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_05_g09_c01.mp4",
1154
+ "id": "Wan2.2/Wan2.2_WallPushups_05_g09_c01.mp4",
1155
+ "action": "WallPushups"
1156
+ },
1157
+ {
1158
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_WallPushups_05_b0a4c545.mp4",
1159
+ "id": "Opensora_768/Opensora_768_WallPushups_05_b0a4c545.mp4",
1160
+ "action": "WallPushups"
1161
+ },
1162
+ {
1163
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_SoccerJuggling_03_e6166d75.mp4",
1164
+ "id": "RunwayGen4/RunwayGen4_SoccerJuggling_03_e6166d75.mp4",
1165
+ "action": "SoccerJuggling"
1166
+ },
1167
+ {
1168
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_04_44dc1c12.mp4",
1169
+ "id": "RunwayGen4/RunwayGen4_WallPushups_04_44dc1c12.mp4",
1170
+ "action": "WallPushups"
1171
+ },
1172
+ {
1173
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_WallPushups_03_ce7983dc.mp4",
1174
+ "id": "Hunyuan_videos/Hunyuan_videos_WallPushups_03_ce7983dc.mp4",
1175
+ "action": "WallPushups"
1176
+ },
1177
+ {
1178
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_TennisSwing_04_178eaa46.mp4",
1179
+ "id": "RunwayGen4/RunwayGen4_TennisSwing_04_178eaa46.mp4",
1180
+ "action": "TennisSwing"
1181
+ },
1182
+ {
1183
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_03_ae8362a4.mp4",
1184
+ "id": "wan21_videos/wan21_videos_JumpingJack_03_ae8362a4.mp4",
1185
+ "action": "JumpingJack"
1186
+ },
1187
+ {
1188
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Tennisswing_04_76ef1277.mp4",
1189
+ "id": "wan21_videos/wan21_videos_Tennisswing_04_76ef1277.mp4",
1190
+ "action": "TennisSwing"
1191
+ },
1192
+ {
1193
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PushUps_05_182820c5.mp4",
1194
+ "id": "Opensora_768/Opensora_768_PushUps_05_182820c5.mp4",
1195
+ "action": "PushUps"
1196
+ },
1197
+ {
1198
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_PushUps_01_be27b793.mp4",
1199
+ "id": "Hunyuan_videos/Hunyuan_videos_PushUps_01_be27b793.mp4",
1200
+ "action": "PushUps"
1201
+ },
1202
+ {
1203
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_04_86eceef3.mp4",
1204
+ "id": "RunwayGen4/RunwayGen4_PushUps_04_86eceef3.mp4",
1205
+ "action": "PushUps"
1206
+ },
1207
+ {
1208
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_01_6c51761c.mp4",
1209
+ "id": "Opensora_768/Opensora_768_PullUps_01_6c51761c.mp4",
1210
+ "action": "PullUps"
1211
+ },
1212
+ {
1213
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Tennisswing_02_f7de7e42.mp4",
1214
+ "id": "Opensora_768/Opensora_768_Tennisswing_02_f7de7e42.mp4",
1215
+ "action": "TennisSwing"
1216
+ },
1217
+ {
1218
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Soccerjuggling_05_7d3d922a.mp4",
1219
+ "id": "Hunyuan_videos/Hunyuan_videos_Soccerjuggling_05_7d3d922a.mp4",
1220
+ "action": "SoccerJuggling"
1221
+ },
1222
+ {
1223
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_03_6c0e3503.mp4",
1224
+ "id": "Opensora_768/Opensora_768_JumpingJack_03_6c0e3503.mp4",
1225
+ "action": "JumpingJack"
1226
+ },
1227
+ {
1228
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_05_8ce7dac9.mp4",
1229
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_05_8ce7dac9.mp4",
1230
+ "action": "ThrowDiscus"
1231
+ },
1232
+ {
1233
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_JumpingJack_01_06eec439.mp4",
1234
+ "id": "RunwayGen4/RunwayGen4_JumpingJack_01_06eec439.mp4",
1235
+ "action": "JumpingJack"
1236
+ },
1237
+ {
1238
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_03_704511ec.mp4",
1239
+ "id": "wan21_videos/wan21_videos_WallPushups_03_704511ec.mp4",
1240
+ "action": "WallPushups"
1241
+ },
1242
+ {
1243
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_06_deb18b9d.mp4",
1244
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_06_deb18b9d.mp4",
1245
+ "action": "HulaHoop"
1246
+ },
1247
+ {
1248
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_02_8aa27613.mp4",
1249
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_02_8aa27613.mp4",
1250
+ "action": "BodyWeightSquats"
1251
+ },
1252
+ {
1253
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_03_f382ad38.mp4",
1254
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_03_f382ad38.mp4",
1255
+ "action": "Shotput"
1256
+ },
1257
+ {
1258
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_HulaHoop_06_g09_c01.mp4",
1259
+ "id": "Wan2.2/Wan2.2_HulaHoop_06_g09_c01.mp4",
1260
+ "action": "HulaHoop"
1261
+ },
1262
+ {
1263
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_03_2daf3834.mp4",
1264
+ "id": "Opensora_768/Opensora_768_PullUps_03_2daf3834.mp4",
1265
+ "action": "PullUps"
1266
+ },
1267
+ {
1268
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_06_g13_c01.mp4",
1269
+ "id": "Wan2.2/Wan2.2_WallPushups_06_g13_c01.mp4",
1270
+ "action": "WallPushups"
1271
+ },
1272
+ {
1273
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_ThrowDiscus_03_g05_c01.mp4",
1274
+ "id": "Wan2.2/Wan2.2_ThrowDiscus_03_g05_c01.mp4",
1275
+ "action": "ThrowDiscus"
1276
+ },
1277
+ {
1278
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_05_ffda8f1d.mp4",
1279
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_05_ffda8f1d.mp4",
1280
+ "action": "BodyWeightSquats"
1281
+ },
1282
+ {
1283
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_TennisSwing_06_g18_c02.mp4",
1284
+ "id": "Wan2.2/Wan2.2_TennisSwing_06_g18_c02.mp4",
1285
+ "action": "TennisSwing"
1286
+ },
1287
+ {
1288
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_05_586c2759.mp4",
1289
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_05_586c2759.mp4",
1290
+ "action": "BodyWeightSquats"
1291
+ },
1292
+ {
1293
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_01_2c0d7bfd.mp4",
1294
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_01_2c0d7bfd.mp4",
1295
+ "action": "ThrowDiscus"
1296
+ },
1297
+ {
1298
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_04_g06_c02.mp4",
1299
+ "id": "Wan2.2/Wan2.2_WallPushups_04_g06_c02.mp4",
1300
+ "action": "WallPushups"
1301
+ },
1302
+ {
1303
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_BodyWeightSquats_01_g01_c01.mp4",
1304
+ "id": "Wan2.2/Wan2.2_BodyWeightSquats_01_g01_c01.mp4",
1305
+ "action": "BodyWeightSquats"
1306
+ },
1307
+ {
1308
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Shotput_04_8a03498f.mp4",
1309
+ "id": "Hunyuan_videos/Hunyuan_videos_Shotput_04_8a03498f.mp4",
1310
+ "action": "Shotput"
1311
+ },
1312
+ {
1313
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_04_cc515823.mp4",
1314
+ "id": "wan21_videos/wan21_videos_JumpingJack_04_cc515823.mp4",
1315
+ "action": "JumpingJack"
1316
+ },
1317
+ {
1318
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_02_0930b95a.mp4",
1319
+ "id": "Opensora_768/Opensora_768_PullUps_02_0930b95a.mp4",
1320
+ "action": "PullUps"
1321
+ },
1322
+ {
1323
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_PullUps_05_41a0f3bd.mp4",
1324
+ "id": "Opensora_768/Opensora_768_PullUps_05_41a0f3bd.mp4",
1325
+ "action": "PullUps"
1326
+ },
1327
+ {
1328
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_06_ab4d90d7.mp4",
1329
+ "id": "RunwayGen4/RunwayGen4_WallPushups_06_ab4d90d7.mp4",
1330
+ "action": "WallPushups"
1331
+ },
1332
+ {
1333
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_05_fcfd2ad3.mp4",
1334
+ "id": "RunwayGen4/RunwayGen4_PushUps_05_fcfd2ad3.mp4",
1335
+ "action": "PushUps"
1336
+ },
1337
+ {
1338
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_HulaHoop_06_d78c5d93.mp4",
1339
+ "id": "Hunyuan_videos/Hunyuan_videos_HulaHoop_06_d78c5d93.mp4",
1340
+ "action": "HulaHoop"
1341
+ },
1342
+ {
1343
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_Shotput_02_g07_c03.mp4",
1344
+ "id": "Wan2.2/Wan2.2_Shotput_02_g07_c03.mp4",
1345
+ "action": "Shotput"
1346
+ },
1347
+ {
1348
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Soccerjuggling_05_9c479e28.mp4",
1349
+ "id": "wan21_videos/wan21_videos_Soccerjuggling_05_9c479e28.mp4",
1350
+ "action": "SoccerJuggling"
1351
+ },
1352
+ {
1353
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_ThrowDiscus_06_09a14685.mp4",
1354
+ "id": "wan21_videos/wan21_videos_ThrowDiscus_06_09a14685.mp4",
1355
+ "action": "ThrowDiscus"
1356
+ },
1357
+ {
1358
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_06_61377774.mp4",
1359
+ "id": "RunwayGen4/RunwayGen4_Shotput_06_61377774.mp4",
1360
+ "action": "Shotput"
1361
+ },
1362
+ {
1363
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_JumpingJack_05_g14_c01.mp4",
1364
+ "id": "Wan2.2/Wan2.2_JumpingJack_05_g14_c01.mp4",
1365
+ "action": "JumpingJack"
1366
+ },
1367
+ {
1368
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_01_6baa038a.mp4",
1369
+ "id": "wan21_videos/wan21_videos_PushUps_01_6baa038a.mp4",
1370
+ "action": "PushUps"
1371
+ },
1372
+ {
1373
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_PushUps_02_839540a7.mp4",
1374
+ "id": "wan21_videos/wan21_videos_PushUps_02_839540a7.mp4",
1375
+ "action": "PushUps"
1376
+ },
1377
+ {
1378
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_Tennisswing_06_bb80e7c4.mp4",
1379
+ "id": "Hunyuan_videos/Hunyuan_videos_Tennisswing_06_bb80e7c4.mp4",
1380
+ "action": "TennisSwing"
1381
+ },
1382
+ {
1383
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_04_96757669.mp4",
1384
+ "id": "RunwayGen4/RunwayGen4_PullUps_04_96757669.mp4",
1385
+ "action": "PullUps"
1386
+ },
1387
+ {
1388
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_01_g02_c02.mp4",
1389
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_01_g02_c02.mp4",
1390
+ "action": "SoccerJuggling"
1391
+ },
1392
+ {
1393
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_02_455cfce3.mp4",
1394
+ "id": "RunwayGen4/RunwayGen4_Shotput_02_455cfce3.mp4",
1395
+ "action": "Shotput"
1396
+ },
1397
+ {
1398
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_01_a09ec727.mp4",
1399
+ "id": "RunwayGen4/RunwayGen4_WallPushups_01_a09ec727.mp4",
1400
+ "action": "WallPushups"
1401
+ },
1402
+ {
1403
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_03_88c332fc.mp4",
1404
+ "id": "Hunyuan_videos/Hunyuan_videos_BodyWeightSquats_03_88c332fc.mp4",
1405
+ "action": "BodyWeightSquats"
1406
+ },
1407
+ {
1408
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_Shotput_06_c6441ef8.mp4",
1409
+ "id": "wan21_videos/wan21_videos_Shotput_06_c6441ef8.mp4",
1410
+ "action": "Shotput"
1411
+ },
1412
+ {
1413
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_BodyWeightSquats_05_f31479e5.mp4",
1414
+ "id": "Opensora_768/Opensora_768_BodyWeightSquats_05_f31479e5.mp4",
1415
+ "action": "BodyWeightSquats"
1416
+ },
1417
+ {
1418
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Soccerjuggling_02_35358a25.mp4",
1419
+ "id": "Opensora_768/Opensora_768_Soccerjuggling_02_35358a25.mp4",
1420
+ "action": "SoccerJuggling"
1421
+ },
1422
+ {
1423
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Hunyuan_videos/Hunyuan_videos_ThrowDiscus_04_c598b9d1.mp4",
1424
+ "id": "Hunyuan_videos/Hunyuan_videos_ThrowDiscus_04_c598b9d1.mp4",
1425
+ "action": "ThrowDiscus"
1426
+ },
1427
+ {
1428
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PushUps_02_582e8a8f.mp4",
1429
+ "id": "RunwayGen4/RunwayGen4_PushUps_02_582e8a8f.mp4",
1430
+ "action": "PushUps"
1431
+ },
1432
+ {
1433
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_Shotput_05_26ec7ac5.mp4",
1434
+ "id": "RunwayGen4/RunwayGen4_Shotput_05_26ec7ac5.mp4",
1435
+ "action": "Shotput"
1436
+ },
1437
+ {
1438
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_02_g03_c01.mp4",
1439
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_02_g03_c01.mp4",
1440
+ "action": "SoccerJuggling"
1441
+ },
1442
+ {
1443
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_WallPushups_02_8f800db9.mp4",
1444
+ "id": "wan21_videos/wan21_videos_WallPushups_02_8f800db9.mp4",
1445
+ "action": "WallPushups"
1446
+ },
1447
+ {
1448
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_ThrowDiscus_04_7d4c3099.mp4",
1449
+ "id": "Opensora_768/Opensora_768_ThrowDiscus_04_7d4c3099.mp4",
1450
+ "action": "ThrowDiscus"
1451
+ },
1452
+ {
1453
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_JumpingJack_01_66318db4.mp4",
1454
+ "id": "Opensora_768/Opensora_768_JumpingJack_01_66318db4.mp4",
1455
+ "action": "JumpingJack"
1456
+ },
1457
+ {
1458
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Opensora_768/Opensora_768_Shotput_05_5e12b84d.mp4",
1459
+ "id": "Opensora_768/Opensora_768_Shotput_05_5e12b84d.mp4",
1460
+ "action": "Shotput"
1461
+ },
1462
+ {
1463
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_WallPushups_02_g04_c01.mp4",
1464
+ "id": "Wan2.2/Wan2.2_WallPushups_02_g04_c01.mp4",
1465
+ "action": "WallPushups"
1466
+ },
1467
+ {
1468
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/wan21_videos/wan21_videos_JumpingJack_01_05a3068d.mp4",
1469
+ "id": "wan21_videos/wan21_videos_JumpingJack_01_05a3068d.mp4",
1470
+ "action": "JumpingJack"
1471
+ },
1472
+ {
1473
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_HulaHoop_05_e288ca8f.mp4",
1474
+ "id": "RunwayGen4/RunwayGen4_HulaHoop_05_e288ca8f.mp4",
1475
+ "action": "HulaHoop"
1476
+ },
1477
+ {
1478
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_WallPushups_03_1fb482ac.mp4",
1479
+ "id": "RunwayGen4/RunwayGen4_WallPushups_03_1fb482ac.mp4",
1480
+ "action": "WallPushups"
1481
+ },
1482
+ {
1483
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_PullUps_06_8ca9f347.mp4",
1484
+ "id": "RunwayGen4/RunwayGen4_PullUps_06_8ca9f347.mp4",
1485
+ "action": "PullUps"
1486
+ },
1487
+ {
1488
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_SoccerJuggling_03_g09_c04.mp4",
1489
+ "id": "Wan2.2/Wan2.2_SoccerJuggling_03_g09_c04.mp4",
1490
+ "action": "SoccerJuggling"
1491
+ },
1492
+ {
1493
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/Wan2.2/Wan2.2_PushUps_04_g05_c02.mp4",
1494
+ "id": "Wan2.2/Wan2.2_PushUps_04_g05_c02.mp4",
1495
+ "action": "PushUps"
1496
+ },
1497
+ {
1498
+ "url": "https://huggingface.co/datasets/SGTLIM/ucf101_eval_unified/resolve/main/RunwayGen4/RunwayGen4_BodyWeightSquats_03_e330d8c2.mp4",
1499
+ "id": "RunwayGen4/RunwayGen4_BodyWeightSquats_03_e330d8c2.mp4",
1500
+ "action": "BodyWeightSquats"
1501
+ }
1502
+ ]