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,在训练期间应用尺度增强,这可能导致批次中的图像具有不同的大小。

为了解决这个问题,用特殊的填充标记 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 上更新