本项目复现论文Skyra: AI-Generated Video Detection via Grounded Artifact Reasoning的两阶段训练与评测流程。
- 输入:一段视频抽取出的多帧画面及时间戳。
- 输出:
Real/Fake标签、分析过程、伪影类型、时间范围和空间位置。 - 训练:先用LLaMA-Factory进行LoRA-SFT,再用verl进行SFT-reference GRPO。
| 已包含 | 需要自行准备 |
|---|---|
| 4,034条SFT记录与数据注册文件 | ViF-CoT-4K和ViF-Bench原始视频、抽帧数据 |
| SFT和GRPO配置、启动脚本 | Qwen2.5-VL-7B-Instruct基座权重 |
| GRPO数据转换与规则Reward | 训练后的SFT/GRPO权重 |
| 完整ViF-Bench评测代码 | LLaMA-Factory 0.9.4、verl 0.7.1源码 |
| 3,160条测试集的三模型预测与汇总 | 对应CUDA环境和GPU资源 |
SFT与GRPO依赖不同,建议使用两个独立Python环境。仓库中的路径来自AutoDL训练环境,运行前需要改成自己的路径。
Reward单元测试只依赖Python标准库,不需要模型、数据集或GPU:
git clone https://github.com/hhhhh962/Skyra.git
cd Skyra
python train/verl/tests/test_ladm_reward.py测试覆盖分类奖励、Real/Fake误判惩罚、证据计数上限和非法输出。
ViF-CoT-4K + Qwen2.5-VL-7B-Instruct
│
▼
LoRA-SFT(3 epochs)
│
▼
合并SFT LoRA
│
▼
GRPO LoRA(SFT Reference,1 epoch)
│
▼
ViF-Bench完整评测
参考环境:
| 阶段 | Python | 主要组件 | GPU策略 |
|---|---|---|---|
| SFT | 3.11 | PyTorch、LLaMA-Factory 0.9.4 | 双卡DDP |
| GRPO | 3.12 | PyTorch 2.8、verl 0.7.1、vLLM 0.11 | FSDP + TP=2 |
依赖文件:
pip install -r requirements-sft.txt # SFT环境 pip install -r requirements-grpo.txt # GRPO环境
两个上游框架需要从源码安装:
下载资源:
train/LLaMA-Factory/data/ladm_sft.json已经包含4,034条记录。每条记录保存对话和图片路径;图片文件来自ViF-CoT-4K的parsed_frames。请把JSON中的绝对路径改成实际数据目录。
先修改以下文件中的模型、数据、输出和Python环境路径:
train/LLaMA-Factory/qwen2_5vl_lora_sft.yamltrain/LLaMA-Factory/data/dataset_info.jsontrain/LLaMA-Factory/train_lora.sh
然后启动:
cd train/LLaMA-Factory
bash train_lora.sh实际训练配置:
| 参数 | 值 |
|---|---|
| 基座 | Qwen2.5-VL-7B-Instruct |
| LoRA rank / alpha | 8 / 16 |
| 训练模块 | 语言模型侧LoRA |
| 冻结模块 | 视觉编码器、视觉Merger |
| 上下文长度 | 10,240 tokens |
| 有效batch size | 4 |
| 学习率 | 1e-4 |
| 训练轮数 | 3 |
输出为约20M可训练参数的SFT LoRA。
先把SFT JSON转换为verl使用的Parquet:
python train/verl/prepare_grpo_data.py \ --input train/LLaMA-Factory/data/ladm_sft.json \ --output-dir /path/to/grpo_data
转换脚本默认生成train.parquet和val.parquet。正式实验将两部分合并为4,034条train_all.parquet:
python - <<'PY' from datasets import load_dataset data = load_dataset( "parquet", data_files=[ "/path/to/grpo_data/train.parquet", "/path/to/grpo_data/val.parquet", ], split="train", ) assert len(data) == 4034 data.to_parquet("/path/to/grpo_data/train_all.parquet") PY
随后完成两项准备:
- 将Qwen基座与SFT LoRA通过PEFT的
merge_and_unload()合并,保存完整SFT模型。 - 修改
train/verl/run_grpo_formal.sh中的SFT_MERGED_MODEL、TRAIN_FILE、Reward路径、环境路径和输出目录;TRAIN_FILE指向上一步生成的train_all.parquet。
启动训练:
cd train/verl
bash run_grpo_formal.sh实际GRPO配置:
| 参数 | 值 |
|---|---|
| Actor起点 | 合并后的完整SFT模型 |
| Reference | 冻结的完整SFT模型 |
| 新增参数 | GRPO LoRA,rank 8 / alpha 16 |
| Prompt batch | 2 |
| 每个Prompt回答数 | 2 |
| 最大回答长度 | 512 tokens |
| 学习率 | 5e-7 |
| KL系数 | 0.02 |
| 训练轮数 / 步数 | 1 / 2,017 |
训练时临时关闭新建的GRPO LoRA即可得到Reference概率。此时加载的是冻结的SFT merged模型。
Reward位于train/verl/verl/utils/reward_score/ladm.py。分类结果决定主要分数,结构化证据数量提供附加奖励。
完整ViF-Bench评测:
python eval/eval_vifbench_binary_vllm.py \ --kind sft \ --index /path/to/ViF-Bench/parsed_frames/test_index.json \ --output /path/to/sft_predictions.json \ --base-model /path/to/Qwen2.5-VL-7B-Instruct \ --adapter /path/to/skyra-sft-lora \ --batch-size 8 \ --max-num-seqs 4 \ --max-model-len 16384 \ --max-new-tokens 2048
Base评测使用--kind base并省略--adapter。GRPO评测使用--kind grpo,基座换成SFT merged模型,adapter换成GRPO LoRA。脚本会原子写入预测文件,再次运行时自动跳过已经完成的video_id。
本地单视频推理:
python eval/inference_end2end/infer.py \ --local \ --model_path /path/to/merged-model \ --input /path/to/video.mp4 \ --output result.json
输入也可以是视频目录。模型只加载一次,并复用于目录中的全部视频。
完整ViF-Bench包含3,160条样本,其中165条Real、2,995条Fake。三组结果使用同一套vLLM配置。
| 模型 | Accuracy | Balanced Accuracy | Fake Precision | Fake Recall | Fake F1 | Real FPR |
|---|---|---|---|---|---|---|
| Base | 8.42% | 50.54% | 97.22% | 3.51% | 6.77% | 1.82% |
| SFT LoRA | 92.37% | 75.65% | 97.55% | 94.32% | 95.91% | 43.03% |
| GRPO LoRA(SFT-reference) | 92.85% | 74.47% | 97.40% | 94.99% | 96.18% | 46.06% |
SFT显著提高Fake检出率,同时带来较高的Real误报率。GRPO继续提高Fake Recall和Fake F1,Real FPR升至46.06%。完整集类别差异较大,阅读结果时应同时参考Balanced Accuracy和Real FPR。
逐样本预测、汇总和运行环境记录位于eval/results/vifbench_full_vllm_20260824/。
<think> I identified <type>Abnormal Human Body Structure</type> in <t>[2.14, 3.50]</t> at <bbox>[0.32, 0.18, 0.46, 0.34]</bbox>. </think> <answer>Fake</answer>
评测会解析<answer>得到分类结果,并保留<think>与证据标签。当前Reward只检查证据格式和数量,不验证时间戳、框和伪影类型是否准确。
GitHub仓库不保存模型权重。建议将权重发布到Hugging Face:
| 产物 | 依赖 |
|---|---|
| SFT LoRA | Qwen2.5-VL-7B-Instruct |
| SFT merged | 可直接加载 |
| GRPO LoRA | SFT merged |
| GRPO merged | 可直接加载 |
发布LoRA时需要清理adapter_config.json中的本机绝对路径,并在Model Card中说明训练数据、Reference设计、完整评测指标和已知偏差。
- 完整测试集Fake占94.78%,Accuracy容易被类别比例影响。
- 模型存在明显的Fake预测偏好,对Real视频的误报率较高。
- 结构化证据数量不能代表证据真实性。
- 输入使用带时间戳的多图片序列;模型未直接读取视频文件中的连续帧结构。
- 正式训练参考2张48GB GPU,路径和显存参数需要按机器调整。
本项目基于JoeLeelyf/Skyra。感谢原论文作者李奕飞等人的工作。
- 本仓库代码:MIT License
- ViF-CoT-4K及原Skyra权重:CC BY 4.0
- 源视频还受Kinetics-400、Panda-70M、HD-VILA-100M等数据集条款约束
@article{li2025skyra, title={Skyra: AI-Generated Video Detection via Grounded Artifact Reasoning}, author={Li, Yifei and Zheng, Wenzhao and Zhang, Yanran and Sun, Runze and Zheng, Yu and Chen, Lei and Zhou, Jie and Lu, Jiwen}, journal={arXiv preprint arXiv:2512.15693}, year={2025} }