Community 计算机视觉课程文档

多模态任务与模型

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) 任务的大型预训练模型。它使用“自举语言-图像预训练”(BLIP)方法,该方法利用嘈杂的 Web 数据和字幕生成,在各种视觉语言任务上实现了最先进的性能。你可以按如下方式在 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 Doc VQA 模型的输入(图像 + 文本)和输出(文本)示例。[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,并以结构化标记语言输出其内容,甚至可以理解数学方程式和表格等复杂元素。它绕过了传统的光学字符识别,在保持语义的同时实现了高精度,使 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 是一个在干净和嘈杂的 Web 数据上预训练的框架,用于统一的视觉语言理解和生成。它利用自举过程来过滤掉嘈杂的描述,从而在图像描述、图像-文本检索和 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 与 Grounded Pre-Training 结合用于开放集对象检测
< > 在 GitHub 上更新