WalrusVision
基于 YOLOE 与 Qwen3.5 语义融合的零训练视频关键帧选择模型
模型概述
WalrusVision 是一个零训练视频关键帧选择模型,输入一段视频,输出代表性关键帧索引序列。模型融合两个冻结的预训练视觉模型——Qwen3.5 ViT(场景语义表征)与 YOLOE26x(主体空间定位),通过几何持续性追踪与因果状态建模将两者协同,无需跨模态语义对齐训练。
- 模型规模:186M 参数(101M ViT + 85M YOLOE),全部冻结
- 可调参数:5 个标量(3 个 EMA 参数 + 2 个融合权重),通过交叉验证确定
- 关键帧选择方式:逐镜头(shot-aware)Top-K + 全局去重
- 模型文件:单一 .pt 权重文件,包含 ViT + YOLOE + 追踪器 + 融合参数
模型介绍
整体架构
Qwen3.5 ViT YOLOE26x
(101M, 冻结) (85M, 冻结)
│ │
patch tokens [T,64,1024] bbox + class_id [T,N]
│ │
CLS Token Subject Persistence
(均值池化, 1024d) (IoU 跨帧匹配, 几何)
│ │
EMA 因果追踪 持续性变化信号
h_t = γ·x_t + (1-γ)·h_{t-1} persist_delta
│ │
└──────────┬───────────────────┘
│
轻量融合 (2 标量)
fused = w_cls · ΔCLS + w_persist · Δpersist
score = sigmoid(α · (fused - β))
│
关键帧分数 [T-1]
│
PySceneDetect 分镜
→ Top-K 每镜头
→ 全局去重
两个模型的分工
| 组件 | 模型 | 输出 | 在系统中的角色 |
|---|---|---|---|
| 场景语义编码器 | Qwen3.5 ViT (0.8B visual) | CLS token [1024d] | 捕捉帧级内容变化,作为关键帧判断主信号 |
| 主体空间定位器 | YOLOE26x (cv3) | bbox [4d] + class_id | 追踪主体持续性,作为辅助变化信号 |
| 因果状态追踪器 | 无(纯数学) | EMA 状态向量 | 维护历史记忆,检测当前帧与过去的差异 |
| 融合层 | 无(纯数学) | 加权组合 | 将两路变化信号融合为单一关键帧分数 |
融合策略
YOLOE 与 Qwen3.5 的语义空间不可直接对齐(实例级 512d vs 场景级 1024d)。本模型不通过投影层强制对齐,而是将 YOLOE 降级为空间索引器:仅使用 bbox 坐标进行跨帧主体匹配、计算持续性变化信号,YOLOE 的语义嵌入不参与最终表征。
该设计的核心观点:检测器的定位能力比其语义嵌入更有跨模型迁移价值。
模型训练
训练策略
本模型采用零训练 + 交叉验证调参策略:
| 阶段 | 内容 | 参数数量 |
|---|---|---|
| 冻结模型 | Qwen3.5 ViT + YOLOE26x | 186M(不可训练) |
| 数学模块 | EMA 追踪器 + SubjectTracker + PatchWeighting | 0(纯数学) |
| 交叉验证调参 | γ, α, β(EMA) + w_cls, w_persist(融合) | 5 标量 |
超参数搜索
在 SumMe 数据集上执行 5 折交叉验证 + 网格搜索:
- γ ∈ {0.1, 0.2, ..., 0.7}(EMA 衰减率)
- α ∈ {1.0, 3.0, 5.0, 7.0, 10.0}(Sigmoid 锐度)
- β ∈ {0.1, 0.2, ..., 0.6}(Sigmoid 偏移)
融合权重 w_cls 和 w_persist 通过消融实验确定(E1-4),置信度阈值通过单参数搜索最优区间确定。
最终超参数
| 参数 | 最优值 | 含义 |
|---|---|---|
| γ | 0.1 | EMA 衰减率(长记忆,对历史状态保持更多) |
| α | 10.0 | Sigmoid 锐度(变化阈值陡峭) |
| β | 0.2 | Sigmoid 偏移(低阈值,对变化敏感) |
| w_cls | 0.7 | CLS 变化权重(主信号) |
| w_persist | 0.3 | 持续性变化权重(辅助信号) |
| yolo_conf | 0.05 | YOLOE 置信度阈值 |
模型推理
环境依赖
pip install -r requirements.txt
完整依赖清单见 requirements.txt:
| 包 | 最低版本 | 用途 |
|---|---|---|
| torch | >=2.5.0 | 深度学习框架 |
| opencv-python | >=4.8.0 | 视频读写与帧处理 |
| scenedetect | >=0.6.0 | 镜头边界检测 |
| ultralytics | >=8.4.0 | YOLOE 模型加载与推理 |
| transformers | >=5.9.0 | Qwen3.5 ViT 加载与推理 |
| scipy | >=1.10.0 | 数学计算与评估指标 |
| numpy | >=1.24.0 | 数值计算 |
| Pillow | >=10.0.0 | 图像预处理 |
快速演示
# 下载模型权重后
python demo.py --video "your_video.mp4" --checkpoint svks_v18.pt
输出:
output/keyframes.json— 关键帧索引列表output/keyframes.mp4— 关键帧拼接视频
Python API
from svks.deploy import SVKSv16
# 加载模型
model = SVKSv16.from_pretrained("svks_v18.pt")
# 提取关键帧
indices = model.extract_keyframes(
"your_video.mp4",
kf_ratio=0.08, # 每镜头关键帧比例
min_interval=3, # 关键帧最小间隔(帧)
max_per_shot=64, # 每镜头最大采样帧数
)
# 返回: [21, 42, 63, ...] 帧索引列表(已排序)
自包含设计
.pt 权重文件内嵌了 ViT 架构配置、图像预处理配置和 YOLOE 权重,无需下载 Qwen3.5 模型目录。
唯一额外依赖:yoloe26x.pt (85MB),用于初始化 YOLOE 的 text model 架构。首次运行时自动下载到 checkpoint 同级目录,也可手动放置。
| 文件 | 大小 | 来源 | 说明 |
|---|---|---|---|
svks_v18.pt |
518 MB | 本项目发布 | 包含 ViT+YOLOE 权重和 ViT 配置 |
yoloe26x.pt |
85 MB | Ultralytics | 仅用于初始化架构,自动下载 |
推理流程
- PySceneDetect 检测镜头边界(AdaptiveDetector)
- 每镜头均匀采样最多 64 帧
- Qwen3.5 ViT 编码全部帧 → CLS token
- YOLOE 检测全部帧 → bbox + class_id
- SubjectTracker 跨帧 IoU 匹配 → 持续性分数
- EMA 追踪器 逐帧计算 CLS 变化 + 持续性变化 → 融合 → 关键帧分数
- 每镜头 Top-K + 全局去重 → 最终索引
推理性能
| 指标 | 值 |
|---|---|
| 单帧推理 | ~30ms (RTX 3090) |
| 典型视频 (5min, 89 shots) | ~10min |
| 显存占用 | ~2.1 GB |
模型效果
主评估:SumMe 数据集
SumMe 包含 25 个第一人称/业余视频,帧级重要性标注。
| 指标 | 值 | 说明 |
|---|---|---|
| SRCC | 0.240 | 预测分数与人工标注的排序相关性 |
| 正相关比例 | 88% | SRCC > 0 的视频占比 |
| F1 (最佳阈值) | 0.39 | 关键帧二分类 F1 |
参考评估:TVSum 数据集
TVSum 包含 50 个 YouTube 编辑视频(10 类别),帧级重要性标注。
| 指标 | 值 |
|---|---|
| SRCC | -0.053 |
| 正相关比例 | 38% |
TVSum 结果接近随机,表明冻结模型在跨领域视频上的语义表征泛化不足。
机制说明与局限
模型实际检测的信号
本模型判断一张帧是否为关键帧,依据的是 "VLM 表征空间中的视觉变化幅度",而非 "内容的人类重要性"。
CLS 空间的视觉变化幅度 > 阈值 → 关键帧
+
新主体出现 / 消失 → 额外加分
Qwen3.5 ViT 的 CLS token 在对比语言-图像预训练中获得——CLS 变化大意味着 "这两帧可能需要不同的文字来描述"。这比像素差或光流更接近内容变化,但不是语义理解。
能检测到的情况
- 场景发生了显著视觉变化(镜头切换、大幅运动、主体出现)
- 画面构图或主体构成发生了变化
- YOLOE 检测到新主体进入或离开画面
检测不到的情况
- 该瞬间是否具有叙事上的 "重要性"
- 画面变化是因为相机抖动、光照波动还是真正的内容转折
- 同一主体执行不同动作但视觉表征相似
- 慢速积累的语义转折(不会产生突变的 CLS delta)
诚实定位
本模型应被定义为:
基于冻结 VLM 表征空间的视觉变化检测器 (Visual Change Detector in Frozen VLM Representation Space)
SRCC=0.240 意味着预测与人工标注的排序相关性为 24%。这个数字恰好反映了 "视觉变化"和"人类认为重要的内容变化"之间的系统差距——模型能捕捉到内容发生了变化,但无法判断这种变化在叙事意义上是否重要。
YOLOE 的实际贡献
YOLOE (85M 参数) 在本系统中仅提供 bbox 坐标用于跨帧主体追踪。其 512 维语义嵌入完全未被使用——事实证明,在零训练条件下,检测器的定位能力比其语义嵌入更有跨模型迁移价值。主体持续性先验带来约 +8.6% 的边际增益(SumMe SRCC: 0.221 → 0.240)。
跨数据集泛化
SumMe (第一人称业余视频) 上 SRCC=0.240,TVSum (YouTube 编辑视频) 上 SRCC=-0.053。两个数据集的语义分布差异导致冻结模型无法泛化——当前方法在不同视频领域之间不具备零样本迁移能力。
消融关键结论
| 消融 | SumMe SRCC | 结论 |
|---|---|---|
| 纯 CLS + EMA(无 YOLO) | 0.221 | CLS 是主信号来源 |
| CLS + persistence 融合 | 0.240 | YOLOE 持续性先验带来 +8.6% 增益 |
| CLS + YOLOE 语义注入 | 0.221 | 语义注入无增益(自注意力忽略不对齐输入) |
| CLS + 主体 patch 加权 | 0.225 | Patch 权重重构有微弱正贡献 |
| 光流 baseline | 0.127 | 语义方法显著优于运动方法 (+89%) |
| 随机 baseline | 0.005 | 下界 |
消融核心发现
- CLS 是主信号:纯 ViT CLS + EMA 已能达到 SRCC=0.221
- 持续性是最优辅助信号:YOLOE 仅用 bbox 做主体追踪,带来 +8.6% 增益
- YOLOE 语义嵌入无用:直接注入 512d 语义向量无增益、patch 加权仅有边际贡献
- 大词表未必更好:COCO80 (0.236) 略低于精选 16 类 (0.240)
模型权重
| 文件 | 版本 | YOLO 配置 | 大小 |
|---|---|---|---|
svks_v18.pt |
v18 泛化版 | COCO80, conf=0.05 | 518 MB |
svks_v16.pt |
v16 精炼版 | COCO16, conf=0.20 | 518 MB |
两者架构完全相同,仅 YOLOE 检测类别和置信度阈值不同。
引用
@software{walrusvision2026,
title = {WalrusVision: YOLOE and Qwen3.5 Fusion for Zero-Shot Video Keyframe Selection},
author = {JucieOvo},
year = {2026},
url = {https://github.com/JucieOvo/WalrusVision}
}
致谢与引用
本模型的构建依赖于以下开源模型、数据集与工具,按许可证要求列出。
模型
| 模型 | 用途 | 许可证 | 引用 |
|---|---|---|---|
| Qwen3.5-0.8B | 视觉编码器 (ViT) | Apache 2.0 | Qwen Team, Alibaba Cloud |
| YOLOE26x | 主体检测与定位 | AGPL-3.0 | Ultralytics |
@article{qwen3.5,
title = {Qwen3.5: A Family of Large Language and Vision-Language Models},
author = {Qwen Team, Alibaba Cloud},
year = {2025},
url = {https://huggingface.co/Qwen/Qwen3.5-0.8B}
}
@article{yoloe,
title = {YOLOE: Real-Time Open-Vocabulary Object Detection and Segmentation},
author = {Ultralytics},
year = {2025},
url = {https://docs.ultralytics.com/models/yoloe}
}
@software{ultralytics,
title = {Ultralytics YOLO},
author = {Glenn Jocher and Jing Qiu},
year = {2025},
version = {8.x},
url = {https://github.com/ultralytics/ultralytics}
}
数据集
| 数据集 | 用途 | 许可证 | 引用 |
|---|---|---|---|
| SumMe | 主评估 | CC-BY | Gygli et al., ECCV 2014 |
| TVSum | 跨数据集参考评估 | CC-BY | Song et al., CVPR 2015 |
@inproceedings{summe,
title = {Creating Summaries from User Videos},
author = {Michael Gygli and Helmut Grabner and Hayko Riemenschneider and Luc Van Gool},
booktitle = {ECCV},
year = {2014}
}
@inproceedings{tvsum,
title = {TVSum: Summarizing Web Videos using Titles},
author = {Yale Song and Jordi Vallmitjana and Amanda Stent and Alejandro Jaimes},
booktitle = {CVPR},
year = {2015}
}
工具
| 工具 | 用途 | 许可证 | 引用 |
|---|---|---|---|
| PySceneDetect | 镜头边界检测 | BSD-3-Clause | Breakthrough Applications |
@software{pyscenedetect,
title = {PySceneDetect: Video Scene Cut Detection and Analysis Tool},
author = {Brandon Castellano},
year = {2024},
url = {https://github.com/Breakthrough/PySceneDetect}
}
许可证
本项目的代码与模型权重基于 Apache 2.0 许可证。
注意:本模型包含的第三方组件受其各自许可证约束:
- YOLOE26x:AGPL-3.0 — 使用本模型即视为同意该许可证条款
- Qwen3.5-0.8B:Apache 2.0 — 与项目许可证兼容
- SumMe / TVSum 数据集:CC-BY — 未在本项目直接二次分发,仅用于非商业研究