# Time-R1 baseline on ActivityForensics This directory only adds data adapters; **all upstream Time-R1 code is unchanged** (`finetune.py`, `src/time_r1/*`, etc.). Reward (single-span IoU + optional format) is taken as-is from the original repo. ## What gets adapted ActivityForensics annotations are multi-segment (a video has K ≥ 1 forged intervals). Time-R1 only models single-span temporal grounding, so each `(video, segment)` pair is emitted as one training example with a fixed query: > "an AI-manipulated segment" Multi-segment GT is split per segment; all splits of the same video share the same Qwen2.5-VL preprocessed cache via symlinks. ## Setup ```bash cd /mnt/local-fast/zhangt/baselines/time_r1 # 1) Build Time-R1-format annotation JSON. python data_forensics/build_forensics_json.py \ --annot_dir /ces/zt/activityforensics/annot \ --video_root /ces/zt \ --output_dir ./dataset/forensics/annotation # -> writes train.json / val.json # 2) Symlink the pre-encoded video tensors that forensics_grpo already produced. python data_forensics/link_cache.py \ --forensics_cache /mnt/local-fast/zhangt/forensics_grpo/ \ --annotation_json_dir ./dataset/forensics/annotation \ --output_dir ./dataset/forensics/preprocessed # -> creates ./dataset/forensics/preprocessed/{train,eval}/_/... # 3) Launch training (edit MODEL_PATH at the top of the script first). bash scripts/finetune/run_forensics.sh ``` `build_forensics_json.py` uses forensics_grpo's `data_loader` parser, so any change to its annotation schema flows through automatically. Override `FORENSICS_GRPO_ROOT=` if forensics_grpo lives elsewhere. ## Files added - `data_forensics/build_forensics_json.py` - .txt → Time-R1 .json - `data_forensics/link_cache.py` - cache layout symlinker - `scripts/finetune/run_forensics.sh` - launch script