InternVideo零样本视频检索实战:ViCLIP手把手教程,K400 Top-1高达64.8%
【免费下载链接】InternVideo[ECCV2024] Video Foundation Models & Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideo
InternVideo 是 OpenGVLab 开源的视频基础模型全家桶,而其中的ViCLIP模块是"零样本视频检索"的明星实现——无需针对具体任务训练,仅凭一句文字描述就能从视频中检索/匹配对应内容。在 Kinetics-400 零样本动作识别基准上,基于 InternVid-10M-FLT 数据训练的 ViCLIP-L 模型Top-1 准确率达到 64.8%,超过了 CLIP 官方模型的 58.42%,是当前开源视频-文本表征的第一梯队方案。
本文将带你从零开始,完成 ViCLIP 零样本视频检索环境搭建、视频-文本推理 Demo 运行,并复现 K400 零样本评测的完整流程,全程不碰复杂代码,新手也能顺利跑通 🚀
一、ViCLIP 是什么?为什么零样本检索效果这么强
ViCLIP 可以理解为"视频版的 CLIP":
| 组成 | 作用 | 说明 |
|---|---|---|
| 视频编码器(ViT-L/14) | 把视频帧序列编码为特征向量 | 初始化为 CLIP 视觉编码器,并升级为时空注意力,理解帧间动态 |
| 文本编码器 | 把文字描述编码为特征向量 | 检索时通常冻结,只用视频侧对齐 |
| 对比学习损失(InfoNCE) | 拉近"视频-文本"正样本对的向量距离 | 预训练时配合 90% 的视频掩码提升训练效率 |
核心性能一览(零样本动作识别,Top-1 / AVG):
| 模型 | 训练数据 | K400 | K600 | K700 |
|---|---|---|---|---|
| CLIP | CLIP400M | 58.42 / 70.14 | 55.11 / 67.16 | 46.12 / 58.38 |
| ViCLIP-L | + WebVid10M | 59.88 / 71.03 | 58.66 / 69.84 | 50.23 / 61.86 |
| ViCLIP-L | + InternVid-10M-FLT | 64.80 / 75.70 | 62.20 / 73.53 | 54.30 / 66.38 |
可以看到:数据质量 > 数据数量。仅 10M 精心筛选的 InternVid 数据,就让 K400 Top-1 从 59.88 直接跃升到 64.80。完整的性能对比表可在 InternVideo1/Pretrain/ViCLIP/README.md 中查到。
二、快速上手:环境搭建与模型权重获取(5分钟)
2.1 克隆仓库并创建环境
git clone https://gitcode.com/OpenGVLab/InternVideo cd InternVideo/InternVideo1/Pretrain/ViCLIP # 一键创建 conda 环境 conda env create -f viclip.yaml conda activate viclip环境定义文件为 viclip.yaml,包含 PyTorch、flash-attention 等全部依赖。
2.2 下载 ViCLIP 预训练权重
做零样本检索最推荐ViCLIP-L-14(InternVid-10M-FLT 训练版),即 K400 64.8% 的"满分选手"。仓库提供了多个规格的权重(ViCLIP-L-14 / ViCLIP-B-16,不同训练数据版本),下载地址汇总在 README 的Pretrained Data & Model表格中。
💡 小贴士:推理 Demo 使用
ViCLIP-L_InternVid-FLT-10M.pth;若显存紧张(<16G),可先用 ViCLIP-B-16 小模型跑通流程。
三、零样本视频检索 Demo:给视频,选文案
仓库内置了一个即开即用的推理 Notebook:Data/InternVid/demo.ipynb,它演示了最典型的零样本检索场景——给定一段视频 + 一组候选描述,模型自动给出匹配概率排序。
以 Demo 中的雪景视频为例,模型对 10 句候选描述的输出(Top-5):
A playful dog and its owner wrestle in the snowy yard... ~ prob: 0.8192 A man in a gray sweater plays fetch with his dog... ~ prob: 0.1084 A pet dog excitedly runs through the snowy yard... ~ prob: 0.0676正确描述以 0.82 的概率遥遥领先——这就是零样本检索的全部魔法:不训练、不微调,直接"听懂"视频内容。
Demo 背后只有 3 个核心函数(实现在 Data/InternVid/viclip/init.py):
| 函数 | 作用 |
|---|---|
get_viclip(size, pretrain) | 加载指定规格(l/b)的 ViCLIP 模型 |
_frame_from_video(video) | 逐帧读取视频 |
retrieve_text(frames, texts, topk) | 内部自动采样8 帧、缩放到 224×224、计算视频/文本特征并返回 Top-K 匹配 |
也就是说,你只需要把视频路径和候选文本准备好,其余帧采样、归一化、特征计算全部封装好了,非常适合新手集成到自己的视频应用中。
四、复现 K400 零样本评测:64.8% 是怎么跑出来的
如果你想验证基准分数(而不是只做检索 Demo),仓库为每个零样本任务都准备了独立的配置目录,K400 对应 exp/exp_pretrain_ViCLIP/zs_k400/。
运行方式(以 2 卡为例):
bash run_our_230522_resized_10m_cc15m_freeze_unmask_wiseft05.sh评测配置要点(见 zs_k400/config.py):
- 输入:测试时取视频中间 8 帧、224×224 分辨率;
- 模型:ViT-L/14 视频编码器 + 冻结文本编码器(
freeze_text=True); - 评测:
k_test=128帧级集成(eval_frame_ensemble=concat),eval_offload=True自动把大张量卸载到 CPU 省显存; - 数据集:Kinetics-400 验证集,需在 configs/data.py 中设置
kinetics400_validate.json路径。
⚠️ 运行前务必:
- 设置环境变量
VL_DATA_DIR指向你的数据根目录(含anno_downstream/kinetics400_validate.json和视频文件); - 通过命令行参数
pretrained_path指向 ViCLIP-L 权重路径; - 多卡时设置
--rdzv_endpoint=MASTER_NODE:PORT(脚本内有自动生成 MASTER_PORT 的示例)。
五、新手常见问题 FAQ
| 问题 | 解决方案 |
|---|---|
报please set environment VL_DATA_DIR | 运行评测任务前先export VL_DATA_DIR=/你的数据根目录 |
| 显存不足 OOM | 调小batch_size_test,并确认eval_offload=True已开启 |
| 想换 MSRVTT/MSVD 视频检索基准 | 直接复用同目录zs_msrvtt_1k/、zs_msvd/下的脚本,只改数据路径即可 |
| Demo 中文本召回率一般 | 候选描述尽量贴近视频动作细节;换 ViCLIP-L 大模型通常比 B 版更准 |
六、小结:一条清晰的进阶路线
- 跑通 Demo:
demo.ipynb→ 感受零样本视频检索效果(10 分钟); - 复现基准:
zs_k400/脚本 → 验证 K400 Top-1 64.8% 的评测流程; - 迁移业务:把
retrieve_text封装进自己的视频搜索/内容审核/短视频推荐管线。
ViCLIP 证明了"简单架构 + 优质数据"在视频理解上的巨大潜力。InternVideo 仓库中还有 UniFormerV2、VideoMAE、InternVideo2 等更多预训练模型与下游任务代码,欢迎继续探索 InternVideo1/Pretrain/ 目录,构建属于你自己的多模态视频应用!
【免费下载链接】InternVideo[ECCV2024] Video Foundation Models & Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考