Transformers 文档

图像处理器

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始

图像处理器

图像处理器将图像转换为像素值,即表示图像颜色和大小的张量。像素值是视觉或视频模型的输入。为了确保预训练模型接收到正确的输入,图像处理器可以执行以下操作,以确保图像与模型预训练时使用的图像完全相同。

使用 from_pretrained() 从 Hugging Face Hub 或本地目录中的视觉模型加载图像处理器的配置(图像大小、是否进行归一化和重放缩等)。每个预训练模型的配置都保存在 preprocessor_config.json 文件中。

from transformers import AutoImageProcessor

image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")

将图像传递给图像处理器以将其转换为像素值,并将 return_tensors="pt" 设置为返回 PyTorch 张量。您可以随意打印出输入,以查看图像作为张量的样子。

from PIL import Image
import requests

url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/image_processor_example.png"
image = Image.open(requests.get(url, stream=True).raw).convert("RGB")
inputs = image_processor(image, return_tensors="pt")

本指南涵盖图像处理器类以及如何为视觉模型预处理图像。

图像处理器类

图像处理器继承自 BaseImageProcessor 类,该类提供了 center_crop()normalize()rescale() 函数。图像处理器有两种类型。

每个图像处理器都继承了 ImageProcessingMixin 类,该类提供了用于加载和保存图像处理器的 from_pretrained()save_pretrained() 方法。

您可以通过两种方式加载图像处理器:使用 AutoImageProcessor 或模型特定的图像处理器。

AutoImageProcessor
模型特定的图像处理器

AutoClass API 提供了一种便捷的方法来加载图像处理器,而无需直接指定图像处理器关联的模型。

使用 from_pretrained() 加载图像处理器,如果支持,请设置 use_fast=True 以加载快速图像处理器。

from transformers import AutoImageProcessor

image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224", use_fast=True)

快速图像处理器

BaseImageProcessorFast 基于 torchvision,速度明显更快,尤其是在 GPU 上处理时。如果模型可用,此类可以作为 BaseImageProcessor 的直接替代品,因为它具有相同的设计。确保已安装 torchvision,并将 use_fast 参数设置为 True

from transformers import AutoImageProcessor

processor = AutoImageProcessor.from_pretrained("facebook/detr-resnet-50", use_fast=True)

使用 device 参数控制在哪个设备上执行处理。如果输入是张量,则默认在与输入相同的设备上执行处理,否则在 CPU 上处理。下面的示例将快速处理器放在 GPU 上。

from torchvision.io import read_image
from transformers import DetrImageProcessorFast

images = read_image("image.jpg")
processor = DetrImageProcessorFast.from_pretrained("facebook/detr-resnet-50")
images_processed = processor(images, return_tensors="pt", device="cuda")
基准测试

这些基准测试是从配备 NVIDIA A10G Tensor Core GPU 的 AWS EC2 g5.2xlarge 实例获得的。

预处理

Transformers 的视觉模型期望输入为像素值的 PyTorch 张量。图像处理器处理图像到像素值的转换,像素值由批次大小、通道数、高度和宽度表示。为了实现这一点,图像被调整大小(中心裁剪),并且像素值被归一化并重放缩到模型期望的值。

图像预处理与图像增强不同。图像增强为了创建新的训练样本或防止过拟合,对图像进行更改(亮度、颜色、旋转等)。图像预处理为了匹配预训练模型的预期输入格式,对图像进行更改。

通常,图像会先进行增强(以提高性能),然后再进行预处理,之后传递给模型。您可以使用任何库(AlbumentationsKornia)进行增强,并使用图像处理器进行预处理。

本指南使用 torchvision transforms 模块进行增强。

首先加载 food101 数据集的小样本。

from datasets import load_dataset

dataset = load_dataset("food101", split="train[:100]")

transforms 模块中,使用 Compose API 将 RandomResizedCropColorJitter 链接在一起。这些变换随机裁剪和调整图像大小,并随机调整图像的颜色。

要随机裁剪到的图像大小可以从图像处理器中检索。对于某些模型,需要精确的高度和宽度,而对于其他模型,仅需要 shortest_edge

from torchvision.transforms import RandomResizedCrop, ColorJitter, Compose

size = (
    image_processor.size["shortest_edge"]
    if "shortest_edge" in image_processor.size
    else (image_processor.size["height"], image_processor.size["width"])
)
_transforms = Compose([RandomResizedCrop(size), ColorJitter(brightness=0.5, hue=0.5)])

将变换应用于图像并将它们转换为 RGB 格式。然后将增强后的图像传递给图像处理器以返回像素值。

do_resize 参数设置为 False,因为图像已经在增强步骤中通过 RandomResizedCrop 调整了大小。如果您不增强图像,则图像处理器会自动使用 image_meanimage_std 值调整图像大小并进行归一化。这些值在预处理器配置文件中可以找到。

def transforms(examples):
    images = [_transforms(img.convert("RGB")) for img in examples["image"]]
    examples["pixel_values"] = image_processor(images, do_resize=False, return_tensors="pt")["pixel_values"]
    return examples

使用 set_transform 将组合的增强和预处理功能即时应用于整个数据集。

dataset.set_transform(transforms)

将像素值转换回图像,以查看图像是如何被增强和预处理的。

import numpy as np
import matplotlib.pyplot as plt

img = dataset[0]["pixel_values"]
plt.imshow(img.permute(1, 2, 0))
之前
之后

对于其他视觉任务,如目标检测或分割,图像处理器包括后处理方法,以将模型的原始输出转换为有意义的预测,如边界框或分割图。

填充

某些模型,如 DETR,在训练期间应用 scale augmentation,这可能导致批次中的图像具有不同的大小。不同大小的图像无法批量处理。

为了解决这个问题,使用特殊的填充标记 0 填充图像。使用 pad 方法填充图像,并定义一个自定义的 collate 函数将它们批量处理在一起。

def collate_fn(batch):
    pixel_values = [item["pixel_values"] for item in batch]
    encoding = image_processor.pad(pixel_values, return_tensors="pt")
    labels = [item["labels"] for item in batch]
    batch = {}
    batch["pixel_values"] = encoding["pixel_values"]
    batch["pixel_mask"] = encoding["pixel_mask"]
    batch["labels"] = labels
    return batch
< > 在 GitHub 上更新