- 多模态
- 计算机视觉
- NLP
- 预训练
- 微调
- 深度学习
【免费下载链接】BLIP
PyTorch code for BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
本文是 BLIP(Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation)官方 PyTorch 仓库的完整使用指南。BLIP 通过三项预训练目标统一了视觉-语言理解与生成任务,本指南将带你完成环境搭建、预训练/微调权重下载、四大下游任务(图文检索、图像描述、VQA、NLVR2)的评估与微调,以及零样本视频-文本检索的复现。读完本文,你将掌握基于 README.md 与仓库源码(
train_*.py、configs/*.yaml)的全部实操命令,并理解每个关键配置项的底层含义。
仓库状态与官方声明
在动手之前,请务必注意官方声明:本仓库已被官方标记为 DEPRECATED(已弃用)且不再维护,官方不建议在生产和敏感场景中使用本仓库内容。BLIP 现已正式整合进 LAVIS——Salesforce 推出的语言与视觉研究和应用一站式库。本指南面向希望研读经典 BLIP 论文复现代码、学习其模型架构与训练流程的开发者,若用于生产环境,请优先考虑 LAVIS。
本仓库是 BLIP 论文 的 PyTorch 官方实现(作者 Junnan Li、Dongxu Li、Caiming Xiong、Steven Hoi,发表于 ICML 2022),代码在 PyTorch 1.10 上完成测试。
环境搭建与依赖安装
安装依赖只需一行命令(见 README.md 与 requirements.txt):
pip install -r requirements.txtrequirements.txt 中锁定四个关键依赖:
| 依赖包 | 版本 | 用途 |
|---|---|---|
| timm | 0.4.12 | 提供 Vision Transformer 骨干与预训练权重加载(timm.models.hub.download_cached_file) |
| transformers | 4.15.0 | 提供 BERT Tokenizer 与文本编码器基础结构 |
| fairscale | 0.4.4 | 提供梯度检查点(Gradient checkpoint)等显存优化能力 |
| pycocoevalcap | — | COCO Caption 评估(BLEU、CIDEr、METEOR、SPICE 等指标) |
从源码看,模型层依赖(models/blip.py)会在运行时通过BertTokenizer.from_pretrained('bert-base-uncased')拉取 BERT 基础 tokenizer,并添加[DEC](bos)与[ENC]两个特殊 token。代码在分布式场景下使用 NCCL 后端(见 utils.py),训练脚本默认cuda设备。
仓库整体结构:一份贯穿“预训练 → 微调 → 评估”的代码地图
仓库的组织方式清晰对应 BLIP 的技术路线:
- 配置层
configs/:每个任务一份 YAML(retrieval_coco.yaml、retrieval_flickr.yaml、caption_coco.yaml、nocaps.yaml、vqa.yaml、nlvr.yaml、pretrain.yaml、retrieval_msrvtt.yaml),另有 BERT 结构配置 med_config.json(12 层、hidden_size 768、12 头、add_cross_attention: true)。 - 数据层
data/:通过 data/init.py 的create_dataset统一构造各任务数据集,并内置与 ImageNet 不同的均值/方差归一化(0.48145466, 0.4578275, 0.40821073) / (0.26862954, 0.26130258, 0.27577711)。 - 模型层
models/:核心实现包括 blip.py(BLIP_Base特征提取器与BLIP_Decoder生成器)、blip_pretrain.py、blip_retrieval.py、blip_vqa.py、blip_nlvr.py、blip_itm.py。 - 训练/评估脚本:
train_retrieval.py、train_caption.py、train_vqa.py、train_nlvr.py、pretrain.py、eval_nocaps.py、eval_retrieval_video.py。
所有训练脚本共享统一的命令行参数(以 train_retrieval.py 为例):
| 参数 | 默认值 | 说明 |
|---|---|---|
--config | 各任务对应 YAML | 配置文件路径 |
--output_dir | output/xxx | 输出目录(自动创建,并写入config.yaml备份与log.txt) |
--evaluate | store_true | 仅评估模式,不训练 |
--device | cuda | 运行设备 |
--seed | 42 | 随机种子(实际为seed + rank) |
--world_size | 1 | 分布式进程数 |
--dist_url | env:// | 分布式初始化方式 |
--distributed | True | 是否启用分布式 |
预训练与微调权重清单
README 提供了两类权重:预训练权重与各任务微调权重。所有权重均为.pth文件,可通过 URL 直接下载,也可在配置文件中以 URL 或本地文件路径形式写入pretrained字段。模型权重加载逻辑见 models/blip.py:会先做visual_encoder.pos_embed的位置编码插值(interpolate_pos_embed),再以strict=False加载并剔除形状不匹配的键。
预训练权重(按预训练图像数量分档):
| 预训练图像数 | BLIP w/ ViT-B | BLIP w/ ViT-B + CapFilt-L | BLIP w/ ViT-L |
|---|---|---|---|
| 14M | model_base_14M.pth | — | — |
| 129M | model_base.pth | model_base_capfilt_large.pth | model_large.pth |
微调权重:
| 任务 | BLIP w/ ViT-B | BLIP w/ ViT-B + CapFilt-L | BLIP w/ ViT-L |
|---|---|---|---|
| 图文检索(COCO) | model_base_retrieval_coco.pth | — | model_large_retrieval_coco.pth |
| 图文检索(Flickr30k) | model_base_retrieval_flickr.pth | — | model_large_retrieval_flickr.pth |
| 图像描述(COCO) | — | model_base_caption_capfilt_large.pth | model_large_caption.pth |
| VQA | model_vqa.pth | model_base_vqa_capfilt_large.pth | — |
| NLVR2 | model_base_nlvr.pth | — | — |
从模型实现看,vit参数决定骨干规模(models/blip.py):base为 patch16、embed_dim 768、depth 12、12 头;large为 embed_dim 1024、depth 24、16 头,并带 0.1 的 drop path。图中“ViT-B + CapFilt-L”指预训练阶段使用 CapFilt 框架以 ViT-L 作为 captioner/filter 生成并筛选合成描述(synthetic captions)后的权重。
推理 Demo:四大能力的快速体验
README 提供两条 Demo 路径:
- Colab Notebook(无需 GPU):打开 demo.ipynb 即可交互运行,涵盖四类能力:
- 图像描述(Image captioning)
- 开放式视觉问答(Open-ended VQA)
- 多模态 / 单模态特征提取(Multimodal / unimodal feature extraction)
- 图文匹配(Image-text matching)
- Web Demo:集成在 HuggingFace Spaces 的 Gradio 应用中,另有 Replicate 网页 Demo 与 Docker 镜像可用。
仓库内还提供了基于 Cog 的推理封装 predict.py,其Predictor.setup()一次加载三个模型:blip_decoder(图像描述,image_size 384)、blip_vqa(VQA,image_size 480)、blip_itm(图文匹配,image_size 384)。该脚本展示了三个推理接口的典型用法:
- 图像描述:
model.generate(im, sample=False, num_beams=3, max_length=20, min_length=5),返回 beam search 生成的描述文本; - VQA:
model(im, question, train=False, inference='generate'),开放式生成答案; - 图文匹配:
match_head='itm'输出匹配二分类概率,match_head='itc'输出图像-文本余弦相似度(详见 models/blip_itm.py)。
推理时的图像预处理(predict.py)使用 BICUBIC 插值 Resize 到目标尺寸并执行上述均值方差归一化,与训练保持一致。
任务一:图文检索(Image-Text Retrieval)
数据准备
从原始网站下载 COCO 与 Flickr30k 数据集,然后在 retrieval_coco.yaml(或 retrieval_flickr.yaml)中设置image_root指向图片根目录。仓库数据层(data/coco_karpathy_dataset.py)会自动下载 Karpathy 划分的标注文件(train/val/test JSON),无需手动准备检索标注。
评估微调模型(COCO)
python -m torch.distributed.run --nproc_per_node=8 train_retrieval.py \ --config ./configs/retrieval_coco.yaml \ --output_dir output/retrieval_coco \ --evaluate微调预训练权重(8 张 A100 GPU)
先修改 retrieval_coco.yaml 中的pretrained为预训练权重地址(如model_base.pth),再运行:
python -m torch.distributed.run --nproc_per_node=8 train_retrieval.py \ --config ./configs/retrieval_coco.yaml \ --output_dir output/retrieval_coco核心配置项与源码原理
retrieval_coco.yaml 关键参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
pretrained | model_base_retrieval_coco.pth | 支持 URL 或本地路径 |
vit | base | base或large(large 需配套调整批大小/学习率) |
batch_size_train/batch_size_test | 32 / 64 | large 下建议 16 / 32 |
image_size | 384 | 输入分辨率 |
queue_size | 57600 | 动量队列长度(ITC 训练的负样本池) |
alpha | 0.4 | ITC 软标签权重,第一轮内线性从 0 升到设定值(见 train_retrieval.py) |
k_test | 256 | 评估时 ITM 重排的候选数量 |
negative_all_rank | True | 是否跨所有 rank 收集硬负样本 |
weight_decay/init_lr/min_lr | 0.05 / 1e-5 / 0 | AdamW + 余弦学习率调度(utils.py) |
max_epoch | 6 | 训练轮数 |
vit_grad_ckpt/vit_ckpt_layer | True / 4 | ViT 梯度检查点及起始层,省显存 |
训练损失由 ITC(Image-Text Contrastive,图文对比)+ ITM(Image-Text Matching,图文匹配)两部分组成(models/blip_retrieval.py)。ITM 部分通过从动量编码器计算的相似度中按权重采样负样本,并支持negative_all_rank=True时跨进程收集负样本。评估时(train_retrieval.py)采用“ITC 粗排 + ITM 精排”:先对所有图文对计算归一化余弦相似度取 top-k,再用融合编码器 + ITM head 精排,最终输出 R@1/5/10 与 r_mean(见itm_eval)。最佳模型按验证集r_mean保存为checkpoint_best.pth。
任务二:图像描述(Image Captioning)
数据准备
下载 COCO 与 NoCaps 数据集,分别在 caption_coco.yaml 与 nocaps.yaml 中设置image_root。
评估(COCO)
python -m torch.distributed.run --nproc_per_node=8 train_caption.py --evaluate评估(NoCaps)
生成结果后需提交到官方服务器评估:
python -m torch.distributed.run --nproc_per_node=8 eval_nocaps.py微调(8 张 A100 GPU)
将 caption_coco.yaml 的pretrained设为model_base_capfilt_large.pth,然后:
python -m torch.distributed.run --nproc_per_node=8 train_caption.py生成配置与源码原理
caption_coco.yaml 独有的“生成配置”直接控制解码行为:
| 参数 | 默认值 | 说明 |
|---|---|---|
max_length/min_length | 20 / 5 | 生成序列长度上下界 |
num_beams | 3 | beam search 宽度 |
prompt | 'a picture of ' | 解码提示词(作为前缀参与生成,最终从输出中裁剪掉) |
图像描述模型是BLIP_Decoder(models/blip.py):ViT 视觉编码器 +BertLMHeadModel文本解码器。训练时以提示词前缀后接真实描述作为解码目标(prompt 部分 token 的 loss 置为 -100);推理时从 prompt 开始执行 beam search,eos使用[SEP]token。评估采用 COCO Caption 标准指标(BLEU、METEOR、ROUGE、CIDEr、SPICE),通过pycocoevalcap计算(data/utils.py),最佳模型按验证集CIDEr + Bleu_4保存。
任务三:视觉问答(VQA)
数据准备
下载 VQA v2 与 Visual Genome 数据集,在 vqa.yaml 中设置vqa_root与vg_root(注意目录后需跟train2014/与image/)。
评估
生成结果后需在官方服务器评估:
python -m torch.distributed.run --nproc_per_node=8 train_vqa.py --evaluate微调(16 张 A100 GPU)
将 vqa.yaml 的pretrained设为model_base_capfilt_large.pth,然后:
python -m torch.distributed.run --nproc_per_node=16 train_vqa.py关键配置与推理模式
vqa.yaml 关键参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
train_files | ['vqa_train','vqa_val','vg_qa'] | 训练用标注文件组合 |
image_size | 480 | VQA 使用更高分辨率 |
k_test | 128 | rank 推理候选数 |
inference | 'rank' | rank(在候选答案列表上排序)或generate(开放式生成) |
batch_size_train/batch_size_test | 16 / 32 | — |
init_lr/max_epoch | 2e-5 / 10 | — |
VQA 模型(models/blip_vqa.py)训练时每个问题对应多个标注答案,按 10 人投票比例分配权重(weights,VG 数据固定 0.2,见 data/vqa_dataset.py)。rank模式会先用解码器首 token 的概率对候选答案列表取 top-k,再精排挑选得分最高的答案(rank_answer);generate模式则用 beam search(num_beams=3)直接生成答案。
任务四:NLVR2 视觉推理
数据准备
下载 NLVR2 数据集,在 nlvr.yaml 中设置image_root。
评估
python -m torch.distributed.run --nproc_per_node=8 train_nlvr.py --evaluate微调(16 张 A100 GPU)
将 nlvr.yaml 的pretrained设为model_base.pth,然后:
python -m torch.distributed.run --nproc_per_node=16 train_nlvr.py任务特点与源码原理
NLVR2 是二分类任务(判断句子描述与一对图片是否匹配)。数据层(data/nlvr_dataset.py)会将左右两张图片与句子成对返回,并对含 left/right 的句子做左右交换增强(句子中 left/right 同步互换)。模型(models/blip_nlvr.py)使用专用 nlvr_encoder.py 的双分支跨模态注意力编码两张图片,以[CLS]特征过两层 MLP 分类头,loss 为交叉熵。评估指标为准确率acc,按验证集准确率保存checkpoint_best.pth。nlvr.yaml 中image_size: 384、batch_size_train: 16、init_lr: 3e-5、max_epoch: 15。
使用 ViT-L 骨干微调
README 明确给出 ViT-L 微调方法:只需将配置文件的vit改为large,同时按论文附录调整 batch size 与学习率。各配置文件中已注释好 ViT-L 推荐值,例如 retrieval_coco.yaml:
# vit: 'large' # batch_size_train: 16 # batch_size_test: 32 # vit_grad_ckpt: True # vit_ckpt_layer: 12 # init_lr: 5e-6显存优化方面,可在配置中开启 Gradient checkpoint(vit_grad_ckpt: True配合vit_ckpt_layer指定启用检查点的起始层),该能力依赖 fairscale 提供支持。
预训练(Pre-training)
数据格式
预训练数据由若干 JSON 文件组成,每个文件是一个列表,列表中每个元素为包含两个键值对的字典:
{"image": "path_of_image", "caption": "text_of_image"}在 configs/pretrain.yaml 中设置train_file为这些 JSON 文件的路径列表。
启动预训练(8 张 A100 GPU)
python -m torch.distributed.run --nproc_per_node=8 pretrain.py --config ./configs/Pretrain.yaml --output_dir output/Pretrain(README 命令中./configs/Pretrain.yaml对应仓库内 configs/pretrain.yaml,注意 Linux 路径大小写敏感,实际文件名为小写。)
预训练配置与三目标损失
pretrain.yaml 关键参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
train_file | coco_karpathy_train.json、vg_caption.json | 预训练标注路径列表 |
laion_path | '' | LAION 数据目录(非空则每个 epoch 轮换加载其中的 JSON 文件,见 data/pretrain_dataset.py) |
image_size | 224 | 预训练分辨率低于微调 |
batch_size | 75 | — |
queue_size/alpha | 57600 / 0.4 | 动量队列与软标签 |
init_lr/min_lr/warmup_lr | 3e-4 / 1e-6 / 1e-6 | 学习率区间 |
warmup_steps | 3000 | 首轮线性预热步数(utils.py) |
lr_decay_rate | 0.9 | 步进衰减(lr = max(min_lr, init_lr * decay_rate**epoch),见 utils.py) |
max_epoch | 20 | — |
BLIP_Pretrain(models/blip_pretrain.py)在单一前向过程中联合优化三个目标:
- ITC(Image-Text Contrastive):图文对比学习,借助动量编码器(momentum=0.995)与 57600 长度的跨模态队列提供负样本,并以
alpha * softmax(动量相似度) + (1-alpha) * 真值构造软标签(alpha 在前两个 epoch 内线性 ramp up,见 pretrain.py); - ITM(Image-Text Matching):二分类匹配头,负样本按相似度权重采样;
- LM(Language Modeling):以图像特征为条件做因果语言建模(自回归解码),对应生成任务。
解码器与编码器之间通过tie_encoder_decoder_weights共享部分权重(跳过 attention 层,见 models/blip_pretrain.py)。pretrain.py还支持--checkpoint参数从保存的checkpoint_XX.pth断点续训(同时恢复模型与优化器状态)。
零样本视频-文本检索(Zero-shot Video-Text Retrieval)
BLIP 的图文检索模型可直接零样本迁移到视频-文本检索,无需视频训练数据:
- 按 ALPRO 项目的指引下载 MSRVTT 数据集,在 retrieval_msrvtt.yaml 中设置
video_root; - 安装视频解码依赖:
pip install decord- 执行零样本评估:
python -m torch.distributed.run --nproc_per_node=8 eval_retrieval_video.pyretrieval_msrvtt.yaml 中pretrained复用 COCO 检索权重(model_base_retrieval_coco.pth),num_frm_test: 8表示每个视频均匀采样 8 帧。评估流程(eval_retrieval_video.py)将每帧独立过 ViT 视觉编码器,对帧级特征做平均池化得到视频特征,再走“ITC 粗排 + ITM 精排”;数据集侧使用 decord 解码(data/video_dataset.py),支持 uniform / rand / headtail 三种帧采样策略,指标输出txt_r1/5/10与vid_r1/5/10及vid_mdR中位秩。
预训练数据集下载(Bootstrapped Datasets)
仓库提供 CapFilt 框架产出的“引导式”预训练数据 JSON 文件,每条记录格式为{"url": "url_of_image", "caption": "text_of_image"}(注意此处的预训练下载数据使用url键,而本地训练用数据使用image键,见 data/pretrain_dataset.py)。数据按图像来源与描述来源分为三类:
| 图像来源 | Filtered web caption | Filtered synthetic caption by ViT-B | Filtered synthetic caption by ViT-L |
|---|---|---|---|
| CC3M+CC12M+SBU | ccs_filtered.json | ccs_synthetic_filtered.json | ccs_synthetic_filtered_large.json |
| LAION115M | laion_filtered.json | laion_synthetic_filtered.json | laion_synthetic_filtered_large.json |
其中 “web caption” 是过滤后的原始网页描述,“synthetic caption” 是分别由 ViT-B / ViT-L 生成并经 filter 筛选的合成描述——这正是 BLIP 论文中 CapFilt(Captioning and Filtering)框架的具体产物:用 captioner 为网络图片生成合成描述,再用 filter 剔除噪声,从而提升预训练数据质量。
如何引用与致谢
若本代码对你的研究有帮助,README 建议按如下格式引用:
@inproceedings{li2022blip, title={BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation}, author={Junnan Li and Dongxu Li and Caiming Xiong and Steven Hoi}, year={2022}, booktitle={ICML}, }仓库实现依托 ALBEF、Huggingface Transformers 与 timm 等开源资源,其代码结构也延续了 ALBEF 的动量编码器与队列设计思路。
小结
本文完整覆盖了 README.md 的全部操作路径:从依赖安装、权重下载,到图文检索、图像描述、VQA、NLVR2 四大任务的评估与微调,再到预训练、零样本视频检索与引导式数据集下载。结合仓库源码,你可以进一步深入理解:
- 架构层:ViT(base/large)+ BERT 系多模态编码器/解码器的组装方式(models/blip.py);
- 训练层:ITC + ITM + LM 三目标联合优化、动量队列、软标签与负样本采样(models/blip_pretrain.py、models/blip_retrieval.py);
- 工程层:分布式训练、种子复现、结果保存与 COCO 评估链路(utils.py、data/utils.py)。
最后再次提醒:该仓库已弃用并整合进 LAVIS,新项目建议直接在 LAVIS 生态中使用 BLIP 相关能力;本指南更适合学习与复现论文实验场景。
- 多模态
- 计算机视觉
- NLP
- 预训练
- 微调
- 深度学习
【免费下载链接】BLIP
PyTorch code for BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
相关推荐
芋道管理后台:现代化企业级开源管理平台解决方案
芋道管理后台:现代化企业级开源管理平台解决方案 在数字化转型浪潮中,企业面临管理碎片化、系统孤岛化、开发成本高等多重挑战。芋道管理后台(yudao ui adm
前端企业应用BLIP:统一视觉-语言理解与生成的预训练框架
BLIP:统一视觉 语言理解与生成的预训练框架 项目基础介绍及编程语言 BLIP(Bootstrapping Language Image Pre traini
多模态计算机视觉NLP预训练微调深度学习Notepad-- 上手指南:编辑、批量替换、文件对比一次搞定的跨平台文本编辑器
Notepad 上手指南:编辑、批量替换、文件对比一次搞定的跨平台文本编辑器 Notepad 是一款免费开源的跨平台文本编辑器,Windows、Linux、ma
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考