社区计算机视觉课程文档

多模态任务和模型

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)方法,该方法利用嘈杂的网络数据和字幕生成来实现各种视觉语言任务的最新性能。您可以在 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 提示即可超越以前的 SOTA 图表 QA。您可以在 Hugging Face 中使用 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:它是一个视觉和语言转换器(ViLT)模型,利用不包含卷积或区域监督的 Transformer 架构,在 VQAv2 数据集上微调,用于回答有关图像的自然语言问题。基础 ViLT 模型拥有大型架构(B32 尺寸)并利用图像和文本联合训练,使其能够有效地用于各种视觉语言任务,特别是 VQA,并取得了具有竞争力的性能。您可以在 Hugging Face 中使用 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])

了解有关如何在 Hugging Face 的 transformers 库中训练和使用 VQA 模型的更多信息 此处

文档视觉问答 (DocVQA)

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

  • 输入

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

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

现在,让我们看看 Hugging Face 中一些流行的 DocVQA 模型

  • LayoutLM:它是一个预训练的神经网络,通过同时分析文本及其布局来理解文档图像。与传统的 NLP 模型不同,它考虑了诸如字体大小、位置和接近度等因素,以学习单词与其在文档上下文中的含义之间的关系。这使得它能够胜任表单理解、收据分析和文档分类等任务,使其成为从扫描文档中提取信息的强大工具。您可以在 Hugging Face 中使用 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,是一种最先进的图像处理模型,它绕过了传统的 Optical Character Recognition (OCR),并直接分析文档图像以理解其内容。它将视觉编码器(Swin Transformer)与文本解码器(BART)结合起来以提取信息并生成文本描述,在文档分类、表单理解和视觉问答等任务中表现出色。其独特的优势在于其“端到端”的特性,避免了由单独的 OCR 步骤引入的潜在错误,并在高效处理的同时实现了令人印象深刻的准确性。您可以在 Hugging Face 中使用 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:它是一个视觉转换器模型,在数百万篇学术论文上进行训练,可以直接“阅读”扫描的 PDF 并将其内容输出为结构化标记语言,甚至可以理解复杂的元素,如数学公式和表格。它绕过了传统的 Optical Character Recognition,在保持语义的同时实现了高精度,使存储在 PDF 中的科学知识更容易获取和使用。Nougat 使用与 Donut 相同的架构,即图像 Transformer 编码器和自回归文本 Transformer 解码器,将科学 PDF 转换为 markdown,从而更容易访问它们。您可以在 Hugging Face 中使用 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))

了解有关如何在 Hugging Face 的 transformers 库中训练和使用 DocVQA 模型的更多信息 此处

图像字幕

Image Captioning 图像字幕模型的输入(图像)和输出(文本)示例。 [1]

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

现在,让我们看看 Hugging Face 中一些流行的图像字幕模型

  • ViT-GPT2:它是一个用于生成图像字幕的 PyTorch 模型,通过将视觉转换器 (ViT) 用于视觉特征提取和 GPT-2 用于文本生成来构建。在 COCO 数据集上进行训练,它利用 ViT 编码丰富图像细节的能力和 GPT-2 在语言生成方面的流畅性来创建准确且描述性的字幕。这个开源模型为图像理解和字幕任务提供了一种有效的解决方案。您可以在 Hugging Face 中使用 **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 主干构建,擅长从图像中生成准确和详细的字幕。您可以在 Hugging Face 中使用 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-basemicrosoft/git-base 是 GIT(GenerativeImage2Text)模型的基本大小版本,GIT 是一个训练用于生成图像文本描述的 Transformer 解码器。它将图像标记和文本标记作为输入,根据图像和之前的文本预测下一个文本标记。这使其适用于图像和视频字幕等任务。针对特定数据集存在微调版本,例如 microsoft/git-base-cocomicrosoft/git-base-textcaps,而基本模型则为进一步定制提供了起点。您可以在 Hugging Face 中使用 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)

了解有关如何在 Hugging Face 的 transformers 库中训练和使用图像字幕模型的更多信息 此处

图像文本检索

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

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

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

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

了解有关如何在 Hugging Face 中使用 CLIP 进行图像文本检索的更多信息 此处

视觉定位

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

  • 输入

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

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

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

  • OWL-ViT:OWL-ViT(用于开放世界定位的视觉转换器)是一个强大的目标检测模型,它建立在标准的视觉转换器架构之上,并在大型图像-文本对上进行训练。它擅长“开放词汇”检测,这意味着它可以根据文本描述识别其训练数据中不存在的对象。通过利用对比预训练和微调,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) 所示。

  • 稳定扩散模型:稳定扩散模型使用“潜在扩散”技术,它通过逐步去噪来从噪声中构建图像,并由文本提示和冻结的 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 上更新