BLIP-2小结

BLIP-2改进了VLP任务,引入QFormer模块进行模态对齐,采用二阶段预训练法,使用较少数据提升VQAv2性能8.7%。它通过学习查询融合图像信息,并在预训练阶段训练LLM理解图像表征,实现更复杂的视觉推理任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

paper:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models

引用量:376(截止2023-09)

motivation

BLIPv2主要从模态对齐、高效训练两个方向对图文多模态预训练任务(vision-and-language pre-training VLP)做出优化。在模态对齐上提出了一个轻量架构QFormer(querying transformer)来建立图像-文本的桥梁。在高效多模态训练上,结合QFormer提出一种二阶段预训练范式。在VQAv2任务上,仅用了 1 54 \frac{1}{54} 541倍Flamingo80B的训练数据,却带来8.7%精度提升。

method

模型架构

**BLIP2的核心是引入了QFormer(Querying Transformer)模块来将对齐图片特征与文本特征。**QFormer内部包含两个transformer子模块,其一为image transofmrer,其二是text-transformer。image transformer比text-transformer多了一个cross-attention层,这两个transformer共享Self-Attention参数,如下图所示。
在这里插入图片描述

PS: 作者源码中用一个Bert模型来实现QFormer,通过魔改BertLayer实现通过条件判断来确定走image transformer分支还是text-transformer分支。感兴趣的同学可以深入看一下源码,核心逻辑位于:
lavis/models/blip2_models/Qformer.BertLayer

这里面有一个需要注意的点:作者没有将image encoder得到的image embedding作为image transformer的输入,而是定义了一个可训练的query作为输入。image embedding用作cross attention层的key, value。

这个地方理解可能比较难,尝试直觉的解释一下。NLP任务的transformer会对输入的token新增[CLS]token,通过训练将文本的信息融入到【CLS】token中。在分类、检索等下游任务中将【CLS】token对应位置的输出作为文本的表征。这里放一张图便于理解观察shape变化(忽略了batch size维度)。

在这里插入图片描述

类似的,QFormer定义了learning query通过训练将与文本对齐后的图片的信息融入到learning query中。与NLP不同的是:

  • QFormer的image-transforme没有将图片的embedding作为输入和[CLS]token组合起来送入模型,而是将image embedding作为cross-attention的key,value。
  • QFormer的image-transforme输入的【CLS】 token有多个(姑且这么称呼,论文称为learned queries,其实是一回事),而NLP中只有一个【CLS】token。

PS: 这种做法现在CV里面很常用。如Dalle2中的DiffusionPrior模块,diffusion model中的text inversion技术都用到了类似的思想。

QFormer的整体pipeline如下图所示,为了便于理解同时给出了shape变化(忽略了batch size维度)。image encoder是eva_clip_g

在这里插入图片描述

2.2 多模态预训练任务

BLIP2的预训练任务分为两个阶段。第一个阶段用于对齐多模态表征。主要通过Image-Text Contrastive Loss (ITC)、 Image-text matching (ITM)、Image-grounded Text Generation3个任务的联合训练来实现。第二个阶段用于让LLM理解第一个阶段产生的soft visual prompt的语义,从而借助LLM强大的知识库实现视觉推理等更为复杂的任务,主要通过language modeling(LM)任务的训练来实现。

BLIP2的预训练任务同样用了BLIP提出的boostrapping caption(也称为CapFilt method)技术。

2.2.1 多模态表征对齐预训练

主要通过ITC、ITM, ITG三个预训练任务来对齐QFormer产生的文本表征与图片表征。三个预训练任务联合优化。

Image-Text Contrastive Loss (ITC)

与常规ITC任务不同的是:单个图片BLIP2产生的image embedding有32个(等于learned query的数量),而text embedding只有1个。BLIP2的操作是,同时计算32个image embedding与text embedding的距离,仅取最近的计算loss

下图详细梳理了整体pipeline及对应的shape变化(忽略了batchsize)

在这里插入图片描述

Image-text matching (ITM)

图片匹配的整体架构如下图所示。此时会将query embedding与text embedding拼接起来作为输入,送入到QFormer中的Image Transformer中。最后对Qformer在query embedding位置的输出向量取平均后进行预测。下图中详细展示了整体pipeline与shape变化(包含batch size维度)。

在这里插入图片描述

Image-grounded Text Generation (ITG)

此处直接用QFormer的text transformer做image caption任务。有一个细节值得注意:作者将图片与文本表征的交互放到了self-attention中。下图是摘取的部分self-attention层代码。

在这里插入图片描述

2.2.2 多模态表征理解预训练

通过2.2.1我们得到一个训练好的QFormer,这个QFormer能够实现将图片转为一个32x768(用32个token来表征图像)。2.2.2的任务是让预训练的LLM模型能够理解上述的图片表征,从而借助LLM强大的知识库来实现问答、推理等任务。也就是说,这一阶段我们需要通过训练来赋予图片token能被LLM理解的语义。

这一步的训练比较简单。固定image encoder与预训练的LLM模型,仅训练QFormer和新增的一个投影层。训练任务为language modeling。最终实现QFormer输出的图片表征(论文称之为soft visual prompt)变成LLM能看懂的样子。

在这里插入图片描述

3 小结

BLIP2通过QFormer模块与二阶段训练的范式,将目前的视觉backbone与LLM模型链接起来。

<think>好的,我需要帮助用户了解Blip-2的实际应用案例或教程。首先,根据用户提供的引用内容,引用[1]提到了使用预训练模型进行推理的代码示例,这可能与Blip相关。引用[2]讨论了模型训练的不同阶段,包括预训练和微调,这可能涉及到如何应用Blip-2。引用[3]提供了一个模型文件的下载链接,可能用于实际操作。 首先,我应该确认Blip-2的主要功能和应用场景。Blip-2通常用于图像到文本的任务,如图像描述生成、视觉问答(VQA)和多模态任务。接下来,我需要结合用户提供的引用内容,特别是引用[1]中的代码示例,这可能是一个使用Blip模型进行图像描述的实例。用户可能希望了解如何在实际项目中使用Blip-2,例如加载模型、处理输入图像、生成输出等步骤。 然后,考虑到用户可能需要教程或应用实例,我应该分步骤解释如何使用Blip-2,包括安装环境、加载预训练模型、进行推理等。同时,引用[2]提到微调和轻量化微调,这部分可能涉及如何根据特定任务调整Blip-2,比如在自己的数据集上进行微调。需要确保提供的步骤正确,并参考用户提供的链接,例如引用[3]中的模型文件,可能需要指导用户如何下载和加载这些模型。 另外,用户提供的示例中有代码块,因此我也需要提供一个清晰的代码示例,类似于快速排序的Python代码,但这里应展示Blip-2的应用代码。需要确保代码格式正确,使用正确的语法,并解释每个步骤的作用。 可能还需要考虑常见问题,例如环境配置问题、模型加载错误或处理不同输入格式的方法。此外,引用[2]中的阶段划分可能提示用户对学习路径有兴趣,因此相关问题可以包括进阶学习资源或如何将Blip-2集成到商业应用中。 最后,生成的相关问题应围绕Blip-2的实际应用、优化方法、与其他模型的对比以及商业应用展开,帮助用户进一步探索。需要确保所有回答符合格式要求,如使用中文、正确的LaTeX格式,以及引用标记。</think>### Blip-2 实战教程与应用实例 Blip-2 是一种基于多模态预训练的视觉-语言模型,广泛应用于图像描述生成、视觉问答(VQA)、跨模态检索等任务。以下是其核心应用场景及实战示例: --- #### **1. 基础应用:图像描述生成** 通过加载预训练模型,输入图像可直接生成文本描述。例如,使用以下代码进行推理: ```python from transformers import Blip2Processor, Blip2ForConditionalGeneration import torch from PIL import Image # 加载预训练模型和处理器 processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b") model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16) device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) # 输入图像并生成描述 image = Image.open("demo/cat-dog.png").convert("RGB") inputs = processor(images=image, return_tensors="pt").to(device, torch.float16) generated_ids = model.generate(**inputs, max_new_tokens=20) description = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] print(description) # 输出示例:"一只猫和一只狗在草地上玩耍" ``` 此代码展示了如何利用 Blip-2 生成图像描述[^1]。 --- #### **2. 进阶应用:视觉问答(VQA)** Blip-2 可结合图像和问题生成答案。例如,输入图像和问题“猫是什么颜色的?”: ```python question = "猫是什么颜色的?" inputs = processor(images=image, text=question, return_tensors="pt").to(device, torch.float16) generated_ids = model.generate(**inputs, max_new_tokens=10) answer = processor.batch_decode(generated_ids, skip_special_tokens=True)[0] print(answer) # 输出示例:"棕色" ``` --- #### **3. 微调(Fine-tuning)** 若需针对特定任务优化模型(如医疗图像描述),可加载预训练权重并在自定义数据集上微调: ```python from datasets import load_dataset # 加载数据集(示例) dataset = load_dataset("your_custom_dataset") # 配置训练参数 from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./results", per_device_train_batch_size=4, num_train_epochs=3, ) trainer = Trainer( model=model, args=training_args, train_dataset=dataset["train"], ) trainer.train() ``` 微调可显著提升模型在垂直领域的表现[^2]。 --- #### **4. 轻量化部署** 为降低推理成本,可将模型转换为 ONNX 格式或使用量化技术: ```python model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16) model = torch.quantization.quantize_dynamic(model, {torch.nn.Linear}, dtype=torch.qint8) ``` 此方法适用于移动端或边缘设备部署[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值