BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
为了预训练一个具有理解和生成能力的统一模型,论文提出了多模态混合编码器-解码器(Multimodal mixture of Encoder-Decoder,MED),通过一个“模型”处理多个子任务。
BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models
BLIP2大概由这么几个部分组成,图像(Image)输入了图像编码器(Image Encoder),得到的结果与文本(Text)在Q-Former(BERT初始化)里进行融合,最后送入LLM模型。
为了融合特征,引入了Learned Query。可以看到这些Query通过Cross-Attention与图像的特征交互,通过Self-Attention与文本的特征交互。这样做的好处有两个:
Q-Former和BLIP-2第一阶段视觉语言表征学习目标的模型架构。共同优化了三个目标,这三个目标强制执行查询(一组可学习token),以提取与文本最相关的视觉表示。(右)控制查询文本交互的每个目标的自注意掩码策略。
为什么不让LLM认识Query,而让Query变成LLM认识呢?
(1)LLM模型的训练代价有点大;
(2)从 Prompt Learning 的观点来看,目前多模态的数据量不足以保证LLM训练的更好,反而可能会让其丧失泛化性。如果不能让模型适应任务,那就让任务来适应模型。
由于图像文本检索不涉及语言生成,直接对第一阶段的预训练模型进行微调,不使用LLM。
具体而言,使用与预训练相同的目标(即ITC、ITM和ITG)在COCO上与Q-Former一起微调图像编码器。ITC和ITM损失对于图像文本检索至关重要,因为它们直接学习图像文本相似性。
from PIL import Image
import requests
from transformers import Blip2Processor, Blip2ForConditionalGeneration
import torch
import os
import json
from tqdm import tqdm
device = "cuda" if torch.cuda.is_available() else "cpu"
processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-6.7b-coco")
model = Blip2ForConditionalGeneration.from_pretrained(
"Salesforce/blip2-opt-6.7b-coco", torch_dtype=torch.float16
)
model.to(device)
root_path = "/data_1/ldw_models/BLIP/images"
captions={}
dir_or_files = os.listdir(root_path)
dir_or_files = [x for x in dir_or_files if x not in [".ipynb_checkpoints", ".DS_Store"] and ('.png' in x or '.jpg' in x)]
dir_or_files = sorted(dir_or_files)
for dir_file in tqdm(dir_or_files):
file_name=dir_file.split('.')[0]
dir_file_path = os.path.join(root_path,dir_file)
raw_image = Image.open(dir_file_path)
inputs = processor(images=raw_image, return_tensors="pt").to(device, torch.float16)
generated_ids = model.generate(**inputs)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
captions[file_name]= [generated_text]
json_str = json.dumps(captions, indent=4)
with open('/data_1/ldw_models/BLIP/images/prompts.json', 'w') as f:
lines = json_str.split('\n')
for line in lines:
f.write(line)
f.write('\n')
训练的参数和IC任务一致,主要是Q-Former和ViT。不同的是,Q-Former和LLM都有Question作为文本输入。Q-Former的文本输入,保证了Query提取到的特征更加的精炼。
使用BLIP-2模型w/ViT-g和FlanT5XXL的指示零样本图像到文本生成的精选示例,其中显示了广泛的功能,包括视觉对话、视觉知识推理、视觉共感推理、故事讲述、个性化图像到文本的生成等。
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("cuda:1") # doctest: +IGNORE_RESULT
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
prompt = "Question: how many cats are there? Answer:"
inputs = processor(images=image, text=prompt, return_tensors="pt").to(device, torch.float16)
inputs['input_ids'] = inputs['input_ids'].to('cuda:1')
inputs['attention_mask'] = inputs['attention_mask'].to('cuda:1')
inputs['pixel_values'] = inputs['pixel_values'].to('cuda:1')
print(inputs)
generated_ids = model.generate(**inputs)
generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
print(generated_text)
# two
InstructBLIP: Towards General-purpose Vision-Language Models with Instruction Tuning
为了确保指令微调数据的多样性,作者收集了来自11种不同任务的26个数据集,并将它们转换为指令调优格式。
instruction不仅会指导LLM生成文本,同时也会指导image encoder提取不同的视觉特征。这样的好处在于对于同一张图片,根据不同的instruction,我们可以得到基于instruction偏好更强的视觉特征,同时对于两个不一样的图片,基于instruction内嵌的通用知识,可以使得模型有更好的知识迁移效果。
模型结构基本与BLIP2一致,Q-Former和LLM的输入多了Instruction。
其他与BLIP2基本一样。