来自Kakao Brain的新ViT和ALIGN模型

新的ViT和ALIGN模型来自于Kakao Brain

韩国的Kakao Brain和美国的Hugging Face兴奋地发布了一个新的开源图像-文本数据集COYO,包含7亿个图像-文本对,以及两个基于该数据集训练的新的视觉语言模型ViT和ALIGN。这是ALIGN模型首次以免费和开源的方式发布,并且是ViT和ALIGN模型的首次发布,这些模型附带了训练数据集。

Kakao Brain的ViT和ALIGN模型采用与原版Google模型相同的体系结构和超参数,但是它们是在开源的COYO数据集上进行训练的。Google的ViT和ALIGN模型虽然在大型数据集上进行了训练(ViT训练了3亿张图像,ALIGN训练了18亿个图像-文本对),但由于这些数据集不是公开的,因此无法复制。这个贡献对于那些希望使用数据来复现视觉语言建模的研究人员尤其有价值。关于Kakao ViT和ALIGN模型的更多详细信息可以在这里找到。

这篇博客将介绍新的COYO数据集、Kakao Brain的ViT和ALIGN模型以及如何使用它们!以下是主要要点:

  • 史上第一个开源的ALIGN模型!
  • 首个基于开源数据集COYO训练的开放式ViT和ALIGN模型
  • Kakao Brain的ViT和ALIGN模型与Google版本的性能相当
  • ViT和ALIGN演示可在HF上使用!您可以在线使用自己选择的图像样本来进行ViT和ALIGN的演示!

性能比较

Kakao Brain发布的ViT和ALIGN模型的性能与Google报告的实现相当,有时甚至更好。Kakao Brain的ALIGN-B7-Base模型在图像KNN分类任务上与Google的ALIGN-B7-Base模型的性能相当,在MS-COCO检索图像到文本和文本到图像的任务上表现更好。Kakao Brain的ViT-L/16在ImageNet和ImageNet-ReaL的384和512模型分辨率下的表现与Google的ViT-L/16相似。这意味着社区可以使用Kakao Brain的ViT和ALIGN模型来复制Google的ViT和ALIGN模型,特别是当用户需要访问训练数据时。我们对这些与最先进技术性能相当的模型的开源和透明发布感到兴奋!

COYO数据集

这些模型发布的特殊之处在于它们是在免费可访问的COYO数据集上进行训练的。COYO是一个包含7亿个图像-文本对的图像-文本数据集,类似于Google的ALIGN 1.8B图像-文本数据集,后者是从网页中收集的“噪声”alt文本和图像对的集合,但是COYO是开源的。COYO-700MALIGN 1.8B都是“噪声”数据集,因为只应用了最少的过滤。COYO类似于另一个开源的图像-文本数据集LAION,但有以下区别。尽管LAION 2B是一个包含20亿个英语对的更大数据集,而COYO只有7亿对,但COYO的图像-文本对提供了更多元数据,使用户在使用上具有更大的灵活性和更精细的控制。下表显示了它们之间的区别:COYO提供了所有对的美学评分、更稳定的水印评分和人脸计数数据。

ViT和ALIGN的工作原理

那么这些模型是做什么的呢?让我们简要地讨论一下ViT和ALIGN模型的工作原理。

ViT(Vision Transformer)是Google在2020年提出的一种图像模型,它类似于文本Transformer架构。它是一种新的视觉处理方法,不同于自2012年AlexNet以来主导视觉任务的卷积神经网络(CNNs)。与性能相似的CNN相比,ViT的计算效率高出多达四倍,并且与领域无关。ViT的输入是一张图像,它被分解成一个图像块的序列 – 就像文本Transformer的输入是一个文本序列一样,并为每个图像块提供位置嵌入以学习图像结构。ViT的性能在于在性能和计算之间具有出色的平衡。虽然Google的一些ViT模型是开源的,但它们训练的JFT-300 million图像-标签对数据集并没有公开发布。而Kakao Brain则使用了已公开发布的COYO-Labeled-300M进行训练,并且发布的ViT模型在各种任务上的表现与Google的模型类似,其代码、模型和训练数据(COYO-Labeled-300M)完全公开以供再现和开放科学。

ViT工作原理的可视化,来自Google博客

然后,Google在2021年推出了ALIGN——一种基于大规模图像和嘈杂文本嵌入模型,用于各种视觉和跨模态任务,如文本-图像检索。ALIGN具有简单的双编码器架构,通过对比损失函数进行图像和文本对的训练学习。ALIGN的“嘈杂”训练语料库在规模和鲁棒性之间取得了平衡。以前,视觉语言表示学习是在需要进行广泛预处理的带有手动标签的大规模数据集上训练的。ALIGN的语料库使用图像的alt-text数据,即在图像无法加载时出现的文本,作为图像的标题,从而产生了一个不可避免的嘈杂但更大(18亿对)的数据集,使得ALIGN在各种任务上表现出SoTA水平。Kakao Brain的ALIGN是该模型的第一个开源版本,它在COYO数据集上进行了训练,并且表现优于Google的报告结果。

来自Google博客的ALIGN模型

如何使用COYO数据集

我们可以使用🤗 Datasets库的一行代码方便地下载COYO数据集。要预览COYO数据集并了解有关数据筛选过程和包含的元属性的更多信息,请访问Hub上的数据集页面或原始Git存储库。要开始,请安装🤗 Datasets库:pip install datasets并下载它。

>>> from datasets import load_dataset

>>> dataset = load_dataset('kakaobrain/coyo-700m')
>>> dataset

虽然它比LAION数据集要小得多,但COYO数据集仍然非常庞大,拥有7.47亿个图像-文本对,可能无法将整个数据集下载到本地。为了仅下载数据集的子集,我们可以简单地将streaming=True参数传递给load_dataset()方法,以创建一个可迭代的数据集,并根据需要下载数据实例。

>>> from datasets import load_dataset

>>> dataset = load_dataset('kakaobrain/coyo-700m', streaming=True)
>>> print(next(iter(dataset['train'])))
{'id': 2680060225205, 'url': 'https://cdn.shopify.com/s/files/1/0286/3900/2698/products/TVN_Huile-olive-infuse-et-s-227x300_e9a90ffd-b6d2-4118-95a1-29a5c7a05a49_800x.jpg?v=1616684087', 'text': 'Olive oil infused with Tuscany herbs', 'width': 227, 'height': 300, 'image_phash': '9f91e133b1924e4e', 'text_length': 36, 'word_count': 6, 'num_tokens_bert': 6, 'num_tokens_gpt': 9, 'num_faces': 0, 'clip_similarity_vitb32': 0.19921875, 'clip_similarity_vitl14': 0.147216796875, 'nsfw_score_opennsfw2': 0.0058441162109375, 'nsfw_score_gantman': 0.018961310386657715, 'watermark_score': 0.11015450954437256, 'aesthetic_score_laion_v2': 4.871710777282715}

如何使用Hub上的ViT和ALIGN

让我们来尝试一下新的ViT和ALIGN模型。由于ALIGN是最新添加到🤗 Transformers中的,我们将安装库的最新版本:pip install -q git+https://github.com/huggingface/transformers.git并导入我们将使用的模块和库以进行图像分类的ViT实验。请注意,新添加的ALIGN模型将成为下一个库版本中的一部分。

import requests
from PIL import Image
import torch
from transformers import ViTImageProcessor, ViTForImageClassification

接下来,我们将从COCO数据集中下载一张随机的两只猫和遥控器在沙发上的图片,并对图片进行预处理,将其转换为模型所期望的输入格式。为了做到这一点,我们可以方便地使用对应的预处理类(ViTProcessor)。为了初始化模型和预处理器,我们将使用Kakao Brain ViT hub上的一个仓库。请注意,从仓库初始化预处理器可以确保预处理后的图片符合特定预训练模型所要求的格式。

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

processor = ViTImageProcessor.from_pretrained('kakaobrain/vit-large-patch16-384')
model = ViTForImageClassification.from_pretrained('kakaobrain/vit-large-patch16-384')

剩下的就很简单了,我们将对图片进行预处理,并将其作为输入传递给模型,以获取类别的logits。Kakao Brain ViT图像分类模型是在ImageNet标签上进行训练的,并输出形状为(batch_size, 1000)的logits。

# 对图片或图片列表进行预处理
inputs = processor(images=image, return_tensors="pt")

# 推理
with torch.no_grad():
    outputs = model(**inputs)

# 对logits应用SoftMax,计算每个类别的概率
preds = torch.nn.functional.softmax(outputs.logits, dim=-1)

# 打印前5个类别预测及其概率
top_class_preds = torch.argsort(preds, descending=True)[0, :5]

for c in top_class_preds:
    print(f"{model.config.id2label[c.item()]}的概率为{round(preds[0, c.item()].item(), 4)}")

我们完成了!为了更加简单和简洁,我们还可以使用方便的图像分类流程,并将Kakao Brain ViT仓库名称作为目标模型传递给初始化流程。然后,我们可以传入一个URL或本地路径的图片或Pillow图片,并可选择使用top_k参数返回前k个预测结果。让我们继续获取我们这张猫和遥控器图片的前5个预测。

>>> from transformers import pipeline

>>> classifier = pipeline(task='image-classification', model='kakaobrain/vit-large-patch16-384')
>>> classifier('http://images.cocodataset.org/val2017/000000039769.jpg', top_k=5)
[{'score': 0.8223727941513062, 'label': '遥控器'}, {'score': 0.06580372154712677, 'label': '虎斑猫'}, {'score': 0.0655883178114891, 'label': '虎斑猫'}, {'score': 0.0388941615819931, 'label': '埃及猫'}, {'score': 0.0011215205304324627, 'label': '山猫'}]

如果您想进一步尝试Kakao Brain ViT模型,请访问其在🤗 Hub上的空间。

让我们继续尝试使用ALIGN,它可以用于检索文本或图像的多模态嵌入,或执行零样本图像分类。ALIGN的transformers实现和使用方式与CLIP类似。为了开始,我们首先下载预训练模型及其预处理器,它们可以对图像和文本进行预处理,以便符合ALIGN的视觉和文本编码器的期望格式。再次,让我们导入我们将使用的模块并初始化预处理器和模型。

import requests
from PIL import Image
import torch
from transformers import AlignProcessor, AlignModel


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

processor = AlignProcessor.from_pretrained('kakaobrain/align-base')
model = AlignModel.from_pretrained('kakaobrain/align-base')

我们首先从零样本图像分类开始。为了做到这一点,我们将提供候选标签(自由形式文本),并使用AlignModel来找出哪个描述更好地描述了图像。我们首先预处理图像和文本输入,然后将预处理后的输入馈送给AlignModel。

candidate_labels = ['一张猫的图片', '一张狗的图片']

inputs = processor(images=image, text=candidate_labels, return_tensors='pt')

with torch.no_grad():
    outputs = model(**inputs)

# 这是图像和文本的相似度得分
logits_per_image = outputs.logits_per_image  

# 我们可以使用softmax函数得到标签概率
probs = logits_per_image.softmax(dim=1)  
print(probs)

完成,就这么简单。要进一步尝试Kakao Brain ALIGN模型进行零样本图像分类,只需转到🤗 Hub上的演示页面。请注意,AlignModel的输出包括text_embeds和image_embeds(请参阅ALIGN的文档)。如果我们不需要计算零样本分类的每个图像和每个文本的得分,我们可以使用AlignModel类的便捷方法get_image_features()和get_text_features()来检索视觉和文本嵌入。

text_embeds = model.get_text_features(
    input_ids=inputs['input_ids'],
    attention_mask=inputs['attention_mask'],
    token_type_ids=inputs['token_type_ids'],
)
image_embeds = model.get_image_features(
    pixel_values=inputs['pixel_values'],
)

另外,我们还可以使用ALIGN的独立视觉和文本编码器来获取多模态嵌入。然后,可以使用这些嵌入来训练各种下游任务的模型,例如目标检测、图像分割和图像描述。让我们看看如何使用AlignTextModel和AlignVisionModel来获取这些嵌入。请注意,我们可以使用便捷的AlignProcessor类分别预处理文本和图像。

from transformers import AlignTextModel


processor = AlignProcessor.from_pretrained('kakaobrain/align-base')
model = AlignTextModel.from_pretrained('kakaobrain/align-base')

# 获取两个文本查询的嵌入
inputs = processor(['一张猫的图片', '一张狗的图片'], return_tensors='pt')

with torch.no_grad():
    outputs = model(**inputs)

# 获取最后一个隐藏状态和最终池化输出
last_hidden_state = outputs.last_hidden_state
pooled_output = outputs.pooler_output

我们还可以选择在推理过程中将output_hidden_states和output_attentions参数设置为True,以返回所有隐藏状态和注意力值。

with torch.no_grad():
    outputs = model(**inputs, output_hidden_states=True, output_attentions=True)

# 打印返回的信息
for key, value in outputs.items():
    print(key)

让我们使用AlignVisionModel做同样的事情,并获取一张图像的多模态嵌入。

from transformers import AlignVisionModel


processor = AlignProcessor.from_pretrained('kakaobrain/align-base')
model = AlignVisionModel.from_pretrained('kakaobrain/align-base')

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

inputs = processor(images=image, return_tensors='pt')

with torch.no_grad():
    outputs = model(**inputs)

# 打印最后一个隐藏状态和最终池化输出
last_hidden_state = outputs.last_hidden_state
pooled_output = outputs.pooler_output

与ViT类似,我们可以使用零样本图像分类流水线使我们的工作更加简单。让我们看看如何使用此流水线使用自由形式文本候选标签在野外进行图像分类。

>>> from transformers import pipeline

>>> classifier = pipeline(task='zero-shot-image-classification', model='kakaobrain/align-base')
>>> classifier(
...     'https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png',
...     candidate_labels=['动物', '人类', '风景'],
... )
[{'score': 0.9263709783554077, 'label': '动物'}, {'score': 0.07163811475038528, 'label': '人类'}, {'score': 0.0019908479880541563, 'label': '风景'}]

>>> classifier(
...    'https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png',
...    candidate_labels=['黑白', '写实', '绘画'],
... )
[{'score': 0.9735308885574341, 'label': '黑白'}, {'score': 0.025493400171399117, 'label': '写实'}, {'score': 0.0009757201769389212, 'label': '绘画'}]

结论

近年来,多模态模型取得了令人难以置信的进展,例如CLIP和ALIGN等模型解锁了各种下游任务,如图像字幕生成、零样本图像分类和开放词汇表物体检测。在这篇博文中,我们介绍了最新的开源ViT和ALIGN模型,这些模型由Kakao Brain贡献到了Hub中,还介绍了新的COYO文本-图像数据集。我们还展示了如何使用这些模型通过几行代码来执行各种任务,无论是单独使用还是作为🤗 Transformers流水线的一部分。

就是这样!我们将继续整合最有影响力的计算机视觉和多模态模型,并期待听到您的回音。要了解计算机视觉和多模态研究的最新动态,您可以在Twitter上关注我们:@adirik,@a_e_roberts,@NielsRogge,@RisingSayak和@huggingface。