Skip to content

QQBrowserVideoSearch/CBVS-UniCLIP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

中文说明 | English


Code  |  Paper

导航

项目介绍

本项目为填补短视频封面数据的空白,建立了首个针对中文短视频搜索场景的大规模封面文本基准,并提出了用于封面图文对比学习的UniCLIP。本项目代码基于QA-CLIP建设,并在大规模中文短视频封面数据上微调。UniCLIP已被部署到QQ浏览器在线搜索业务中,并取得了显著的收益。详细的技术细节,请参阅我们的论文

最新发布

数据集

CBVS数据集目前可通过Google Drive百度网盘下载。CBVS包括三个版本:20K/5M/10M,各版本的具体细节见下表:

版本图文对数量有无人工标注图像类型文本类型用途
CBVS-20K20,001短视频封面用户查询、OCR文本测试
CBVS-5M4,767,435短视频封面短视频标题、OCR文本预训练、微调
CBVS-10M10,075,989短视频封面短视频标题、OCR文本预训练、微调

模型及实验

模型规模 & 下载链接

UniCLIP目前开源1个规模,其模型信息和下载方式见下表:

模型规模预训练微调下载链接参数量视觉侧骨架视觉侧参数量文本侧骨架文本侧参数量分辨率
UniCLIPViT-B/16QA-CLIPCBVS-5MGoogle Drive/百度网盘188MViT-B/1686MRoBERTa-wwm-Base102M224

实验结果

我们在CBVS-20K数据集上测试了以下模型的zero-shot与微调结果。

zero-shot:

召回指标排序指标
MetricR@1R@5R@10MRPNRNDCG@1NDCG@5NDCG@10MAP
CN-CLIPViT−B/160.3840.6280.7040.5722.7180.7680.8350.8850.764
CN-CLIPViT−L/140.4340.6850.7560.6252.8120.7730.8400.8890.775
WukongViT−B/320.1970.3560.4390.3312.0000.7020.7910.8580.712
WukongViT−L/140.3110.5030.5830.4662.2290.7390.8110.8720.738
Taiyi-CLIPViT−B0.2510.4450.5250.4072.1420.7180.8000.8610.727
Taiyi-CLIPViT−L0.2690.4920.5770.4462.2780.7260.8050.8660.733
Ernie-ViL2.0ViT−B0.4130.6600.7420.6052.7590.7640.8350.8860.768
R2D2-23MViT−L/140.2580.4070.4360.3672.3120.7330.8100.8680.738
R2D2-250MViT−L/140.3560.5120.5350.4682.8290.7890.8420.8910.775
AltCLIPViT−L0.1620.2840.3360.2611.8690.6690.7710.8420.701
QA-CLIPViT−B/160.4000.6520.7240.5922.8040.7740.8380.8880.770

微调:

召回指标排序指标
MetricR@1R@5R@10MRPNRNDCG@1NDCG@5NDCG@10MAP
CN-CLIPViT−B/160.4710.7210.7960.6632.9140.7670.8380.8880.767
R2D2-250MViT−L/140.4180.6050.6500.5582.9340.7800.8440.8910.774
QA-CLIPViT−B/160.4730.7110.7830.6562.9070.7780.8410.8900.771
UniCLIPViT−B/160.5030.7540.8200.6923.0690.7840.8460.8930.779

项目结构

CBVS-UniCLIP
├── datasets                     # 数据集存放路径
│   └── cbvs20k.txt              # CBVS-20K数据集,用于测试
├── output                       # 模型检查点与推理结果输出路径
│   └── inference_result.txt     # 示例的模型推理结果
├── pretrained                   # 预训练检查点存放路径
├── run_scripts                  # 训练与推理脚本
│   ├── train_vit_b.sh           # 训练脚本
│   └── eval_vit_b.sh            # 推理脚本
├── uniclip                      # 模型、训练与推理代码
│   ├── clip                     # UniCLIP模型定义
│   ├── eval                     # 推理相关代码
│   └── training                 # 训练相关代码
└── inference.py                 # UniCLIP推理示例

依赖环境

开始本项目前,需先检查是否满足下列环境配置要求:

  • python >= 3.6.4
  • pytorch >= 1.8.0 (with torchvision >= 0.9.0)
  • CUDA Version >= 10.2

运行下列命令即可安装本项目所需的三方库。

pip install -r requirements.txt

使用教程

准备工作

预训练CKPT

请参考前文模型及实验部分,下载对应模型ckpt。推荐将下载的ckpt文件存放于CBVS-UniCLIP/pretrained/目录下。

数据集

请参考前文数据集部分,下载CBVS数据集。推荐将下载的数据集存放于CBVS-UniCLIP/datasets/目录下,推荐的组织结构为:

CBVS-UniCLIP
├── datasets                     # 数据集存放路径
│   ├── cbvs20k.txt              # CBVS-20K数据集,用于测试
│   ├── cbvs5m.txt               # CBVS-5M数据集,用于训练
│   ├── cbvs10m.txt              # CBVS-10M数据集,用于训练
│   └── cbvs10m-HNSW             # HNSW算法所需的数据文件

我们在数据集中提供图像的URL链接,并在模型数据加载时下载图像。为了提高模型效率,我们推荐预下载图像到本地,从而在模型中加载本地文件。

模型finetune

UniCLIP的微调通过如下指令执行:

cd UniCLIP/
bash run_scripts/train_vit_b.sh

相关的训练配置项包括:

  • 分布式
    • GPUS_PER_NODE: 每个机器上的GPU个数
    • WORKER_CNT: 训练的机器个数
  • 训练数据
    • train-data: 训练数据所在路径
    • num-workers: 训练集数据处理(DataLoader)的进程数,默认为1
  • 训练超参数
    • vision-model: 指定视觉backbone, 从 ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"]选择
    • text-model: 指定文本backbone, 从 ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]选择
    • context-length: 文本输入序列长度
    • warmup: warmup步数
    • batch-size: 训练时单卡batch-size。(请保证训练样本总数 > batch-size * GPU数,至少满足1个训练batch)
    • lr: 学习率
    • wd: weight decay
    • max-steps: 训练步数,也可通过max-epochs指定训练轮数
    • use-augment: 是否使用AutoAugment对图片进行数据增强
    • accum-freq: 梯度累积频率,默认为1。指定为大于1的整数时开启对比学习梯度累积,模拟更大的batch size。如果单卡batch size为m,则总的batch size为accum_freq * m * GPU数
  • 输出选项
    • output-base-dir: 指定输出路径
    • name: 指定输出子路径。超参日志, 训练日志以及产出ckpt均会存放至 ${output-base-dir}/${name}/
    • save-step-frequencysave-epoch-frequency: 存ckpt的步数或轮数间隔
    • report-training-batch-acc: 日志是否报告训练图到文&文到图batch准确率
  • 权重读取相关选项
    • resume: 权重读取的路径。示例脚本中指定为预训练ckpt路径,也可以指定为用户自己finetune的ckpt路径做继续训练
    • reset-data-offset: 是否从此前的数据断点续跑。如batch size或GPU卡数超参改变,建议打开此选项
    • reset-optimizer: 是否使用optimizer state
  • 模型选项
    • ocr-presence: 是否执行Presence-guided encoder与IC任务
    • ocr-semantic: 是否执行Semantic-guided encoder与ITM任务

训练完毕,log 会自动存在UniCLIP/${output-base-dir}/${name}/out_${timestamp}.log,训练log格式如下所示:

2023-12-15,15:43:23 | INFO | Rank 0 | Global Steps: 514/62740 | Train Epoch: 1 [781280/4768240 (16%)] | Loss: 1.888588 | Loss_ocr_presence: 0.479523 | Loss_ocr_semantic: 0.960589 | Loss_Img_Txt: 2.180721 | Image2Text Acc: 55.59 | Text2Image Acc: 55.33 | OCR_presence_est Acc: 78.42 | OCR_semantic_est Acc: 67.89 | Data Time: 0.042s | Batch Time: 5.787s | LR: 0.000020 | logit_scale: 4.603 | Global Batch Size: 1520

注意: 对比学习的训练收敛和稳定性和总batch size相关。如您使用更小的batch size(相比默认配置128 per-GPU * 8 GPU),建议使用更小的学习率。我们推荐使用更多的GPU和更大的batch size以取得更好的效果。

预测及评估

批量数据预测

UniCLIP的预测通过如下指令执行:

cd UniCLIP/
bash run_scripts/eval_vit_b.sh

相关的推理配置项包括:

  • 推理数据
    • test-data: 推理数据所在路径
  • 推理超参数
    • vision-model: 指定视觉backbone, 从 ["ViT-B-16", "ViT-L-14", "ViT-L-14-336", "ViT-H-14", "RN50"]选择
    • text-model: 指定文本backbone, 从 ["RoBERTa-wwm-ext-base-chinese", "RoBERTa-wwm-ext-large-chinese", "RBT3-chinese"]选择
    • context-length: 文本输入序列长度
    • batch-size: 推理时单卡batch-size
    • input-resolution: 输入图像分辨率,默认为224
  • 输出选项
    • output-file: 指定输出路径
  • 权重读取相关选项
    • resume: 权重读取的路径
  • 模型选项
    • ocr-presence: 是否执行Presence-guided encoder与IC任务
    • ocr-semantic: 是否执行Semantic-guided encoder与ITM任务

训练完毕,模型推理结果自动保存在UniCLIP/{output-file},标签、查询、图像ID、模型打分以\t作为分隔符,如下所示:

1	大宅门演员表	70001002_d3349orxhl9	0.3051548898220062
2	大宅门演员表	70001002_h0871hjdde8	0.39615771174430847
2	明日战记在线观看	70001002_e3348lunfza	0.37629106640815735

与此同时,脚本将计算并输出模型的排序指标,包括PNR、NDCG与MAP。

注意: 推理与训练脚本中的配置项需保持一致。

单条数据预测

我们还提供了使用UniCLIP预测单条数据的代码示例,见inference.py。可通过修改下面的代码,执行图(url)文(query)相关性推理。

score = compute_feature(model, query='大宅门演员表', url='http://puui.qpic.cn/vpic_cover/h0871hjdde8/h0871hjdde8_hz.jpg/640', compute_score=True)

引用

如果我们的工作对您有帮助,欢迎引用我们的工作:

@misc{qiao2024cbvs,
      title={CBVS: A Large-Scale Chinese Image-Text Benchmark for Real-World Short Video Search Scenarios}, 
      author={Xiangshuo Qiao and Xianxin Li and Xiaozhe Qu and Jie Zhang and Yang Liu and Yu Luo and Cihang Jin and Jin Ma},
      year={2024},
      eprint={2401.10475},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}