社区计算机视觉课程文档

多模态文本生成 (BLIP)

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

多模态文本生成 (BLIP)

介绍

在 CLIP 发布后,AI 社区认识到更大的数据集和对比学习在深度学习中具有巨大的潜力。该领域的一个重大发展是 BLIP(引导语言-图像预训练),它扩展了多模态模型的功能,使其能够进行文本生成。

CapFilt:标题和过滤

由于多模态模型需要大型数据集,因此它们通常必须使用图像和替代文本 (alt-text) 对从互联网上抓取。但是,alt-text 常常无法准确描述图像的视觉内容,使其成为学习视觉-语言对齐的次优噪声信号。因此,BLIP 论文引入了一种标题和过滤机制 (CapFilt)。它由一个过滤掉噪声对的深度学习模型和另一个为图像创建标题的模型组成。这两个模型首先使用人类标注的数据集进行微调。他们发现,使用 CapFit 清理数据集比仅使用 Web 数据集产生了更好的性能。有关此过程的更多详细信息,请参阅 BLIP 论文

BLIP 架构和训练

BLIP 架构结合了视觉编码器和多模态编码器-解码器混合 (MED),能够灵活地处理视觉和文本数据。其结构如下图所示,其中(颜色相同的块共享参数)

  • 视觉转换器 (ViT):这是一个普通的视觉转换器,具有自注意力、前馈块和用于嵌入表示的 [CLS] 标记。
  • 单模态文本编码器:类似于 BERT 的架构,它使用 [CLS] 标记进行嵌入,并使用类似 CLIP 的对比损失来对齐图像和文本表示。
  • 图像接地文本编码器:它用 [Encode] 标记替换 [CLS] 标记。交叉注意力层能够整合图像和文本嵌入,从而创建多模态表示。它使用线性层来评估图像-文本对的一致性。
  • 图像接地文本解码器:将双向自注意力替换为因果自注意力,该解码器以自回归的方式通过交叉熵损失进行训练,用于标题生成或回答视觉问题等任务。

BLIP 的架构将视觉编码器与多模态编码器-解码器组件混合,实现了高级的文本和图像处理。这种设计使其能够熟练地处理各种任务,从对齐图像-文本对到生成标题和回答视觉问题。

示例用例:BLIP-2

继 BLIP 成功之后,其创建者 Salesforce 推出了 BLIP-2,这是一个增强的版本。BLIP-2 的进步和功能在 BLIP-2 论文Hugging Face 文档 中有详细介绍。在这里,我们利用 BLIP-2 进行视觉问答。

from PIL import Image
import requests
from transformers import Blip2Processor, Blip2ForConditionalGeneration
import torch

device = "cuda" if torch.cuda.is_available() else "cpu"

processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained(
    "Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16
)
model.to(device)
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

prompt = "Question: How many remotes are there? Answer:"
inputs = processor(images=image, text=prompt, return_tensors="pt").to(
    device, torch.float16
)
outputs = model.generate(**inputs)
text = processor.tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(text)

此代码片段说明了 BLIP-2 在视觉问答中的应用。尝试使用更复杂的查询或使用提供的 Gradio 应用进一步探索此功能。

结论

BLIP 在多模态文本生成方面取得了重大突破,它利用了 CLIP 的优势来创建一个强大的模型。它强调了数据集质量胜过数量的重要性,推动了多模态学习的发展。更多详细信息,请参考BLIP 论文BLIP-2 论文以及 Hugging Face 的文档,分别关于BLIPBLIP-2

< > GitHub 更新