用途
BLIP-2 是 Salesforce 提出的视觉-语言预训练模型,适用于以下场景:
- 需要高质量、自然语言的图像描述(image captioning)
- 构建视觉问答(VQA)系统
- 需要无需任务特定训练的零样本图文理解
- 希望借助大语言模型的推理能力处理视觉任务
- 构建多模态对话 AI
- 需要图文检索或匹配
文档同时指出可考虑的替代方案:LLaVA(指令跟随多模态对话)、InstructBLIP(BLIP-2 的改进后继版本,指令跟随更强)、GPT-4V/Claude 3(生产级多模态对话,专有)、CLIP(无需生成的简单图文相似度)、Flamingo(少样本视觉学习)。
主要能力
- Q-Former 架构:轻量级查询 Transformer 桥接视觉与语言
- 冻结主干效率:无需微调大型视觉/语言模型
- 多种 LLM 后端:OPT(2.7B、6.7B)与 FlanT5(XL、XXL)
- 零样本能力:无需任务特定训练即有较强表现
- 高效训练:仅训练 Q-Former(约 1.88 亿参数)
- 先进结果:在 VQA 基准上超过更大的模型
模型变体与用途:
| 模型 | LLM 后端 | 大小 | 用途 |
|---|---|---|---|
| blip2-opt-2.7b | OPT-2.7B | ~4GB | 通用描述、VQA |
| blip2-opt-6.7b | OPT-6.7B | ~8GB | 更强推理 |
| blip2-flan-t5-xl | FlanT5-XL | ~5GB | 指令跟随 |
| blip2-flan-t5-xxl | FlanT5-XXL | ~13GB | 最佳质量 |
Q-Former 组件:学习查询(32 × 768 的可学习嵌入)、图像 Transformer(对视觉特征做交叉注意力,约 1.08 亿参数)、文本 Transformer(文本自注意力,约 1.08 亿参数)、线性投影(映射到 LLM 维度,视情况而定)。
使用方式
安装
HuggingFace Transformers(推荐):
pip install transformers accelerate torch Pillow
或 LAVIS 库(Salesforce 官方):
pip install salesforce-lavis
基础图像描述(HuggingFace)
import torch
from PIL import Image
from transformers import Blip2Processor, Blip2ForConditionalGeneration
processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained(
"Salesforce/blip2-opt-2.7b",
torch_dtype=torch.float16,
device_map="auto"
)
image = Image.open("photo.jpg").convert("RGB")
inputs = processor(images=image, return_tensors="pt").to("cuda", torch.float16)
generated_ids = model.generate(**inputs, max_new_tokens=50)
caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(caption)
视觉问答(VQA)
question = "What color is the car in this image?"
inputs = processor(images=image, text=question, return_tensors="pt").to("cuda", torch.float16)
generated_ids = model.generate(**inputs, max_new_tokens=50)
answer = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(answer)
使用 LAVIS 库
import torch
from lavis.models import load_model_and_preprocess
from PIL import Image
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model, vis_processors, txt_processors = load_model_and_preprocess(
name="blip2_opt",
model_type="pretrain_opt2.7b",
is_eval=True,
device=device
)
image = Image.open("photo.jpg").convert("RGB")
image = vis_processors["eval"](image).unsqueeze(0).to(device)
caption = model.generate({"image": image})
print(caption)
question = txt_processors["eval"]("What is in this image?")
answer = model.generate({"image": image, "prompt": question})
print(answer)
常见工作流
文档给出三类工作流示例:
- 图像描述流水线:封装 ImageCaptioner 类,支持单图描述、带提示词的风格化描述以及批量处理(使用 padding)。
- 视觉问答系统:封装 VisualQA 类,先 set_image 加载图像,再多次 ask 提问;对 FlanT5 使用
Question: {question} Answer:提示格式;支持 ask_multiple 批量提问。 - 图像搜索/检索:使用
blip2_feature_extractor模型,通过extract_features提取图像与文本特征,计算相似度并返回 top_k 结果。
输出格式
生成输出为 token ID,形状 [batch_size, sequence_length],经 batch_decode 转为字符串列表。特征提取输出包括:image_embeds([B, 32, 768])、image_embeds_proj([B, 32, 256])、text_embeds([B, seq_len, 768])、text_embeds_proj([B, 256])。
性能优化
显存需求(FP16 / INT8 / INT4):
| 模型 | FP16 | INT8 | INT4 |
|---|---|---|---|
| blip2-opt-2.7b | ~8GB | ~5GB | ~3GB |
| blip2-opt-6.7b | ~16GB | ~9GB | ~5GB |
| blip2-flan-t5-xl | ~10GB | ~6GB | ~4GB |
| blip2-flan-t5-xxl | ~26GB | ~14GB | ~8GB |
速度优化:可使用 Flash Attention(attn_implementation="flash_attention_2",需安装 flash-attn)、torch.compile(PyTorch 2.0+),默认 224x224 图像尺寸已是最优。
适用场景与限制
适用场景包括图像描述、VQA、零样本图文理解、多模态对话、图文检索。文档也列出常见问题与解决方式:CUDA OOM(使用 INT8/INT4 量化或更小模型)、生成缓慢(贪心解码、减少 max_new_tokens)、描述质量差(尝试 FlanT5 变体、使用提示词)、幻觉(降低温度、使用束搜索)、答案错误(改写问题、提供上下文)。
操作流程建议:先检查环境(GPU 显存、模型检查点与许可、框架版本、输入格式),确认输入格式与参数,先在小样本上低分辨率或短长度试运行,再执行完整任务,最后验证结果并报告运行情况。文档强调不得编造结果、参数、标识符、引用或统计;商业或发布使用前需检查模型与数据集许可;版本相关细节可能过时,应以已安装版本的官方文档为准;涉及费用、共享 GPU、云配额、个人或患者数据以及不可撤销操作时,需先征得同意。
资源
- 论文:https://arxiv.org/abs/2301.12597
- GitHub(LAVIS):https://github.com/salesforce/LAVIS
- HuggingFace:https://huggingface.co/Salesforce/blip2-opt-2.7b
- Demo:https://huggingface.co/spaces/Salesforce/BLIP2
- InstructBLIP(后继版本):https://arxiv.org/abs/2305.06500
相关技能:clip、llava、quantizing-models-bitsandbytes。