Hugging Face 计算机视觉的现状 🤗

发布日期:2023 年 1 月 30 日
在 GitHub 上更新

在 Hugging Face,我们为与社区一起实现人工智能民主化而自豪。作为这项使命的一部分,我们在过去一年中开始将精力集中在计算机视觉上。从 在 🤗 Transformers 中引入 Vision Transformers (ViT) 的 PR 开始,现已发展成为一项更大的事业——在 Hugging Face Hub 上拥有 8 项核心视觉任务、3000 多个模型和 100 多个数据集。

自 ViT 加入 Hub 以来,许多激动人心的事情已经发生。在这篇博客文章中,我们将总结所发生的事情以及未来将如何支持 🤗 生态系统中计算机视觉的持续发展。

以下是我们将介绍的内容列表:

赋能社区:一次一个任务 👁

Hugging Face Hub 拥有超过 100,000 个用于不同任务的公共模型,例如下一词预测、掩码填充、标记分类、序列分类等等。截至今天,我们支持 8 项核心视觉任务,提供许多模型检查点:

  • 图像分类
  • 图像分割
  • (零样本)目标检测
  • 视频分类
  • 深度估计
  • 图像到图像合成
  • 无条件图像生成
  • 零样本图像分类

Hub 上每个任务都至少有 10 个模型检查点供您探索。此外,我们还支持视觉与语言交叉领域的 任务,例如:

  • 图像到文本(图像字幕、OCR)
  • 文本到图像
  • 文档问答
  • 视觉问答

这些任务不仅包括最先进的基于 Transformer 的架构,例如 ViTSwinDETR,还包括纯卷积架构,例如 ConvNeXtResNetRegNet 等等!像 ResNet 这样的架构对于无数工业用例仍然非常重要,因此 🤗 Transformers 支持这些非 Transformer 架构。

同样重要的是要注意,Hub 上的模型不仅来自 Transformers 库,还来自其他第三方库。例如,尽管我们在 Hub 上支持无条件图像生成等任务,但 Transformers 中还没有任何模型支持该任务(例如这个)。支持所有机器学习任务,无论它们是通过 Transformers 还是第三方库解决,都是我们促进协作式开源机器学习生态系统使命的一部分。

对 Pipelines 的支持

我们开发了 Pipelines,旨在为实践者提供所需的工具,以便他们轻松地将机器学习融入其工具箱。它们提供了一种简单的方法,可以针对给定输入执行推理。我们在 Pipelines 中支持 七项视觉任务。以下是使用 Pipelines 进行深度估计的示例:

from transformers import pipeline

depth_estimator = pipeline(task="depth-estimation", model="Intel/dpt-large")
output = depth_estimator("http://images.cocodataset.org/val2017/000000039769.jpg")

# This is a tensor with the values being the depth expressed
# in meters for each pixel
output["depth"]

即使是视觉问答等任务,界面也保持不变

from transformers import pipeline

oracle = pipeline(model="dandelin/vilt-b32-finetuned-vqa")
image_url = "https://huggingface.co/datasets/mishig/sample_images/resolve/main/tiger.jpg"

oracle(question="What's the animal doing?", image=image_url, top_k=1)
# [{'score': 0.778620, 'answer': 'laying down'}]

训练您自己的模型

虽然能够直接使用模型进行推理是一个很好的开始,但微调才是社区获得最大收益的地方。当您的数据集是自定义的,并且预训练模型无法提供良好的性能时,这一点尤其正确。

Transformers 为所有与训练相关的内容提供了 Trainer API。目前,Trainer 无缝支持以下任务:图像分类、图像分割、视频分类、目标检测和深度估计。其他视觉任务的模型微调也受支持,但不是通过 Trainer

只要 Transformers 中的模型包含给定任务的损失计算,它就应该符合该任务的微调条件。如果您发现问题,请在 GitHub 上 报告

我在哪里可以找到代码?

Hugging Face 示例脚本包括不同的 自监督预训练策略,如 MAE,以及 对比图像-文本预训练策略,如 CLIP。这些脚本对于研究社区以及希望从头开始在自定义数据语料库上运行预训练的实践者来说是宝贵的资源。

不过,有些任务并非天生适合微调。示例包括零样本图像分类(例如 CLIP)、零样本目标检测(例如 OWL-ViT)和零样本分割(例如 CLIPSeg)。我们将在本文中重新讨论这些模型。

与 Datasets 的集成

Datasets 提供对数千个不同模态数据集的轻松访问。如前所述,Hub 拥有超过 100 个计算机视觉数据集。这里值得注意的一些示例:ImageNet-1kScene ParsingNYU Depth V2COYO-700MLAION-400M。通过将这些数据集放在 Hub 上,只需两行代码即可轻松加载它们:

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

除了这些数据集,我们还提供与 AlbumentationsKornia 等增强库的集成支持。社区可以利用 Datasets 的灵活性和性能以及这些库提供的强大增强转换。此外,我们还为核心视觉任务(图像分类、图像分割、目标检测和深度估计)提供了 专门的数据加载指南

🤗 🤝 timm

timm,也称为 pytorch-image-models,是一个最先进的 PyTorch 图像模型、预训练权重以及用于训练、推理和验证的实用脚本的开源集合。

我们已经在 Hub 上拥有超过 200 个来自 timm 的模型,并且还有更多模型正在开发中。查看文档以了解更多关于此集成的信息。

🧨 Diffusers

Diffusers 提供预训练的视觉和音频扩散模型,并作为推理和训练的模块化工具箱。通过这个库,您可以从自然语言输入中生成合理的图像,以及其他创意用例。以下是一个示例:

from diffusers import DiffusionPipeline

generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
generator.to(“cuda”)

image = generator("An image of a squirrel in Picasso style").images[0]

这种技术可以赋能新一代创意应用,并帮助来自不同背景的艺术家。要了解更多关于 Diffusers 和不同用例的信息,请查看官方文档

基于扩散模型的文献发展迅速,这就是我们与 Jonathan Whitaker 合作开发相关课程的原因。该课程免费,您可以在此处查看。

对第三方库的支持

Hugging Face 生态系统的核心是 Hugging Face Hub,它让人们能够有效地协作进行机器学习。如前所述,我们不仅在 Hub 上支持 🤗 Transformers 的模型,还支持其他第三方库的模型。为此,我们提供了 多种实用工具,以便您可以将自己的库与 Hub 集成。这样做的一个主要优势是,可以非常容易地与社区共享工件(例如模型和数据集),从而使用户更容易试用您的模型。

当您的模型托管在 Hub 上时,您还可以为它们添加自定义推理小部件。推理小部件允许用户快速查看模型。这有助于提高用户参与度。

用于计算机视觉演示的 Spaces

通过 Spaces,可以轻松地展示您的机器学习模型。Spaces 直接与 GradioStreamlitDocker 集成,使实践者在展示模型时拥有极大的灵活性。您可以使用自己的机器学习框架来构建 Spaces 演示。

Gradio 库提供了几个用于在 Spaces 上构建计算机视觉应用程序的组件,例如 视频画廊3D 模型。社区一直在努力构建一些由 Spaces 提供支持的令人惊叹的计算机视觉应用程序:

🤗 AutoTrain

AutoTrain 提供“无代码”解决方案,用于训练最先进的机器学习模型,例如文本分类、文本摘要、命名实体识别等。对于计算机视觉,我们目前支持图像分类,但可以期待覆盖更多任务。

AutoTrain 还支持自动模型评估。此应用程序允许您评估 Hugging Face Hub 上各种数据集上的 🤗 Transformers 模型。您的评估结果将显示在公共排行榜上。您可以查看这篇博客文章了解更多详情。

技术理念

在本节中,我们想分享我们在 🤗 Transformers 中添加计算机视觉支持的理念,以便社区了解该领域的特定设计选择。

尽管 Transformers 最初是针对 NLP,但我们今天支持多种模态,例如——视觉、音频、视觉-语言和强化学习。对于所有这些模态,Transformers 中的所有相应模型都享有一些共同的优势:

  • 使用 from_pretrained() 一行代码即可轻松下载模型
  • 使用 push_to_hub() 轻松上传模型
  • 支持使用高效检查点分片技术加载大型检查点
  • 优化支持(使用 Optimum 等工具)
  • 从模型配置初始化
  • 支持 PyTorch 和 TensorFlow(不完全列举)
  • 以及更多

与分词器不同,我们有预处理器(例如这个)负责为视觉模型准备数据。我们一直在努力确保使用视觉模型的用户体验仍然轻松且相似

from transformers import ViTImageProcessor, ViTForImageClassification
import torch
from datasets import load_dataset

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

image_processor  = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
inputs = image_processor(image, return_tensors="pt")

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

# model predicts one of the 1000 ImageNet classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# Egyptian cat

即使对于目标检测等困难任务,用户体验也没有太大变化

from transformers import AutoImageProcessor, AutoModelForObjectDetection
from PIL import Image
import requests

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

image_processor = AutoImageProcessor.from_pretrained("microsoft/conditional-detr-resnet-50")
model = AutoModelForObjectDetection.from_pretrained("microsoft/conditional-detr-resnet-50")
inputs = image_processor(images=image, return_tensors="pt")

outputs = model(**inputs)

# convert outputs (bounding boxes and class logits) to COCO API
target_sizes = torch.tensor([image.size[::-1]])
results = image_processor.post_process_object_detection(
    outputs, threshold=0.5, target_sizes=target_sizes
)[0]

for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detected {model.config.id2label[label.item()]} with confidence "
        f"{round(score.item(), 3)} at location {box}"
    )

导致

Detected remote with confidence 0.833 at location [38.31, 72.1, 177.63, 118.45]
Detected cat with confidence 0.831 at location [9.2, 51.38, 321.13, 469.0]
Detected cat with confidence 0.804 at location [340.3, 16.85, 642.93, 370.95]
Detected remote with confidence 0.683 at location [334.48, 73.49, 366.37, 190.01]
Detected couch with confidence 0.535 at location [0.52, 1.19, 640.35, 475.1]

用于视觉的零样本模型

零样本模型大量涌现,它们以有趣的方式重新定义了核心视觉任务(如分割和检测),并引入了更大的灵活性。我们支持 Transformers 中的一些零样本模型:

  • CLIP 允许使用提示进行零样本图像分类。给定一张图像,您会用“一张 {} 的图像”这样的自然语言查询提示 CLIP 模型。我们期望得到类别标签作为答案。
  • OWL-ViT 允许语言条件零样本目标检测和图像条件单样本目标检测。这意味着即使底层模型在训练期间没有学会检测这些对象,您也可以检测图像中的对象!您可以参考此笔记本了解更多信息。
  • CLIPSeg 支持语言条件零样本图像分割和图像条件单样本图像分割。这意味着即使底层模型在训练期间没有学会分割这些对象,您也可以分割图像中的对象!您可以参考这篇博客文章,它阐释了这一思想。GroupViT 也支持零样本分割任务。
  • X-CLIP 展示了对视频的零样本泛化能力。准确地说,它支持零样本视频分类。查看此笔记本了解更多详情。

社区可以期待在未来几天看到 🤗Transformers 支持更多计算机视觉零样本模型。

部署

正如我们的 CTO Julien 所说——“真正的艺术家会交付”🚀

我们通过 🤗Inference Endpoints 支持这些视觉模型的部署。Inference Endpoints 直接与兼容的图像分类、目标检测和图像分割模型集成。对于其他任务,您可以使用 自定义处理程序。由于我们还提供了许多 TensorFlow 视觉模型用于部署 🤗Transformers,我们建议使用自定义处理程序或遵循以下资源:

结论

在这篇文章中,我们向您介绍了 Hugging Face 生态系统目前支持的内容,以赋能下一代计算机视觉应用程序。我们希望您能喜欢使用这些产品来可靠、负责任地进行构建。

然而,还有很多工作要做。以下是一些您可以期待看到的东西:

  • 直接支持 🤗 Datasets 中的视频
  • 支持更多与行业相关的任务,如图像相似性
  • 图像数据集与 TensorFlow 的互操作性
  • 🤗 社区的计算机视觉课程

一如既往,我们欢迎您的补丁、PR、模型检查点、数据集及其他贡献!🤗

鸣谢:感谢 Omar Sanseviero、Nate Raw、Niels Rogge、Alara Dirik、Amy Roberts、Maria Khalusova 和 Lysandre Debut 对博客草稿的严谨及时审阅。感谢 Chunte Lee 创作了博客缩略图。

社区

注册登录发表评论