社区计算机视觉课程文档

多模态任务与模型

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

多模态任务与模型

在本节中,我们将简要介绍涉及图像和文本模态的不同多模态任务及其相应的模型。在深入探讨之前,让我们简要回顾一下“多模态”的含义,这在前面的章节中已经涵盖。人类世界是多样感官输入的交响乐。我们通过视觉、听觉、触觉等感知和理解。这种多模态性将我们丰富的理解与传统单模态AI模型的局限性区分开来。受人类认知的启发,多模态模型旨在通过整合来自多个来源(如文本、图像、音频,甚至传感器数据)的信息来弥合这一差距。这种模态的融合带来了对世界更全面和细致的理解,解锁了广泛的任务和应用。

任务示例

在深入研究特定模型之前,了解涉及图像和文本的各种任务至关重要。这些任务包括但不限于:

  • 视觉问答(VQA)和视觉推理: 想象一台机器,它看着一张图片,并理解你对它的问题。视觉问答(VQA)就是这样!它训练计算机从图像中提取意义并回答问题,例如“谁在开车?”而视觉推理则是秘诀,它使机器能够超越简单的识别,推断关系,比较对象,并理解场景上下文以给出准确的答案。这就像请一位侦探来解读图片中的线索,只是更快更好!

  • 文档视觉问答(DocVQA): 想象一台计算机能够理解文档(如地图或合同)的文本和布局,然后直接从图像中回答相关问题。这就是文档视觉问答(DocVQA)的精髓。它结合了计算机视觉处理图像元素和自然语言处理解释文本,使机器能够像人类一样“阅读”并回答文档相关问题。可以将其视为通过AI增强文档搜索能力,从而解锁图像中所有被困的信息。

  • 图像描述生成: 图像描述生成弥合了视觉和语言之间的鸿沟。它像侦探一样分析图像,提取细节,理解场景,然后撰写一两句话来讲述故事——平静海面上的日落,荡秋千时欢笑的孩子,甚至是熙熙攘攘的城市街道。这是计算机视觉和语言的迷人结合,让计算机一次一张图片地描述周围的世界。

  • 图像-文本检索: 图像-文本检索就像是图像和其描述的“红娘”。把它想象成在图书馆里搜索一本特定的书,但你可以使用封面上的图片或简短的摘要来找到它,而不是浏览书名。它就像一个超级强大的搜索引擎,既能理解图片又能理解文字,为图像搜索、自动生成字幕,甚至帮助视障人士通过文本描述“看”世界等激动人心的应用打开了大门。

  • 视觉定位: 视觉定位就像连接我们所见和所说的点。它旨在理解语言如何引用图像的特定部分,从而使AI模型能够根据自然语言描述精确定位物体或区域。想象一下,你问“水果碗里的红苹果在哪里?”,AI会立即在图片中高亮显示它——这就是视觉定位的作用!

  • 文本到图像生成: 想象一支神奇的画笔,它能解读你的文字并使其栩栩如生!文本到图像生成就是这样;它将你的书面描述转化为独特的图像。它是语言理解和图像创作的融合,你的文字开启了一个视觉世界,从逼真的风景到梦幻般的抽象,所有这些都源于你文字的力量。

视觉问答(VQA)与视觉推理

VQA VQA和视觉推理模型的输入(图像+文本)和输出(文本)示例 [1]

视觉问答(VQA)

  • 输入: 图像-问题对(图像和关于它的问题)。
  • 输出: 在多项选择设置中:与预定义选项中的正确答案相对应的标签。在开放式设置中:基于图像和问题的自由格式自然语言答案。
  • 任务: 回答有关图像的问题。(大多数VQA模型将其视为具有预定义答案的分类问题)。请参阅上述示例以供参考。

视觉推理

  • 输入: 根据具体的视觉推理任务而异
    • VQA风格任务:图像-问题对。
    • 匹配任务:图像和文本语句。
    • 蕴含任务:图像和文本对(可能包含多个语句)。
    • 子问题任务:图像和主要问题,以及额外的感知相关子问题。
  • 输出: 依任务而异
    • VQA:回答关于图像的问题。
    • 匹配:文本是否与图像真实匹配,回答真/假。
    • 蕴含:预测图像是否语义蕴含文本。
    • 子问题:回答与感知相关的子问题。
  • 任务: 对图像执行各种推理任务。请参阅上述示例以供参考。

通常,VQA和视觉推理都被视为视觉问答(VQA)任务。一些流行的VQA模型有:

  • BLIP-VQA:Salesforce AI开发的用于视觉问答(VQA)任务的大型预训练模型。它采用“Bootstrapping Language-Image Pre-training”(BLIP)方法,利用嘈杂的网络数据和字幕生成,在各种视觉语言任务上取得了最先进的性能。你可以在huggingface中按如下方式使用BLIP:
from PIL import Image
from transformers import pipeline

vqa_pipeline = pipeline(
    "visual-question-answering", model="Salesforce/blip-vqa-capfilt-large"
)

image = Image.open("elephant.jpeg")
question = "Is there an elephant?"

vqa_pipeline(image, question, top_k=1)
  • Deplot:它是一种单次视觉语言推理模型,训练用于将图表和图形翻译成文本摘要。这使其能够与LLM集成,用于回答关于数据的复杂问题,甚至包括新颖的人工编写的查询。DePlot通过标准化图表到表格的翻译任务并利用Pix2Struct架构实现这一点,仅通过一个示例和LLM提示就在图表QA上超越了先前的SOTA。您可以在huggingface中按如下方式使用Deplot:
from transformers import Pix2StructProcessor, Pix2StructForConditionalGeneration
import requests
from PIL import Image

processor = Pix2StructProcessor.from_pretrained("google/deplot")
model = Pix2StructForConditionalGeneration.from_pretrained("google/deplot")

url = "https://raw.githubusercontent.com/vis-nlp/ChartQA/main/ChartQA%20Dataset/val/png/5090.png"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(
    images=image,
    text="Generate underlying data table of the figure below:",
    return_tensors="pt",
)
predictions = model.generate(**inputs, max_new_tokens=512)
print(processor.decode(predictions[0], skip_special_tokens=True))
  • VLIT:它是一个视觉与语言Transformer(ViLT)模型,利用Transformer架构,不含卷积或区域监督,在VQAv2数据集上进行微调,用于回答关于图像的自然语言问题。基础ViLT模型拥有大型架构(B32大小),并利用图像和文本的联合训练,使其在各种视觉语言任务,特别是VQA方面表现出色,达到了有竞争力的性能。您可以在HuggingFace中按如下方式使用VLIT:
from transformers import ViltProcessor, ViltForQuestionAnswering
import requests
from PIL import Image

# prepare image + question
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text = "How many cats are there?"

processor = ViltProcessor.from_pretrained("dandelin/vilt-b32-finetuned-vqa")
model = ViltForQuestionAnswering.from_pretrained("dandelin/vilt-b32-finetuned-vqa")

# prepare inputs
encoding = processor(image, text, return_tensors="pt")

# forward pass
outputs = model(**encoding)
logits = outputs.logits
idx = logits.argmax(-1).item()
print("Predicted answer:", model.config.id2label[idx])

了解更多关于如何在HuggingFace transformers 库中训练和使用VQA模型,请点击此处

文档视觉问答(DocVQA)

DocVQA DocVQA模型的输入(图像+文本)和输出(文本)示例。 [2]

  • 输入

    • 文档图像:文档的扫描或数字图像,包含文本、布局和视觉元素。
    • 关于文档的问题:以文本形式提出的自然语言问题。
  • 任务

    • 分析和理解:DocVQA模型必须处理文档中的视觉和文本信息,以充分理解其内容。
    • 推理和推断:模型需要建立视觉元素、文本和问题之间的关系,以得出相关结论。
    • 生成自然语言答案:模型必须以自然语言文本格式生成清晰、简洁、准确的问题答案。请参阅上述示例以供参考。
  • 输出: 问题答案:直接回答查询并准确反映文档中信息的文本回复。

现在,让我们来看看HuggingFace中一些流行的DocVQA模型。

  • LayoutLM: 它是一个预训练的神经网络,通过联合分析文本及其布局来理解文档图像。与传统的NLP模型不同,它考虑字体大小、位置和邻近度等因素,以学习单词与其在文档上下文中的含义之间的关系。这使其在表单理解、收据分析和文档分类等任务中表现出色,成为从扫描文档中提取信息的强大工具。您可以在HuggingFace中按如下方式使用LayoutLM:
from transformers import pipeline
from PIL import Image

pipe = pipeline("document-question-answering", model="impira/layoutlm-document-qa")

question = "What is the purchase amount?"
image = Image.open("your-document.png")

pipe(image=image, question=question)

## [{'answer': '20,000$'}]
  • Donut: 又称无OCR文档理解Transformer,是一种最先进的图像处理模型,它绕过了传统的光学字符识别(OCR),直接分析文档图像以理解其内容。它结合了视觉编码器(Swin Transformer)和文本解码器(BART)来提取信息并生成文本描述,在文档分类、表单理解和视觉问答等任务中表现出色。其独特的优势在于其“端到端”的性质,避免了单独OCR步骤可能引入的潜在错误,并通过高效处理实现了令人印象深刻的准确性。您可以在HuggingFace中按如下方式使用Donut模型:
from transformers import pipeline
from PIL import Image

pipe = pipeline(
    "document-question-answering", model="naver-clova-ix/donut-base-finetuned-docvqa"
)

question = "What is the purchase amount?"
image = Image.open("your-document.png")

pipe(image=image, question=question)

## [{'answer': '20,000$'}]
  • Nougat: 它是一个视觉Transformer模型,通过数百万篇学术论文的训练,可以直接“阅读”扫描的PDF文件,并以结构化标记语言输出其内容,甚至能理解数学方程和表格等复杂元素。它绕过了传统的光学字符识别(OCR),在保持语义的同时实现了高精度,使得存储在PDF中的科学知识更易于访问和使用。Nougat采用与Donut相同的架构,即一个图像Transformer编码器和一个自回归文本Transformer解码器,用于将科学PDF转换为Markdown,从而更方便地访问它们。您可以在HuggingFace中按如下方式使用Nougat模型:
from huggingface_hub import hf_hub_download
import re
from PIL import Image

from transformers import NougatProcessor, VisionEncoderDecoderModel
from datasets import load_dataset
import torch

processor = NougatProcessor.from_pretrained("facebook/nougat-base")
model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-base")

device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
# prepare PDF image for the model
filepath = hf_hub_download(
    repo_id="hf-internal-testing/fixtures_docvqa",
    filename="nougat_paper.png",
    repo_type="dataset",
)
image = Image.open(filepath)
pixel_values = processor(image, return_tensors="pt").pixel_values

# generate transcription (here we only generate 30 tokens)
outputs = model.generate(
    pixel_values.to(device),
    min_length=1,
    max_new_tokens=30,
    bad_words_ids=[[processor.tokenizer.unk_token_id]],
)

sequence = processor.batch_decode(outputs, skip_special_tokens=True)[0]
sequence = processor.post_process_generation(sequence, fix_markdown=False)
# note: we're using repr here such for the sake of printing the \n characters, feel free to just print the sequence
print(repr(sequence))

了解更多关于如何在HuggingFace transformers 库中训练和使用DocVQA模型,请点击此处

图像描述生成

Image Captioning 图像描述生成模型的输入(图像)和输出(文本)示例。 [1]

  • 输入
    • 图像:各种格式的图像(例如,JPEG,PNG)。
    • 预训练图像特征提取器(可选):一个预训练的神经网络,可以从图像中提取有意义的特征,例如卷积神经网络(CNN)。
  • 输出: 文本描述:准确描述输入图像内容的单句或段落,捕捉物体、动作、关系和整体上下文。请参阅上述示例以供参考。
  • 任务: 自动生成图像的自然语言描述。这包括:(1) 理解图像的视觉内容(物体、动作、关系)。(2) 将这些信息编码成有意义的表示。(3) 将此表示解码成连贯、语法正确且信息丰富的句子或短语。

现在,让我们来看看HuggingFace中一些流行的图像描述生成模型。

  • ViT-GPT2: 它是一个用于生成图像描述的PyTorch模型,通过结合视觉Transformer(ViT)进行视觉特征提取和GPT-2进行文本生成构建而成。在COCO数据集上进行训练,它利用ViT编码丰富图像细节的能力和GPT-2的语言流畅性来创建准确和描述性的描述。这个开源模型为图像理解和描述生成任务提供了有效的解决方案。您可以在HuggingFace中按如下方式使用ViT-GPT2
from transformers import pipeline

image_to_text = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning")

image_to_text("https://ankur3107.github.io/assets/images/image-captioning-example.png")

# [{'generated_text': 'a soccer game with a player jumping to catch the ball '}]
  • BLIP-Image-Captioning: 这是一个基于BLIP的最新图像描述生成模型,BLIP是一个预训练于干净和嘈杂网络数据上的框架,用于统一视觉语言理解和生成。它利用自举过程过滤嘈杂的描述,在图像描述生成、图像-文本检索和VQA等任务上取得了改进的性能。这个大型版本,以ViT-L为主干,擅长从图像生成准确详细的描述。您可以在HuggingFace中按如下方式使用BLIP图像描述生成模型:
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large")
model = BlipForConditionalGeneration.from_pretrained(
    "Salesforce/blip-image-captioning-large"
)

img_url = "https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")

# conditional image captioning
text = "a photography of"
inputs = processor(raw_image, text, return_tensors="pt")

out = model.generate(**inputs)
print(processor.decode(out[0], skip_special_tokens=True))

# unconditional image captioning
inputs = processor(raw_image, return_tensors="pt")

out = model.generate(**inputs)
print(processor.decode(out[0], skip_special_tokens=True))
  • git-base: microsoft/git-base 是 GIT(GenerativeImage2Text)模型的基本大小版本,GIT是一个Transformer解码器,用于生成图像的文本描述。它同时接收图像标记和文本标记作为输入,并根据图像和之前的文本预测下一个文本标记。这使得它适用于图像和视频描述生成等任务。存在针对特定数据集的微调版本,例如 microsoft/git-base-cocomicrosoft/git-base-textcaps,而基础模型则为进一步自定义提供了起点。您可以在HuggingFace中按如下方式使用git-base模型:
from transformers import AutoProcessor, AutoModelForCausalLM
import requests
from PIL import Image

processor = AutoProcessor.from_pretrained("microsoft/git-base-coco")
model = AutoModelForCausalLM.from_pretrained("microsoft/git-base-coco")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

pixel_values = processor(images=image, return_tensors="pt").pixel_values

generated_ids = model.generate(pixel_values=pixel_values, max_length=50)
generated_caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(generated_caption)

了解更多关于如何在HuggingFace transformers 库中训练和使用图像描述生成模型,请点击此处

图像-文本检索

Image-Text Retrieval 文本到图像检索的输入(文本查询)和输出(图像)示例。 [1]

  • 输入
    • 图像:各种格式的图像(例如,JPEG,PNG)。
    • 文本:自然语言文本,通常以与图像相关的标题、描述或关键词的形式。
  • 输出
    • 相关图像:当给定文本查询时,系统返回与文本最相关的图像的排名列表。
    • 相关文本:当给定图像查询时,系统返回最能描述图像的文本描述或标题的排名列表。
  • 任务
    • 图像到文本检索:给定图像作为输入,检索准确描述其内容的文本描述或标题。
    • 文本到图像检索:给定文本查询,检索与文本中提到的概念和实体在视觉上匹配的图像。

图像-文本检索最流行的模型之一是CLIP。

  • CLIP(对比语言-图像预训练): 它通过利用共享嵌入空间在图像-文本检索方面表现出色。通过对比学习,它在大规模图像和文本数据集上进行预训练,使模型能够将不同的概念映射到共同的空间。CLIP在预训练期间利用对比学习方法,学习将图像和文本映射到共享的嵌入空间。这个共享空间使得两种模态之间可以直接比较,从而实现高效准确的检索任务。在图像-文本检索中,可以通过将图像和文本编码到共享嵌入空间来应用CLIP,图像与文本查询之间的相似性通过它们各自嵌入的接近程度来衡量。该模型的多功能性源于其在没有任务特定微调的情况下理解语义关系的能力,使其在从基于内容的图像检索到解释图像的自然语言查询等应用中高效。您可以在HuggingFace中按如下方式使用CLIP进行图像-文本检索:
from PIL import Image
import requests

from transformers import CLIPProcessor, CLIPModel

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(
    text=["a photo of a cat", "a photo of a dog"],
    images=image,
    return_tensors="pt",
    padding=True,
)

outputs = model(**inputs)
logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
probs = logits_per_image.softmax(
    dim=1
)  # we can take the softmax to get the label probabilities

了解更多关于如何在HuggingFace中将CLIP用于图像-文本检索的信息,请点击此处

视觉定位

Visual Grounding 输入(图像+文本)和输出(边界框)示例。(a) 短语定位 (b) 表达式理解。 [1]

  • 输入

    • 图像:场景或物体的视觉表示。
    • 自然语言查询:指代图像特定部分的文本描述或问题。
  • 输出: 边界框或分割掩码:图像中与查询中描述的对象或区域对应的空间区域。这通常表示为坐标或突出显示的区域。

  • 任务: 定位相关对象或区域:模型必须正确识别图像中与查询匹配的部分。这包括理解图像的视觉内容和查询的语言含义。

现在,让我们看看HuggingFace中一些流行的视觉定位(目标检测)模型。

  • OWL-ViT: OWL-ViT(用于开放世界定位的视觉Transformer)是一个功能强大的目标检测模型,建立在标准视觉Transformer架构之上,并经过大规模图像-文本对的训练。它擅长“开放词汇”检测,这意味着它可以根据文本描述识别训练数据中不存在的对象。通过利用对比预训练和微调,OWL-ViT在零样本(文本引导)和单样本(图像引导)检测任务中都取得了令人印象深刻的性能,使其成为灵活搜索和图像识别的多功能工具。您可以在HuggingFace中按如下方式使用OWL-ViT:
import requests
from PIL import Image
import torch

from transformers import OwlViTProcessor, OwlViTForObjectDetection

processor = OwlViTProcessor.from_pretrained("google/owlvit-base-patch32")
model = OwlViTForObjectDetection.from_pretrained("google/owlvit-base-patch32")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
texts = [["a photo of a cat", "a photo of a dog"]]
inputs = processor(text=texts, images=image, return_tensors="pt")
outputs = model(**inputs)

# Target image sizes (height, width) to rescale box predictions [batch_size, 2]
target_sizes = torch.Tensor([image.size[::-1]])
# Convert outputs (bounding boxes and class logits) to COCO API
results = processor.post_process_object_detection(
    outputs=outputs, threshold=0.1, target_sizes=target_sizes
)

i = 0  # Retrieve predictions for the first image for the corresponding text queries
text = texts[i]
boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]

# Print detected objects and rescaled box coordinates
for box, score, label in zip(boxes, scores, labels):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detected {text[label]} with confidence {round(score.item(), 3)} at location {box}"
    )
  • Grounding DINO[3] 它将基于Transformer的目标检测器(DINO)与“接地预训练”相结合,创建了一个最先进的零样本目标检测模型。这意味着它能够识别即使不在其训练数据中的对象,这得益于其理解图像和人类语言输入(如类别名称或描述)的能力。其架构结合了文本和图像骨干、特征增强器、语言引导查询选择和跨模态解码器,在COCO和LVIS等基准测试中取得了令人印象深刻的结果。本质上,Grounding DINO接收视觉信息,将其与文本描述关联,然后利用这种理解来精确定位对象,即使是全新的类别。您可以在Google Colab中试用Grounding DINO模型,点击此处

文本到图像生成

Text-Image Generation 文本图像生成的自回归模型和扩散模型示意图。[1]

  • 自回归模型: 这些模型将任务视为将文本描述翻译成图像标记序列,类似于语言模型生成句子。就像拼图块一样,这些由图像标记器(如VQ-VAE)创建的标记代表基本的图像特征。模型使用编码器-解码器架构:编码器从文本提示中提取信息,解码器则在此信息的引导下,一次预测一个图像标记,逐步构建最终图像的像素。这种方法可以实现高度的控制和细节,但在处理长而复杂的提示时面临挑战,并且可能比扩散模型等替代方法慢。生成过程如上图 (a) 所示。

  • Stable Diffusion 模型: Stable Diffusion 模型采用“潜在扩散”技术,通过在文本提示和冻结的 CLIP 文本编码器指导下,逐步去噪,从噪声中构建图像。其轻量级架构(带有 UNet 主干和 CLIP 编码器)支持 GPU 驱动的图像生成,而其对潜在空间的关注则减少了内存消耗。这种独特的设置赋予了多样的艺术表达能力,将文本输入转化为逼真且富有想象力的视觉效果。生成过程如上图 (b) 所示。

现在,让我们看看如何在HuggingFace中使用文本-图像生成模型。

安装 diffusers

pip install diffusers --upgrade

此外,请务必安装transformers、safetensors、accelerate以及隐形水印

pip install invisible_watermark transformers accelerate safetensors

要仅使用基础模型,可以运行

from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
)
pipe.to("cuda")

prompt = "An astronaut riding a unicorn"

images = pipe(prompt=prompt).images[0]

要了解更多关于文本图像生成模型的信息,您可以参考HuggingFace的Diffusers课程

现在您已经了解了一些流行的涉及图像和文本模态的任务和模型。但是您可能想知道如何训练或微调上述任务。因此,让我们来了解一下视觉-语言模型的训练。

视觉-语言预训练模型概览

VLP Framework 基于Transformer的视觉-语言模型的通用框架。 [1]

给定图像-文本对,VL模型首先通过文本编码器和视觉编码器分别提取文本特征和视觉特征。然后,文本和视觉特征被输入多模态融合模块以生成跨模态表示,这些表示可选地再输入解码器,最后生成最终输出。上述图中展示了这一通用框架的示意图。在许多情况下,图像/文本骨干、多模态融合模块和解码器之间没有清晰的界限。

恭喜您!您已经坚持到了最后。现在进入下一部分,了解更多关于视觉-语言预训练模型的内容。

参考文献

  1. 视觉-语言预训练:基础、最新进展和未来趋势
  2. 文档集视觉问答
  3. Grounding DINO:将DINO与接地预训练相结合,实现开放集目标检测
< > 在 GitHub 上更新