news 2026/10/15 3:16:38

BLIP 统一视觉-语言预训练框架(PyTorch)实战指南:图文检索、图像描述、VQA 与 NLVR2 微调全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BLIP 统一视觉-语言预训练框架(PyTorch)实战指南:图文检索、图像描述、VQA 与 NLVR2 微调全流程
  • 多模态
  • 计算机视觉
  • NLP
  • 预训练
  • 微调
  • 深度学习

【免费下载链接】BLIP

PyTorch code for BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

项目地址:https://gitcode.com/gh_mirrors/bl/BLIP
点击查看免费下载

本文是 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.txt

requirements.txt 中锁定四个关键依赖:

依赖包版本用途
timm0.4.12提供 Vision Transformer 骨干与预训练权重加载(timm.models.hub.download_cached_file)
transformers4.15.0提供 BERT Tokenizer 与文本编码器基础结构
fairscale0.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_diroutput/xxx输出目录(自动创建,并写入config.yaml备份与log.txt)
--evaluatestore_true仅评估模式,不训练
--devicecuda运行设备
--seed42随机种子(实际为seed + rank)
--world_size1分布式进程数
--dist_urlenv://分布式初始化方式
--distributedTrue是否启用分布式

预训练与微调权重清单

README 提供了两类权重:预训练权重与各任务微调权重。所有权重均为.pth文件,可通过 URL 直接下载,也可在配置文件中以 URL 或本地文件路径形式写入pretrained字段。模型权重加载逻辑见 models/blip.py:会先做visual_encoder.pos_embed的位置编码插值(interpolate_pos_embed),再以strict=False加载并剔除形状不匹配的键。

预训练权重(按预训练图像数量分档):

预训练图像数BLIP w/ ViT-BBLIP w/ ViT-B + CapFilt-LBLIP w/ ViT-L
14Mmodel_base_14M.pth——
129Mmodel_base.pthmodel_base_capfilt_large.pthmodel_large.pth

微调权重:

任务BLIP w/ ViT-BBLIP w/ ViT-B + CapFilt-LBLIP 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.pthmodel_large_caption.pth
VQAmodel_vqa.pthmodel_base_vqa_capfilt_large.pth—
NLVR2model_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 路径:

  1. Colab Notebook(无需 GPU):打开 demo.ipynb 即可交互运行,涵盖四类能力:
    • 图像描述(Image captioning)
    • 开放式视觉问答(Open-ended VQA)
    • 多模态 / 单模态特征提取(Multimodal / unimodal feature extraction)
    • 图文匹配(Image-text matching)
  2. 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 关键参数:

参数默认值说明
pretrainedmodel_base_retrieval_coco.pth支持 URL 或本地路径
vitbasebase或large(large 需配套调整批大小/学习率)
batch_size_train/batch_size_test32 / 64large 下建议 16 / 32
image_size384输入分辨率
queue_size57600动量队列长度(ITC 训练的负样本池)
alpha0.4ITC 软标签权重,第一轮内线性从 0 升到设定值(见 train_retrieval.py)
k_test256评估时 ITM 重排的候选数量
negative_all_rankTrue是否跨所有 rank 收集硬负样本
weight_decay/init_lr/min_lr0.05 / 1e-5 / 0AdamW + 余弦学习率调度(utils.py)
max_epoch6训练轮数
vit_grad_ckpt/vit_ckpt_layerTrue / 4ViT 梯度检查点及起始层,省显存

训练损失由 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_length20 / 5生成序列长度上下界
num_beams3beam 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_size480VQA 使用更高分辨率
k_test128rank 推理候选数
inference'rank'rank(在候选答案列表上排序)或generate(开放式生成)
batch_size_train/batch_size_test16 / 32—
init_lr/max_epoch2e-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_filecoco_karpathy_train.json、vg_caption.json预训练标注路径列表
laion_path''LAION 数据目录(非空则每个 epoch 轮换加载其中的 JSON 文件,见 data/pretrain_dataset.py)
image_size224预训练分辨率低于微调
batch_size75—
queue_size/alpha57600 / 0.4动量队列与软标签
init_lr/min_lr/warmup_lr3e-4 / 1e-6 / 1e-6学习率区间
warmup_steps3000首轮线性预热步数(utils.py)
lr_decay_rate0.9步进衰减(lr = max(min_lr, init_lr * decay_rate**epoch),见 utils.py)
max_epoch20—

BLIP_Pretrain(models/blip_pretrain.py)在单一前向过程中联合优化三个目标:

  1. ITC(Image-Text Contrastive):图文对比学习,借助动量编码器(momentum=0.995)与 57600 长度的跨模态队列提供负样本,并以alpha * softmax(动量相似度) + (1-alpha) * 真值构造软标签(alpha 在前两个 epoch 内线性 ramp up,见 pretrain.py);
  2. ITM(Image-Text Matching):二分类匹配头,负样本按相似度权重采样;
  3. LM(Language Modeling):以图像特征为条件做因果语言建模(自回归解码),对应生成任务。

解码器与编码器之间通过tie_encoder_decoder_weights共享部分权重(跳过 attention 层,见 models/blip_pretrain.py)。pretrain.py还支持--checkpoint参数从保存的checkpoint_XX.pth断点续训(同时恢复模型与优化器状态)。

零样本视频-文本检索(Zero-shot Video-Text Retrieval)

BLIP 的图文检索模型可直接零样本迁移到视频-文本检索,无需视频训练数据:

  1. 按 ALPRO 项目的指引下载 MSRVTT 数据集,在 retrieval_msrvtt.yaml 中设置video_root;
  2. 安装视频解码依赖:
pip install decord
  1. 执行零样本评估:
python -m torch.distributed.run --nproc_per_node=8 eval_retrieval_video.py

retrieval_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 captionFiltered synthetic caption by ViT-BFiltered synthetic caption by ViT-L
CC3M+CC12M+SBUccs_filtered.jsonccs_synthetic_filtered.jsonccs_synthetic_filtered_large.json
LAION115Mlaion_filtered.jsonlaion_synthetic_filtered.jsonlaion_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

项目地址:https://gitcode.com/gh_mirrors/bl/BLIP
点击查看免费下载

相关推荐

上一篇:huggingface_hub 搜索指南:用 Python 与 CLI 精准检索 Hub 上的模型、数据集与 Spaces
下一篇:如何永久保存你的QQ空间青春记忆:终极备份指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 3:14:50

C#调用zlgcan DLL实现CAN上位机通信:从P/Invoke到避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 3:14:04

Kruskal算法从原理到实战:最小生成树与并查集避坑指南

1. 从“修路”说起:Kruskal算法到底在解决什么问题如果你手头有一堆散落的村庄,每个村庄之间修路的成本各不相同,现在要你用最低的总成本把所有村庄连通起来,让任意两个村庄之间都能互相到达——你会怎么修?这个问题在…

作者头像 李华
网站建设 2026/10/15 3:14:02

OpenAI兼容接口不是万能转换器:多模型迁移中的隐藏问题

一个项目把多个模型“都接上”之后代码反而更难维护,根本原因通常不是模型数量变多,而是不同供应商的接口契约、错误模型、流式语义、工具调用能力和 Token 统计方式悄悄渗进了业务代码。OpenAI 兼容接口解决的是“调用姿势像 OpenAI”这件事&#xff0c…

作者头像 李华
网站建设 2026/10/15 3:13:00

前端转大模型开发3个月实战!从0到1踩坑总结,面试官直呼内行

文章分享了作者从前端转型大模型应用开发的三个月学习历程,分为三个阶段:第一阶段(1个月)恶补基础,通过React聊天组件练手流式渲染等核心技能;第二阶段(1个月)深入学习RAG原理&#…

作者头像 李华
网站建设 2026/10/15 3:09:30

wiliwili 终极指南:把游戏机变成全平台 B 站播放器

wiliwili 终极指南:把游戏机变成全平台 B 站播放器 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili wiliwili 是一款专…

作者头像 李华