mmaction2 CLIP4Clip 实战指南:基于 CLIP 的端到端视频-文本检索 人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载视频-文本检索是多模态理解中的核心任务给定一段视频在大规模文本库中召回相关描述或反之。mmaction2 提供的 CLIP4Clip 方案将 OpenAI CLIP 在图像-文本上预训练获得的视觉概念知识以端到端的方式迁移到视频-文本检索任务上用 CLIP 视觉编码器逐帧编码视频帧再用一个轻量 adapter默认简单均值池化把帧级特征聚合成视频级特征与文本特征在共享嵌入空间中做对称对比学习。读完本文你将掌握该方案的模型结构、关键配置参数的含义如frozen_layers、adapter 选择、MSRVTT-9k 数据准备、数据增广流水线以及完整的训练与测试命令并能从源码层面理解损失计算、分布式特征聚合与评测指标的底层实现。算法背景与仓库中的模型结构CLIP4Clip 的原始论文为CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval该文档在 metafile.yml 中以Paper字段登记。论文摘要见 configs/retrieval/clip4clip/README.md指出该方法通过实证研究回答了四个问题图像特征是否足以支撑视频-文本检索、在大规模视频-文本数据上后预训练对性能的影响、建模视频帧间时序依赖的实际机制以及超参数在检索任务上的敏感性。实验结果表明从 CLIP 迁移而来的 CLIP4Clip 在 MSR-VTT、MSVC、LSMDC、ActivityNet 和 DiDeMo 等多个视频-文本检索数据集上取得了当时领先的结果。在 mmaction2 中该模型对应CLIPSimilarity实现位于 mmaction/models/similarity/clip_similarity.py。它继承mmengine的BaseModel通过clip_arch参数指定 CLIP 架构官方支持的取值为ViT-B/32、ViT-B/16、ViT-L/14和ViT-L/14336px构造时会调用clip.load(clip_arch)从 OpenAI CLIP 加载预训练权重因此需要额外安装 CLIP 包源码中在ImportError时给出的提示是pip install githttps://github.com/openai/CLIP.gitopenai-clip亦已列入 requirements/optional.txt。模型前向包含三条分支对应forward的三种 modetensor模式只走extract_feat输出未归一化的视频特征与文本特征用于检索时批量收集特征loss模式用于训练计算对称对比损失后文详述predict模式将每对样本的video_feature与text_feature均为 512 维见测试用例 tests/models/similarity/test_clip_similarity.py 中的断言封装进data_sample.features供评测器使用。视频特征与文本特征的编码器分别是encode_video与encode_text前者把(B, N, C, H, W)的视频 reshape 成(B*N, C, H, W)送入 CLIP 视觉塔得到帧级特征再经 adapter 聚合为视频级特征后者直接调用 CLIP 文本塔。两个特征在extract_feat中做 L2 归一化后再返回。帧级到视频级的聚合两种 Adapter帧级特征聚合到视频级特征是 CLIP4Clip 建模帧间时序依赖的切入点。mmaction/models/similarity/adapters.py 提供两种实现均在 mmaction/models/similarity/init.py 中导出SimpleMeanAdapter对帧维度做均值池化即x.mean(dimself.dim)默认dim1。它无可学习参数正是 MSRVTT-9k 官方配置所用的 adapterTransformerAdapter带可学习位置编码num_segs个、transformer_width维的浅层 Transformer前向为位置编码相加 → Transformer → 残差相加 → 帧维均值参数包括num_segs、transformer_width、transformer_heads、transformer_layers。单元测试 tests/models/similarity/test_adapters.py 对两种 adapter 的输入输出形状做了验证。选择哪个 adapter 属于论文实证研究的一部分均值池化是图像特征是否足够这一问题的轻量验证方案而 TransformerAdapter 则引入显式的帧间建模能力。frozen_layers控制 CLIP 冻结范围CLIPSimilarity还有一个重要的调优参数frozen_layers语义为冻结前 N 层取-1表示不冻结任何参数。从 _freeze_stages 的实现看冻结规则是把 CLIP 参数分为两组top_layersln_final、text_projection、logit_scale、visual.ln_post、visual.proj永远保持可训练mid_layersvisual.transformer.resblocks、transformer.resblocks中只有层号 frozen_layers的残差块保持可训练其余全部冻结。测试用例 tests/models/similarity/test_clip_similarity.py 分别在frozen_layers取-1、0、6、12时断言了requires_grad分布确认该逻辑对 ViT-B/3212 个视觉残差块逐层生效。MSRVTT-9k 官方结果与预训练权重CLIP4Clip 的官方结果表继承自 configs/retrieval/clip4clip/README.md并与 metafile.yml 的Results字段一致frame sampling strategyresolutiongpusbackboneadapterpretrainRecall1Recall5Recall10MdRMnRtesting protocoluniform 12224x2248ViT-B/32Meanclip43.169.478.92.016.81 clips x 1 crop对应配置configs/retrieval/clip4clip/clip4clip_vit-base-p32-res224-clip-pre_8xb16-u12-5e_msrvtt-9k-rgb.py预训练权重与训练日志由 metafile 的Weights/Training Log字段指向 OpenMMLab 官方下载站download.openmmlab.com下的retrieval/clip4clip/...路径可直接用于测试。metafile 元数据Batch Size: 16、Epochs: 5、Training Data: MSRVTT-9k、Training Resources: 8 GPUs。从源码结构看Recallk、MdR中位排名、MnR平均排名这组指标由 mmaction/evaluation/metrics/retrieval_metric.py 中的RetrievalMetric计算它把全部视频/文本特征归一化后做相似度矩阵取每条查询对角线相似度的排序名次indRk为名次 k的查询占比MdR median(ind) 1MnR mean(ind) 1。数据准备MSRVTT-9k训练所用的数据集为 MSRVTT 的 9k 训练划分train_9k.json与 JSFUSION 测试集test_JSFUSION.json。数据准备入口在 tools/data/video_retrieval/执行cd tools/data/video_retrieval bash prepare_msrvtt.sh完成后目录结构为同一 README 中给出的结构mmaction2 ├── mmaction ├── tools ├── configs ├── data │ ├── video_retrieval │ │ └── msrvtt │ │ ├── train_9k.json │ │ ├── train_7k.json │ │ ├── test_JSFUSION.json │ │ └─── videos │ │ ├── video0.mp4 │ │ ├── ... │ │ └── video9999.mp4该目录下还提供prepare_msvd.sh用于准备 MSVD 数据集生成train.json/val.json/test.json与视频文件。VideoTextDataset标注文件如何变成训练样本数据集类VideoTextDataset位于 mmaction/datasets/video_text_dataset.py。它的load_data_list逻辑读取标注 JSON格式为{视频相对路径: [文本1, 文本2, ...]}对每个视频把其每条文本展开为一个(filename, text)对——即一个视频有 k 条文本就产生 k 条样本。配置中ann_file、data_prefixdict(videovideos)与之对应。注意VideoTextDataset本身不保存一个视频对应几条文本的分组信息视频/文本计数由MsrVTT系数据集提供见 mmaction/datasets/msrvtt_datasets.py 中self.num_videos/self.num_texts的赋值供检索循环按视频数/文本数统计指标时使用。训练流水线逐项解读官方配置的train_pipeline是理解数据流的最佳入口train_pipeline [ dict(typeDecordInit, **file_client_args), dict(typeUniformSample, clip_len12, num_clips1), dict(typeDecordDecode), dict(typeResize, scale(-1, 256)), dict(typeCenterCrop, crop_size224), dict(typeFormatShape, input_formatNCHW), dict(typeCLIPTokenize), dict(typePackActionInputs, collect_keys(imgs, text)) ]DecordInit以io_backenddisk初始化 Decord 视频解码后端UniformSample(clip_len12, num_clips1)均匀采 12 帧、采 1 个 clip对应结果表中的 uniform 12验证/测试流水线额外加test_modeTrueDecordDecode解码为帧序列Resize(scale(-1, 256))CenterCrop(crop_size224)短边缩放到 256 再中心裁剪到 224与表中的 224x224 / 1 crop 一致FormatShape(input_formatNCHW)把帧维并入 batch 维得到模型期望的(B*N, C, H, W)输入CLIPTokenize位于 mmaction/datasets/transforms/text_transforms.py内部调用clip.tokenize(text)[0]把文本转成定长 77 的 token 序列测试用例中以torch.randint(0, 49408, (77,))模拟该输入PackActionInputs(collect_keys(imgs, text))把两种模态分别打包进inputs[imgs]与inputs[text]。test_pipeline val_pipeline训练/验证 dataloaderbatch_size16、num_workers8并开启persistent_workers测试 dataloader 的batch_size1检索评测逐条收集特征数值上不影响结果。配置详解CLIP 前处理、优化器与调度官方配置的model部分model dict( typeCLIPSimilarity, clip_archViT-B/32, to_float32True, frozen_layers0, data_preprocessordict( typeMultiModalDataPreprocessor, preprocessorsdict( imgsdict( typeActionDataPreprocessor, mean[122.771, 116.746, 104.093], std[68.500, 66.632, 70.323], format_shapeNCHW), textdict(typeActionDataPreprocessor, to_float32False))), adapterdict(typeSimpleMeanAdapter))to_float32True把 CLIP 参数转回 float32。从源码看__init__中if to_float32: self.clip.float()配合文本侧to_float32False的 preprocessor意味着图像张量保持精度而 CLIP 参数以 float32 参与训练避免混合精度下小学习率微调的不稳定frozen_layers0按上文_freeze_stages的规则视觉/文本残差块全部可训练仅 CNN 卷积等底层参数被冻结属于轻冻结的微调策略若要全参数微调可改为-1MultiModalDataPreprocessor实现于 mmaction/models/data_preprocessors/multimodal_data_preprocessor.py。它按preprocessors字典为每种模态构建独立 preprocessor图像用 BGR 格式的 ImageNet 均值/标准差做归一化与 CLIP 视觉塔的期望一致文本 token 不做归一化to_float32False保持整数 token 张量。其forward遍历inputs的每个键分别调用对应 preprocessor 完成 batch 化与归一化。训练侧配置train_cfg dict( typeEpochBasedTrainLoop, max_epochs5, val_begin1, val_interval1) param_scheduler [ dict(typeLinearLR, start_factor0.05, by_epochTrue, begin0, end0.5, convert_to_iter_basedTrue), dict(typeCosineAnnealingLR, T_max4.5, eta_min0, by_epochTrue, begin0.5, end5, convert_to_iter_basedTrue), ] optim_wrapper dict( optimizerdict(typeAdamW, lr1e-05, betas(0.9, 0.999), eps1e-08, weight_decay0.05), paramwise_cfgdict(norm_decay_mult0., bias_decay_mult0.), )要点总共 5 个 epoch前 0.5 epoch 做线性 warmup从lr * 0.05线性升到位随后 4.5 个 epoch 余弦退火到 0优化器 AdamW 基础学习率1e-05权重衰减 0.05并通过paramwise_cfg对 norm 层参数与 bias 关闭权重衰减——这是微调大预训练模型的常规做法。配置末尾的auto_scale_lr dict(enableFalse, base_batch_size128)给出了 LR 自动缩放基准8 卡 × 每卡 16 样本 128默认关闭需要按卡数缩放时可将enable置True。训练对比损失与分布式特征聚合CLIPSimilarity的 loss 模式完整复刻了 CLIP 的对称对比学习代码见 mmaction/models/similarity/clip_similarity.py对归一化后的特征先做跨卡聚合video_features torch.cat(GatherLayer.apply(video_features), dim0)文本侧同理。GatherLayer是一个自定义的autograd.Function前向调用mmengine.dist.all_gather收集所有进程的张量反向只取本 rank 对应的梯度分片——这使得对比损失的负样本池扩展为所有 GPU 的样本之和8 卡 × 16 即每个 batch 有 128 个负样本用 CLIP 自带的可学习温度logit_scale self.clip.logit_scale.exp()缩放余弦相似度logits_per_video logit_scale * video_features text_features.t()logits_per_text为其转置标签为对角线索引arange(N)损失默认CrossEntropyLoss(loss_weight0.5)类签名中的默认值双向各算一次labels torch.arange(logits_per_video.shape[0]).to(logit_scale.device) sim_loss_v2t self.loss(logits_per_video, labels) sim_loss_t2v self.loss(logits_per_text, labels) losses dict(sim_loss_v2tsim_loss_v2t, sim_loss_t2vsim_loss_t2v)单元测试tests/models/similarity/test_clip_similarity.py用 2 个样本跑train_step断言返回的loss_vars中同时包含sim_loss_v2t与sim_loss_t2v并验证了optim_wrapper.update_params被调用一次。此外模型重写了train()每次切换训练状态时重新执行_freeze_stages()保证frozen_layers在训练中动态修改后立即生效。训练与测试命令以下命令继承自官方 READMEconfigs/retrieval/clip4clip/README.md训练脚本入口为 tools/train.py基于mmengine的Runner测试脚本为 tools/test.py。训练通用形式python tools/train.py ${CONFIG_FILE} [optional arguments]官方示例在 MSRVTT-9k 上以固定随机种子、可复现deterministic方式训练并开启周期验证python tools/train.py configs/retrieval/clip4clip/clip4clip_vit-base-p32-res224-clip-pre_8xb16-u12-5e_msrvtt-9k-rgb.py \ --seed 0 --deterministic测试通用形式python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]官方示例在 MSRVTT-9k 测试集上评测并把特征结果转储为 pkl 文件python tools/test.py configs/retrieval/clip4clip/clip4clip_vit-base-p32-res224-clip-pre_8xb16-u12-5e_msrvtt-9k-rgb.py \ checkpoints/SOME_CHECKPOINT.pth --dump result.pkl--dump输出的 pkl 便于离线分析检索结果。评测流程由test_dataloadertest_evaluator dict(typeRetrievalMetric)驱动RetrievalMetric默认指标集为(R1, R5, R10, MdR, MnR)与结果表列一一对应。框架还提供了面向检索任务的专用循环 mmaction/engine/runner/retrieval_loop.pyRetrievalValLoop/RetrievalTestLoop先在逐 batch 的modetensor前向中收集全部视频/文本特征并拼接再调用predict_all生成 i2t 与 t2i 两组样本交给 evaluator分别输出i2t/*与t2i/*两组指标。CLIP4Clip 官方配置使用的是标准ValLoop/TestLoop从源码结构看专用循环更适配需要按num_videos/num_texts精确分组的多模态检索数据集如 MsrVTT 系。更多训练/测试参数细节可参考 docs/en/user_guides/train_test.md。引用如果 CLIP4Clip 的研究成果对你的工作有帮助官方 README 给出的 BibTeX 为article{luo2022clip4clip, title{CLIP4Clip: An empirical study of CLIP for end to end video clip retrieval and captioning}, author{Luo, Huaishao and Ji, Lei and Zhong, Ming and Chen, Yang and Lei, Wen and Duan, Nan and Li, Tianrui}, journal{Neurocomputing}, volume{508}, pages{293--304}, year{2022}, }小结CLIP4Clip 在 mmaction2 中的实现是一条完整的预训练视觉-语言模型 → 视频检索迁移路径CLIPSimilarity复用 OpenAI CLIP 双塔编码器与logit_scale温度通过SimpleMeanAdapter/TransformerAdapter两种 adapter 探索帧级时序建模借助GatherLayer把对比学习的负样本池扩展到全部 GPU再由RetrievalMetric输出 Recall1/5/10 与 MdR/MnR。复现官方结果需要 8 卡、MSRVTT-9k 数据、5 个 epoch 的 AdamW 微调lr1e-5warmup 余弦退火配置、权重与日志三者均可在 configs/retrieval/clip4clip/ 与 metafile.yml 中互相印证适合作为理解CLIP 迁移到视频多模态检索这一方向的参考实现。赞分享人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载相关推荐终极指南如何用CLIP4Clip快速实现视频文本检索终极指南如何用CLIP4Clip快速实现视频文本检索 CLIP4Clip是一个基于CLIP模型的端到端视频片段检索系统能够高效地实现视频与文本之间的语义匹人工智能深度学习多模态从零到一如何用MaxKB构建企业级智能体平台的完整指南从零到一如何用MaxKB构建企业级智能体平台的完整指南 当企业试图将AI能力融入业务流程时技术门槛高、部署复杂、维护困难往往是最大的障碍。传统AI解决方案要人工智能大模型AI AgentRAG工具调用后端前端知识库CLIP4Clip终极指南如何用AI实现视频文本智能检索CLIP4Clip终极指南如何用AI实现视频文本智能检索 在当今视频内容爆炸式增长的时代如何从海量视频中快速找到你想要的片段CLIP4Clip应运而生这人工智能深度学习多模态上一篇Zoom Whiteboard MCP 接入实战指南认证路径、必需 Scopes 与 Whiteboard ID 映射下一篇mold 项目内嵌 oneTBB 的 cache_aligned_resource基于 PMR 的缓存行对齐内存资源全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考