使用 Hugging Face Transformers 和 FiftyOne 简化计算机视觉工作流程

社区文章 发布于 2024 年 2 月 27 日

总结:通过 FiftyOne 和 Hugging Face Transformers 之间的集成,将 transformer 模型直接应用于您的计算机视觉数据集。使用降维技术可视化嵌入,结合向量搜索引擎进行非结构化探索,并在图像或视频上进行预测。

hf-fiftyone-thumbnail

Transformer 模型可能始于语言建模,但在过去几年中,视觉 Transformer (ViT) 已成为计算机视觉工具箱中的关键工具。无论您是从事图像分类或语义分割等传统视觉任务,还是更新颖的零样本任务,Transformer 模型都具有竞争力,或者它们本身就正在设定最先进的水平。Hugging Face 的 transformers 库使得加载、应用和操作这些模型变得异常容易。

现在,随着 Hugging Face transformers 和用于数据整理和可视化的开源 FiftyOne 库之间的集成,将 Transformer 模型直接集成到您的计算机视觉工作流程中比以往任何时候都更容易。

在这篇文章中,我们将向您展示如何无缝连接您的视觉数据和 Transformer 模型。

目录

设置

对于本教程,您需要安装 Hugging Face 的 transformers 库、Voxel51 的 fiftyone 库以及 torchtorchvision

pip install -U torch torchvision transformers fiftyone

FiftyOne 是什么?

FiftyOne 是用于计算机视觉数据整理和可视化的领先开源库。FiftyOne 中的核心数据结构是 fiftyone.Dataset,它逻辑上表示图像视频点云等多媒体文件关联的元数据、标签和任何其他信息。

您可以直接从 FiftyOne 数据集动物园加载数据集,或者加载您自己的数据——它内置支持从目录glob 模式COCO 等常见格式加载。

对于本教程,我们将使用 Quickstart 数据集,它是 COCO 2017 验证集的一个子集。

import fiftyone as fo
import fiftyone.zoo as foz

dataset = foz.load_zoo_dataset("quickstart")
## just keep the ground truth labels
dataset.delete_sample_field("predictions")

💡 要开始使用视频,请尝试 Quickstart 视频数据集

一旦您有了 FiftyOne.Dataset,您就可以使用类似 pandas 的语法过滤它

您还可以在 FiftyOne App 中可视化和目视检查您的数据。

session = fo.launch_app(dataset)

in-app filtering

为什么要使用 FiftyOne? FiftyOne 从头开始就是为计算机视觉而构建的。它将您的所有标签、特征和相关信息集中在一个地方,因此您可以进行公平比较,保持井井有条,并将您的数据视为一个活生生的对象!

Transformer 集成概述

通过 fiftyone 和 Hugging Face transformers 之间的集成,您可以将 Transformer 模型直接应用于您的数据——无论是整个数据集还是您选择的任何过滤子集——而无需编写任何自定义代码。

对于推理,该集成支持:

此外,该集成支持直接计算嵌入,以及直接利用 Transformer 模型进行任何利用嵌入的下游应用程序,例如降维可视化语义/相似度搜索

对于嵌入计算/利用,所有暴露 last_hidden_state 属性的图像分类和目标检测模型,以及所有通过 get_image_features() 暴露图像特征的零样本图像分类/目标检测模型都受支持。

对于语义相似度搜索,仅支持暴露文本和图像特征的零样本分类/检测模型。

使用 Transformer 模型进行推理

在 FiftyOne 中,样本集合(fiftyone.Datasetfiftyone.DatasetView 实例)具有 apply_model() 方法,该方法将模型作为输入。此模型可以是来自 FiftyOne 模型动物园的任何模型、任何 fiftyone.Model 实例,或者 Hugging Face transformers 模型!

传统图像推理任务

对于图像分类,您可以通过 Transformers 库加载 Transformer 模型,使用特定的架构构造函数,或者通过 AutoModelForImageClassification,使用 from_pretrained() 指定检查点。例如,对于 BeiT


## option 1
from transformers import BeitForImageClassification
model = BeitForImageClassification.from_pretrained(
    "microsoft/beit-base-patch16-224"
)

## option 2
from transformers import AutoModelForImageClassification
model = AutoModelForImageClassification.from_pretrained(
    "microsoft/beit-base-patch16-224"
)

模型加载后,您可以直接将其应用于数据集,通过 label_field 参数指定存储分类标签的字段名称。

dataset.apply_model(model, label_field="beit-base", batch_size=16)

session = fo.launch_app(dataset)

BeiT classification view

目标检测、语义分割和深度估计任务以类似方式工作;对于目标检测,使用 AutoModelForObjectDetection 或特定的架构构造函数实例化模型,并使用相同的语法应用。

from transformers import DetrForObjectDetection
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
 
dataset.apply_model(model, label_field="detr")
session = fo.launch_app(dataset)

对于语义分割,您可以加载和应用构造函数中包含 ForInstanceSegmentationForUniversalSegmentation 的模型,只要模型的图像处理器具有 post_process_semantic_segmentations() 方法。

对于单目深度估计,您可以加载和应用构造函数中包含 ForDepthEstimation 的模型。例如,使用 DPT:

from transformers import DPTForDepthEstimation
model = DPTForDepthEstimation.from_pretrained("Intel/dpt-large")
 
dataset.apply_model(model, label_field="dpt_large")
session = fo.launch_app(dataset)

image/png

💡 生成预测后,您可以在应用程序中按标签类别和预测置信度进行过滤,并在 Python 中按任意属性进行过滤。例如,过滤掉小于图像 1/4 的边界框:

from fiftyone import ViewField as F

bbox_filter = F("bounding_box")[2] * F("bounding_box")[3] < 0.25
small_bbox_view = dataset.filter_labels("detr", bbox_filter, only_matches=True)

session = fo.launch_app(small_bbox_view)

small bbox view

💡 您可以使用 FiftyOne 的评估 API 对这些任务的预测进行数值评估。

零样本推理任务

对于零样本任务,建议从 FiftyOne 模型动物园加载 Hugging Face transformers 模型。零样本图像分类的 Transformer 模型可以通过 load_zoo_model() 方法加载,将模型类型(第一个参数)指定为 "zero-shot-classification-transformer-torch",然后传入 name_or_path=<hf-name-or-path>。您可以在模型初始化时传入类列表,或者稍后设置模型的类。

import fiftyone.zoo as foz

model_type = "zero-shot-classification-transformer-torch"
name_or_path = "BAAI/AltCLIP" ## <- load AltCLIP
classes = ["cat", "dog", "bird", "fish", "turtle"] ## can override at any time

model = foz.load_zoo_model(
    model_type,
    name_or_path=name_or_path,
    classes=classes
)

然后,您可以像在传统图像分类设置中一样,使用 apply_model() 应用模型进行图像分类。

零样本目标检测的工作方式相同,但模型类型为 "zero-shot-detection-transformer-torch"。

import fiftyone.zoo as foz

model_type = "zero-shot-detection-transformer-torch"
name_or_path = "google/owlvit-base-patch32" ## <- Owl-ViT

## load model
model = foz.load_zoo_model(model_type, name_or_path=name_or_path)

## can set classes at any time
model.classes = ["cat", "dog", "bird", "cow", "horse", "chicken"] 

## apply to first 20 samples
view = dataset[:20]
view.apply_model(model, label_field="owlvit")
session = fo.launch_app(view)

zero-shot-detections

视频推理任务

此集成最酷的部分之一是 FiftyOne 数据集和 Hugging Face Transformer 模型固有的灵活性得到了保留。无需任何额外工作,您就可以将上述图像任务中的任何模型应用于视频数据集(中的帧),它将正常工作

这是将 transformers 库中的 YOLOS 应用于视频数据集所需的全部代码:

import fiftyone.zoo as foz

## load video dataset
video_dataset = foz.load_zoo_dataset("quickstart-video")

## load YOLOS model
from transformers import YolosForObjectDetection
model = YolosForObjectDetection.from_pretrained("hustvl/yolos-tiny")

## apply model
video_dataset.apply_model(model, label_field="yolovs", batch_size=16)

## visualize the results
session = fo.launch_app(video_dataset)

video-inference

使用 Transformer 进行嵌入

图像和补丁嵌入

与我们将 Hugging Face transformers 模型直接传入 FiftyOne 样本集合的 apply_model() 方法进行推理的方式类似,我们可以将 transformers 模型直接传入样本集合的 compute_embeddings() 方法。例如,这会使用 Beit 模型计算所有图像的嵌入,并将其存储在样本的 "beit_embeddings" 字段中。

from transformers import BeitForImageClassification
model = BeitForImageClassification.from_pretrained(
    "microsoft/beit-base-patch16-224"
)

dataset.compute_embeddings(model, embeddings_field="beit_embeddings", batch_size=16)

您还可以使用 compute_patch_embeddings() 计算并存储数据集中特定标签字段中每个对象补丁的嵌入。例如,使用 CLIP 计算我们真实对象补丁的嵌入:

from transformers import CLIPModel
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")

dataset.compute_patch_embeddings(
    model,
    patches_field="ground_truth",
    embeddings_field="clip_embeddings"
)

使用降维技术可视化嵌入

Hugging Face Transformer 模型与 FiftyOne 数据集在嵌入计算方面的连接方式也使得它们可以直接应用于利用嵌入的数据集范围的计算。其中一个应用是降维。通过嵌入图像(或补丁),然后使用 t-SNE、UMAP 或 PCA 将嵌入降维到 2D,我们可以直观地检查数据中的隐藏结构,并以新的方式与数据交互。

在 FiftyOne 中,降维通过 FiftyOne Braincompute_visualization() 方法执行,该方法内置支持 t-SNE、UMAP 和 PCA。

只需将任何暴露图像嵌入的 Hugging Face transformers 模型——无论是通过 last_hidden_state 还是 get_image_features()——传入该方法,以及

  • 一个 brain_key,指定保存结果的位置,以及
  • 要使用的降维技术

import fiftyone.brain as fob

from transformers import AltCLIPModel
model = AltCLIPModel.from_pretrained("BAAI/AltCLIP")

fob.compute_visualization(
    dataset,
    model=model,
    method="umap",
    brain_key="altclip_umap_vis"
)

session = fo.launch_app(dataset)

然后您可以在应用程序中将降维后的嵌入与样本一起可视化。

embedding-visualization

这是比较嵌入模型和降维技术的好方法!

按相似度搜索

嵌入的另一个数据集级别的应用是对非结构化或半结构化数据进行索引。在 FiftyOne 中,这通过 FiftyOne Brain 的 compute_similarity() 方法实现——Hugging Face transformers 模型也可以直接插入这些工作流!

只需将 transformers 模型直接传入 compute_similarity() 调用中,您就可以查询数据集以查找相似图像。

import fiftyone.brain as fob

## load model
from transformers import AutoModel
model = AutoModel.from_pretrained("google/siglip-base-patch16-224")

fob.compute_similarity(dataset, model=model, brain_key="siglip_sim")

session = fo.launch_app(dataset)

image-similarity

💡 您还可以通过传入包含对象补丁的字段名称以及 patches_field 参数,在数据集中的对象补丁上创建相似度索引。

如果您想使用自然语言语义搜索图像,可以利用暴露图像和文本特征的多模态 Transformer 模型。要启用自然语言查询,请为 model 参数传入模型类型,并通过 model_kwargs 传入模型的 name_or_path

import fiftyone.brain as fob

model_type = "zero-shot-classification-transformer-torch"
name_or_path = "openai/clip-vit-base-patch32" ## <- CLIP
model_kwargs = {"name_or_path": name_or_path}

fob.compute_similarity(
    dataset,
    model=model,
    model_kwargs=model_kwargs,
    brain_key="clip_sim"
)

session = fo.launch_app(dataset)

然后您可以在应用程序中使用放大镜图标进行文本查询,或者通过将查询文本字符串传入数据集的 Python 中的 sort_by_similarity() 方法进行查询。

kites_view = dataset.sort_by_similarity(
    "kites flying in the sky",
    k=25,
    brain_key="clip_sim"

)

text-similarity

💡 对于大型数据集,您可以使用专门构建的向量搜索引擎对数据进行索引——查看我们与 PineconeQdrantMilvusLanceDBMongoDBRedis 的原生集成!

结论

Transformer 模型已成为从事计算机视觉或多模态机器学习领域的人们的主力军,其影响力似乎只会不断增加。随着 Transformer 模型的多样性和多功能性达到历史最高水平,无缝连接这些模型与计算机视觉数据集变得绝对至关重要。

我希望 FiftyOne 和 Hugging Face Transformers 之间的这种集成能帮助您减少样板代码,轻松比较和对比模型检查点和架构,并更好地理解您的数据和模型!

资源

社区

注册登录 发表评论