英文

模型卡: FLAVA

模型细节

FLAVA模型是由FAIR的研究人员开发的,旨在了解单一模型能否以统一的架构跨越不同的模态。该模型仅使用公开可得的多模态数据集进行预训练,总共包含7000万个图像-文本对,因此可以完全复现。模型使用了单模态数据集ImageNet和BookCorpus + CCNews为模型提供了单模态数据。该模型可以用于任意图像分类任务的零样本方式、用于零样本图像或文本检索,也可以进行自然语言理解(NLU)任务(如GLUE)和视觉与语言推理任务(如VQA v2)的微调。模型可以使用作为图像、文本语料库和图像-文本对可用的数据。在原始论文中,作者在计算机视觉、NLU和视觉与语言领域的32个任务上评估了FLAVA模型,并证明了其在各个任务上的出色性能,得分比CLIP更高,同时也是公开的。

模型日期

模型最初发布于2021年11月。

模型类型

FLAVA模型使用ViT-B/32 transformer作为图像编码器和文本编码器。FLAVA还使用了一个6层的多模态编码器,用于视觉与语言任务(VQA)等多模态任务。可以从facebook/flava-full检查点中分别加载FLAVA模型的每个组件。如果需要完整的用于预训练的头部,请使用FlavaForPreTraining模型类,否则FlavaModel应该足够满足大多数用途。该 repository 还包含从头开始预训练FLAVA模型的代码。

文档

使用Transformers

FlavaModel

FLAVA模型支持图像、语言和多模态输入。您可以传入与您关注的领域相对应的输入,以获得与该领域相关的损失和输出。

from PIL import Image
import requests

from transformers import FlavaProcessor, FlavaModel

model = FlavaModel.from_pretrained("facebook/flava-full")
processor = FlavaProcessor.from_pretrained("facebook/flava-full")

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, image], return_tensors="pt", padding="max_length", max_length=77
)

outputs = model(**inputs)
image_embeddings = outputs.image_embeddings # Batch size X (Number of image patches + 1) x Hidden size => 2 X 197 X 768
text_embeddings = outputs.text_embeddings # Batch size X (Text sequence length + 1) X Hidden size => 2 X 77 X 768
multimodal_embeddings = outputs.multimodal_embeddings # Batch size X (Number of image patches + Text Sequence Length + 3) X Hidden size => 2 X 275 x 768
# Multimodal embeddings can be used for multimodal tasks such as VQA


## Pass only image
from transformers import FlavaFeatureExtractor

feature_extractor = FlavaFeatureExtractor.from_pretrained("facebook/flava-full")
inputs = feature_extractor(images=[image, image], return_tensors="pt")
outputs = model(**inputs)
image_embeddings = outputs.image_embeddings

## Pass only image
from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("facebook/flava-full")
inputs = tokenizer(["a photo of a cat", "a photo of a dog"], return_tensors="pt", padding="max_length", max_length=77)
outputs = model(**inputs)
text_embeddings = outputs.text_embeddings
编码图像
from PIL import Image
import requests

from transformers import FlavaFeatureExtractor, FlavaModel

model = FlavaModel.from_pretrained("facebook/flava-full")
feature_extractor = FlavaFeatureExtractor.from_pretrained("facebook/flava-full")

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

inputs = feature_extractor(images=[image], return_tensors="pt")

image_embedding = model.get_image_features(**inputs)
编码文本
from PIL import Image

from transformers import BertTokenizer, FlavaModel

model = FlavaModel.from_pretrained("facebook/flava-full")
tokenizer = BertTokenizer.from_pretrained("facebook/flava-full")

inputs = tokenizer(text=["a photo of a dog"], return_tensors="pt", padding="max_length", max_length=77)

text_embedding = model.get_text_features(**inputs)

FlavaForPreTraining

FLAVA模型支持图像、语言和多模态输入。您可以传入相应的输入到模态,以获得与该领域相关的损失和输出。

from PIL import Image
import requests

from transformers import FlavaProcessor, FlavaForPreTraining

model = FlavaForPreTraining.from_pretrained("facebook/flava-full")
processor = FlavaProcessor.from_pretrained("facebook/flava-full")

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, image], 
  return_tensors="pt", 
  padding="max_length", 
  max_length=77,
  return_codebook_pixels=True,
  return_image_mask=True,
  # Other things such as mlm_labels, itm_labels can be passed here. See docs
)
inputs.bool_masked_pos.zero_()

outputs = model(**inputs)
image_embeddings = outputs.image_embeddings # Batch size X (Number of image patches + 1) x Hidden size => 2 X 197 X 768
text_embeddings = outputs.text_embeddings # Batch size X (Text sequence length + 1) X Hidden size => 2 X 77 X 768
# Multimodal embeddings can be used for multimodal tasks such as VQA
multimodal_embeddings = outputs.multimodal_embeddings # Batch size X (Number of image patches + Text Sequence Length + 3) X Hidden size => 2 X 275 x 768

# Loss
loss = output.loss # probably NaN due to missing labels

# Global contrastive loss logits
image_contrastive_logits = outputs.contrastive_logits_per_image
text_contrastive_logits = outputs.contrastive_logits_per_text

# ITM logits
itm_logits = outputs.itm_logits

FlavaImageModel

from PIL import Image
import requests

from transformers import FlavaFeatureExtractor, FlavaImageModel

model = FlavaImageModel.from_pretrained("facebook/flava-full")
feature_extractor = FlavaFeatureExtractor.from_pretrained("facebook/flava-full")

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

inputs = feature_extractor(images=[image], return_tensors="pt")

outputs = model(**inputs)
image_embeddings = outputs.last_hidden_state

FlavaTextModel

from PIL import Image

from transformers import BertTokenizer, FlavaTextModel

model = FlavaTextModel.from_pretrained("facebook/flava-full")
tokenizer = BertTokenizer.from_pretrained("facebook/flava-full")

inputs = tokenizer(text=["a photo of a dog"], return_tensors="pt", padding="max_length", max_length=77)

outputs = model(**inputs)
text_embeddings = outputs.last_hidden_state

模型用途

预期用途

该模型旨在成为研究社区的可复现研究工具,因为一些模型的确切复现细节从未公开,如 CLIP SimVLM 。FLAVA模型在大多数任务上表现与这些模型相当,而训练数据量较少(7000万对相对于CLIP的4亿对和SimVLM的18亿对),但数据是公开的。我们希望该模型能够帮助研究社区更好地理解和探索零样本和任意图像分类、多领域预训练、模态不可知的通用架构,并提供开发的机会。

主要预期用途

这些模型的主要预期用户是AI研究人员。

我们主要想象模型将被研究人员用于更好地理解基础模型跨域(在本例中为视觉、语言和组合的多模态视觉与语言领域)的鲁棒性、泛化性和其他能力、偏差和约束。

不适用的用例

类似于CLIP,目前不适用于模型的任何部署用例-无论是商业用途还是非商业用途。也不建议在没有对模型进行特定、固定的类别分类的域内测试的情况下,使用像在受限环境中进行图像搜索这样的非部署用例。尽管FLAVA是在不包含大量有害数据的开放和公共数据集上进行训练的,但用户仍应采取适当的安全措施。

不论模型的性能如何,始终不适用于监控和人脸识别等领域的使用情况。这是因为目前在这些任务中使用人工智能可能过早,因缺乏测试规范和确保其公平使用的检查机制。

由于该模型并没有经过故意的其他语言训练或评估,因此其使用应仅限于英语语言用例。

数据

FLAVA在公开可用的7000万个图像和文本对上进行了预训练。这包括来自COCO、Visual Genome、Localized Narratives、RedCaps、YFCC100M的自定义筛选子集、SBUCaptions、Conceptual Captions和Wikipedia Image-Text数据集。这个数据集的较大部分来自互联网,因此可能存在对与互联网连接最紧密的人,如来自发达国家和年轻的男性用户的偏见。

数据宗旨

我们构建这个名为PMD(Public Multimodal Datasets)的数据集的目标有两个:(一)使用公开可用的数据实现视觉-语言基础模型的可复现性,(二)测试FLAVA在各领域间的鲁棒性和泛化性。数据是从已经存在的公开数据集来源中收集的,这些数据已经通过原始数据集筛选人员的筛选,不包含成人和过于暴力的内容。我们将图片的URL公开以便进一步的研究可复现性。

性能和局限性

性能

FLAVA已经在35个不同的计算机视觉、自然语言理解和视觉与语言推理任务上进行了评估。在COCO和Flickr30k检索任务中,我们报告了零样本准确性;在图像任务中,我们报告了线性评估结果;在其他任务中,我们报告了微调后的准确性。通常,在文本理解较重要的任务上,FLAVA的表现要优于CLIP。论文中有更详细的描述,但以下是这35个数据集:

自然语言理解

  • MNLI
  • CoLA
  • MRPC
  • QQP
  • SST-2
  • QNLI
  • RTE
  • STS-B

图像理解

  • ImageNet
  • Food100
  • CIFAR10
  • CIFAR100
  • Cars
  • Aircraft
  • DTD
  • Pets
  • Caltech101
  • Flowers102
  • MNIST
  • STL10
  • EuroSAT
  • GTSRB
  • KITTI
  • PCAM
  • UCF101
  • CLEVR
  • FER 2013
  • SUN397
  • Image SST
  • Country 211

视觉与语言推理

  • VQA v2
  • SNLI-VE
  • Hateful Memes
  • Flickr30K Retrieval
  • COCO Retrieval

局限性

目前,FLAVA还存在许多局限性。在某些任务上,图像分类准确性不如CLIP,而文本准确性不如BERT,这表明可能还有改进的空间。FLAVA在包含现场文本的任务上效果也不好,这是因为大多数公共数据集中缺乏现场文本。此外,类似于CLIP,在评估FLAVA的方法中也存在一个重要的局限性,在图像任务中,我们使用线性探测器评估FLAVA,并有证据表明线性探测器可能低估了模型的性能。

反馈/问题

如果有问题,请发送电子邮件至amanpreet@nyu.edu联系Amanpreet。