关于人工智能:使用-BLIP2-零样本图生文

44次阅读

共计 5658 个字符,预计需要花费 15 分钟才能阅读完成。

本文将介绍来自 Salesforce 研究院的 BLIP-2 模型,它反对一整套最先进的视觉语言模型,且已集成入 🤗 Transformers。
咱们将向你展现如何将其用于图像字幕生成、有提醒图像字幕生成、视觉问答及基于聊天的提醒这些利用场景。

简介

近年来,计算机视觉和自然语言解决畛域各自都获得了飞速发展。但许多理论问题实质上其实是多模态的,即它们同时波及几种不同模式的数据,如图像和文本。因而,须要视觉语言模型来帮忙解决一系列组合模态的挑战,咱们的技术能力最终失去宽泛落地。视觉语言模型能够解决的一些 图生文 工作包含图像字幕生成、图文检索以及视觉问答。图像字幕生成能够用于视障人士辅助、创立有用的产品描述、辨认非文本模态的不当内容等。图文检索能够用于多模态搜寻,也可用于主动驾驶场合。视觉问答能够助力教育行业、使能多模态聊天机器人,还可用于各种特定畛域的信息检索利用。

古代计算机视觉和自然语言模型在能力越来越弱小的同时,模型尺寸也随之显著增大。因为以后进行一次单模态模型的预训练既消耗资源又低廉,因而端到端视觉语言预训练的老本也已变得越来越高。

BLIP-2 通过引入一种新的视觉语言预训练范式来应答这一挑战,该范式能够任意组合并充分利用两个预训练好的视觉编码器和 LLM,而无须端到端地预训练整个架构。这使得咱们能够在多个视觉语言工作上实现最先进的后果,同时显著缩小训练参数量和预训练老本。此外,这种办法为多模态 ChatGPT 类利用奠定了根底。

BLIP-2 葫芦里卖的什么药?

BLIP-2 通过在解冻的预训练图像编码器和解冻的预训练大语言模型之间增加一个轻量级 查问 Transformer (Query Transformer, Q-Former) 来弥合视觉和语言模型之间的模态隔膜 (modality gap)。在整个模型中,Q-Former 是惟一的可训练模块,而图像编码器和语言模型始终保持解冻状态。

Q-Former 是一个 transformer 模型,它由两个子模块组成,这两个子模块共享雷同的自注意力层:

  • 与解冻的图像编码器交互的 图像 transformer,用于视觉特征提取
  • 文本 transformer,用作文本编码器和解码器

图像 transformer 从图像编码器中提取固定数量的输入特色,这里特色的个数与输出图像分辨率无关。同时,图像 transformer 接管若干查问嵌入作为输出,这些查问嵌入是可训练的。这些查问还能够通过雷同的自注意力层与文本进行交互 (译者注: 这里的雷同是指图像 transformer 和文本 transformer 对应的自注意力层是共享的)。

Q-Former 分两个阶段进行预训练。

第一阶段,图像编码器被解冻,Q-Former 通过三个损失函数进行训练:

  • 图文比照损失 (image-text contrastive loss): 每个查问的输入都与文本输入的 CLS 词元计算成对类似度,并从中抉择类似度最高的一个最终计算比照损失。在该损失函数下,查问嵌入和文本不会“看到”彼此。
  • 基于图像的文本生成损失: 查问外部能够互相计算注意力但不计算文本词元对查问的注意力,同时文本外部的自注意力应用因果掩码且需计算所有查问对文本的注意力。
  • 图文匹配损失 (image-text matching loss): 查问和文本能够看到彼此,最终取得一个几率 (logit) 用以示意文字与图像是否匹配。这里,应用难例开掘技术 (hard negative mining) 来生成负样本。

图像 transformer 作为一个信息瓶颈 (information bottleneck),查问嵌入通过它后,其输入嵌入曾经不仅仅蕴含了视觉信息,而且蕴含了与文本相干的视觉信息。这些输入嵌入用作第二阶段 LLM 输出的视觉前缀。该预训练阶段次要波及一个以基于图像的文本生成工作,损失函数应用因果 LM 损失。

BLIP-2 应用 ViT 作为视觉编码器。而对于 LLM,论文作者应用 OPT 和 Flan T5 模型。你能够找到在
Hugging Face Hub 上找到 OPT 和 Flan T5 的预训练 checkpoints。

但不要遗记,如前所述,BLIP-2 设计的预训练方法容许任意的视觉骨干模型和 LLM 的组合。

通过 Hugging Face Transformers 应用 BLIP-2

应用 Hugging Face Transformers,你能够轻松下载并在你本人的图像上运行预训练的 BLIP-2 模型。如果你想跑跑本文中的示例,请确保应用大显存 GPU。

咱们从装置 Transformers 开始。因为此模型是最近才增加到 Transformers 中的,因而咱们须要从源代码装置 Transformers:

pip install git+https://github.com/huggingface/transformers.git

接下来,咱们须要一个输出图像。《纽约客》每周都会面向其读者举办一场 卡通字幕较量。咱们从中取一张卡通图像输出给 BLIP-2 用于测试。

import requests
from PIL import Image

url = 'https://media.newyorker.com/cartoons/63dc6847be24a6a76d90eb99/master/w_1160,c_limit/230213_a26611_838.jpg'
image = Image.open (requests.get (url, stream=True).raw).convert ('RGB')  
display (image.resize ((596, 437)))

当初咱们有一张输出图像了,还须要一个预训练过的 BLIP-2 模型和相应的预处理器来解决输出。你
能够在 Hugging Face Hub 上找到所有可用的预训练 checkpoints 列表。这里,咱们将加载一个应用 Meta AI 的预训练 OPT 模型的 BLIP-2 checkpoint,该 OPT 模型具备 27 亿个参数。

from transformers import AutoProcessor, Blip2ForConditionalGeneration
import torch

processor = AutoProcessor.from_pretrained ("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained ("Salesforce/blip2-opt-2.7b", torch_dtype=torch.float16)

请留神,你临时还无奈应用 Auto API (例如 AutoModelForXXX) 来加载 BLIP-2 模型,这种状况在 Hugging Face 中比拟少见。你须要显式应用 Blip2ForConditionalGeneration 来加载 BLIP-2 模型。尽管主动获取模型还不能做到,然而你能够应用 AutoProcessor 来获取匹配的处理器类,在本例中为 Blip2Processor

咱们能够应用 GPU 来放慢文本生成速度:

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

图像字幕生成

咱们先看看 BLIP-2 是否能够零样本地为《纽约客》卡通图像生成字幕。要为图像增加字幕,咱们不用向模型提供任何文本提醒,仅提供预处理过的输出图像。没有任何文字提醒,模型将从 BOS (beginning-of-sequence) 开始生成图像字幕。

inputs = processor (image, return_tensors="pt")

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"two cartoon monsters sitting around a campfire"

对于未应用《纽约客》格调的卡通图像训练过的模型,这是一个令人印象粗浅的精确形容!

有提醒图片字幕生成

咱们还能够通过提供文本提醒来扩大图像字幕生成,模型将在给定图像的状况下接着提醒词往下补充。

prompt = "this is a cartoon of"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"two monsters sitting around a campfire"
prompt = "they look like they are"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=20)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"having a good time"

视觉问答

用于视觉问答时,提醒必须遵循特定格局: “Question: {} Answer:”

prompt = "Question: What is a dinosaur holding? Answer:"

inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=10)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
"A torch"

基于聊天的提醒

最初,咱们能够通过拼接对话中每轮的问题和答复来创立相似 ChatGPT 的体验。咱们用某个提醒 (比方“恐龙拿着什么?”) 来问模型,模型会为它生成一个答案 (如“火炬”),咱们能够把这一问一答拼接到对话中。而后咱们再来一轮,这样就把上下文 (context) 建设起来了。
然而,须要确保的是,上下文不能超过 512 个标记,因为这是 BLIP-2 应用的语言模型 (OPT 和 T5) 的上下文长度。

context = [("What is a dinosaur holding?", "a torch"),
   ("Where are they?", "In the woods.")
]
question = "What for?"
template = "Question: {} Answer: {}."

prompt = "".join ([template.format (context [i][0], context [i][1]) for i in range (len (context))]) +" Question: "+ question +" Answer:"

print (prompt)
Question: What is a dinosaur holding? Answer: a torch. Question: Where are they? Answer: In the woods.. Question: What for? Answer:
inputs = processor (image, text=prompt, return_tensors="pt").to (device, torch.float16)

generated_ids = model.generate (**inputs, max_new_tokens=10)
generated_text = processor.batch_decode (generated_ids, skip_special_tokens=True)[0].strip ()
print (generated_text)
To light a fire.

论断

BLIP-2 是一种零样本视觉语言模型,可用于各种含图像和文本提醒的图像到文本工作。这是一种成果好且效率高的办法,可利用于多种场景下的图像了解,特地是当训练样本稀缺时。

该模型通过在预训练模型之间增加 transformer 来弥合视觉和自然语言模态之间的隔膜。这一新的预训练范式使它可能充沛享受两种模态的各自的停顿的红利。

如果您想理解如何针对各种视觉语言工作微调 BLIP-2 模型,请查看 Salesforce 提供的 LAVIS 库,它为模型训练提供全面反对。

要查看 BLIP-2 的运行状况,能够在 Hugging Face Spaces 上试用其演示。

致谢

非常感谢 Salesforce 钻研团队在 BLIP-2 上的工作,感激 Niels Rogge 将 BLIP-2 增加到 🤗 Transformers,感激 Omar Sanseviero 审阅这篇文章。


英文原文: https://hf.co/blog/blip-2

作者: Maria Khalusova、JunnanLi

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。

审校、排版: zhongdongy (阿东)

正文完
 0