Hugging Face在计算机视觉领域的现状 🤗

Hugging Face在计算机视觉领域的现状 🤗

在Hugging Face,我们与社区一起以民主化人工智能领域为傲。作为这一使命的一部分,我们在过去一年开始将重点放在计算机视觉上。从在🤗 Transformers中引入Vision Transformers(ViT)的PR开始,现在已经发展成为了一项更大的工作——8个核心视觉任务,超过3000个模型以及在Hugging Face Hub上超过100个数据集。

自从ViTs加入Hub以来,发生了许多令人兴奋的事情。在本博客文章中,我们将总结发生的事情以及即将来到的内容,以支持🤗生态系统中计算机视觉的持续进展。

以下是我们将涵盖的内容列表:

  • 支持的视觉任务和流程
  • 训练自己的视觉模型
  • timm的集成
  • 扩散器
  • 对第三方库的支持
  • 部署
  • 以及更多!

支持社区:一次一个任务 👁

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

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

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

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

这些任务不仅涉及到最先进的基于Transformer的架构,例如ViT、Swin、DETR,还包括纯卷积架构,如ConvNeXt、ResNet、RegNet等等!ResNet等架构在许多工业应用案例中仍然非常重要,因此🤗 Transformers支持这些非Transformer架构。

还需要注意的是,Hub上的模型不仅来自Transformers库,还来自其他第三方库。例如,尽管我们支持在Hub上进行无条件图像生成等任务,但Transformers中尚无支持该任务的模型(例如此处)。支持使用Transformers或第三方库解决的所有ML任务是我们促进协作开源机器学习生态系统的一部分。

支持流程

我们开发了流程,为从业者提供了他们需要的工具,以便轻松地将机器学习纳入他们的工具箱。它们提供了一种简单的方法,用于根据任务对给定输入进行推断。我们在流程中支持七个视觉任务。以下是使用流程进行深度估计的示例:

from transformers import pipeline

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

# 这是一个张量,其值表示每个像素的深度,以米为单位
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="动物在做什么?", image=image_url, top_k=1)
# [{'score': 0.778620, 'answer': '躺下'}]

训练自己的模型

虽然能够使用现成的模型进行推断是入门的绝佳方式,但是微调是社区获得最大收益的地方。当您的数据集是自定义的,并且预训练模型的性能不佳时,这一点尤其正确。

Transformers提供了一个Trainer API,用于与训练相关的所有内容。目前,Trainer无缝支持以下任务:图像分类、图像分割、视频分类、对象检测和深度估计。还支持其他视觉任务的微调模型,只是不使用Trainer

只要从Transformer中包含了计算损失的模型对给定任务进行计算损失,就可以对该任务进行微调。如果发现问题,请在GitHub上报告。

我在哪里找到代码?

  • 模型文档
  • Hugging Face笔记本
  • Hugging Face示例脚本
  • 任务页面

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

然而,有些任务并不是本质上为了微调而设计的。例如零样本图像分类(如CLIP),零样本目标检测(如OWL-ViT)和零样本分割(如CLIPSeg)。我们将在本文中重新审视这些模型。

与数据集的集成

数据集提供了对数千个不同模态的数据集的便捷访问。如前所述,Hub上有超过100个计算机视觉数据集。这里值得注意的一些例子:ImageNet-1k,场景解析,NYU Depth V2,COYO-700M和LAION-400M。有了这些数据集在Hub上,只需两行代码即可轻松加载它们:

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

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

🤗 🤝 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支持与Gradio、Streamlit和Docker的直接集成,使从业者在展示其模型时具有极大的灵活性。您可以引入自己的机器学习框架来使用 Spaces 构建演示。

Gradio库提供了几个用于构建计算机视觉应用程序的组件,例如Video、Gallery和Model3D。社区一直在努力构建一些令人惊叹的计算机视觉应用程序,这些应用程序由Spaces提供支持:

  • 通过预测输入图像的深度图生成3D体素
  • 开放词汇语义分割
  • 通过生成字幕来叙述视频
  • 从YouTube分类视频
  • 零样本视频分类
  • 视觉问答
  • 使用零样本图像分类找到最佳标题,以生成相似图像

🤗 AutoTrain

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

AutoTrain还实现了自动模型评估。该应用程序允许您在Hub上评估🤗 Transformers模型的各种数据集。评估结果将显示在公共排行榜上。您可以查看此博文获取更多详细信息。

技术哲学

在这一部分中,我们想要分享我们在为Computer Vision添加🤗 Transformers支持时的哲学,以便社区了解与此领域相关的设计选择。

尽管Transformers最初用于自然语言处理,但我们今天支持多种模态,例如视觉、音频、视觉语言和强化学习。对于所有这些模态,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

# 模型预测为1000个ImageNet类别之一
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# 埃及猫

即使对于像目标检测这样的困难任务,用户体验也不会发生太大的改变:

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)

# 将输出(边界框和类别logits)转换为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"检测到{model.config.id2label[label.item()]},置信度{round(score.item(), 3)},位置{box}"
    )

输出结果:

检测到遥控器,置信度0.833,位置[38.31, 72.1, 177.63, 118.45]
检测到猫,置信度0.831,位置[9.2, 51.38, 321.13, 469.0]
检测到猫,置信度0.804,位置[340.3, 16.85, 642.93, 370.95]
检测到遥控器,置信度0.683,位置[334.48, 73.49, 366.37, 190.01]
检测到沙发,置信度0.535,位置[0.52, 1.19, 640.35, 475.1]

视觉的零样本模型

近来,出现了一系列将核心视觉任务如分割和检测以有趣的方式重新定义,并引入了更多的灵活性的模型。我们支持一些来自 Transformers 的模型:

  • CLIP 可以通过提示实现零样本图像分类。给定一张图像,您可以使用自然语言查询“一个{}的图像”来提示 CLIP 模型。希望能够得到类别标签作为答案。
  • OWL-ViT 允许基于语言进行零样本目标检测和基于图像的单样本目标检测。这意味着您可以在图像中检测对象,即使底层模型在训练过程中没有学习到检测它们!您可以参考这个笔记本了解更多信息。
  • CLIPSeg 支持基于语言的零样本图像分割和基于图像的单样本图像分割。这意味着您可以在图像中分割对象,即使底层模型在训练过程中没有学习到分割它们!您可以参考这篇博文来了解这个想法。GroupViT 也支持零样本分割任务。
  • X-CLIP 展示了对视频的零样本泛化。具体来说,它支持零样本视频分类。请查看这个笔记本以获取更多详细信息。

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

部署

正如我们的首席技术官 Julien 所说 – “真正的艺术家发货” 🚀

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

  • 使用TF Serving在Hugging Face中部署TensorFlow视觉模型
  • 使用TF Serving在Kubernetes上部署🤗 ViT
  • 在Vertex AI上部署🤗 ViT
  • 使用TFX和Vertex AI部署ViT

结论

在本文中,我们为您介绍了目前在 Hugging Face 生态系统中支持的内容,以赋予下一代计算机视觉应用程序的能力。我们希望您会喜欢使用这些提供来构建可靠且负责任的解决方案。

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

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

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

致谢:感谢 Omar Sanseviero、Nate Raw、Niels Rogge、Alara Dirik、Amy Roberts、Maria Khalusova 和 Lysandre Debut 对博客草稿的认真和及时的审查。感谢 Chunte Lee 创建博客缩略图。