SuperAPI AI 工具集

blip-2-vision-language

智能体与模型

查看项目

更新于 10-30 06:46

技能介绍

BLIP-2 是 Salesforce 提出的视觉-语言预训练框架,用于连接冻结的图像编码器与冻结的大语言模型,完成多种跨模态任务。

用途 BLIP-2 适用于以下场景:需要高质量、自然语言风格的图像描述;构建视觉问答(VQA)系统;在无需任务特定训练的情况下进行零样本图文理解;借助 LLM 的推理能力处理视觉任务;构建多模态对话 AI;以及图像-文本检索或匹配。

主要能力

  • Q-Former 架构:轻量级查询 Transformer,作为视觉与语言之间的桥梁。
  • 冻结骨干效率:无需微调大型视觉或语言模型。
  • 多种 LLM 后端:OPT(2.7B、6.7B)与 FlanT5(XL、XXL)。
  • 零样本能力:无需任务特定训练即可获得较强表现。
  • 高效训练:仅训练 Q-Former(约 1.88 亿参数)。
  • 在 VQA 基准上优于更大模型。

模型变体

  • 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,质量最佳。

使用方式 安装:

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)

视觉问答: 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".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)

高级用法

  • 批量处理:可一次传入多张图像与多个问题,设置 padding=True。
  • 生成控制:支持 max_new_tokens、min_length、num_beams、no_repeat_ngram_size、top_p、temperature、do_sample 等参数;确定性输出可设 do_sample=False。
  • 内存优化:通过 BitsAndBytesConfig 支持 8 位与 4 位量化。
  • 图文匹配:使用 blip2_image_text_matching 模型,通过 match_head="itm" 获取匹配分数。
  • 特征提取:使用 blip2_feature_extractor 提取 image_embeds、image_embeds_proj、text_embeds、text_embeds_proj 等特征。

常见工作流

  1. 图像描述流水线:封装 ImageCaptioner 类,支持单图与批量描述,可传入 prompt 控制风格。
  2. 视觉问答系统:封装 VisualQA 类,先 set_image 再 ask,支持一次设置图像后多次提问。
  3. 图像搜索/检索:使用 blip2_feature_extractor 建立图像索引,再用文本查询计算相似度并返回 top_k 结果。

输出格式

  • 生成输出:model.generate 返回 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 显存需求:blip2-opt-2.7b 约 8GB,blip2-opt-6.7b 约 16GB,blip2-flan-t5-xl 约 10GB,blip2-flan-t5-xxl 约 26GB。INT8 与 INT4 可显著降低显存占用。速度优化可使用 Flash Attention 2、torch.compile,默认图像尺寸 224x224 已较优。

适用场景与限制 适合零样本图像描述、VQA、图文匹配与检索、多模态对话原型。若需要指令跟随的多模态聊天,可考虑 LLaVA 或 InstructBLIP;生产级多模态聊天可考虑 GPT-4V/Claude 3;仅需简单图文相似度可考虑 CLIP;少样本视觉学习可考虑 Flamingo。常见问题包括 CUDA OOM(可用量化或更小模型)、生成慢(可用贪心解码、减少 max_new_tokens)、描述质量差(可尝试 FlanT5 变体或使用 prompt)、幻觉(可降低 temperature、使用 beam search)、答案错误(可改写问题或提供上下文)。

参考资源 论文:https://arxiv.org/abs/2301.12597 GitHub(LAVIS):https://github.com/salesforce/LAVIS HuggingFace:https://huggingface.co/Salesforce/blip2-opt-2.7b