Transformers 文档
图像处理器
并获得增强的文档体验
开始
图像处理器
图像处理器将图像转换为像素值,即表示图像颜色和大小的张量。像素值是视觉或视频模型的输入。为了确保预训练模型接收到正确的输入,图像处理器可以执行以下操作,以确保图像与模型预训练时使用的图像完全相同。
- center_crop() 来调整图像大小
- normalize() 或 rescale() 像素值
使用 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() 函数。图像处理器有两种类型。
- BaseImageProcessor 是一个 Python 实现。
- BaseImageProcessorFast 是一个更快的 torchvision-backed 版本。对于一批 torch.Tensor 输入,速度可以快 33 倍。BaseImageProcessorFast 目前并非适用于所有视觉模型。请参考模型的 API 文档以检查是否支持。
每个图像处理器都继承了 ImageProcessingMixin 类,该类提供了用于加载和保存图像处理器的 from_pretrained() 和 save_pretrained() 方法。
您可以通过两种方式加载图像处理器:使用 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 张量。图像处理器处理图像到像素值的转换,像素值由批次大小、通道数、高度和宽度表示。为了实现这一点,图像被调整大小(中心裁剪),并且像素值被归一化并重放缩到模型期望的值。
图像预处理与图像增强不同。图像增强为了创建新的训练样本或防止过拟合,对图像进行更改(亮度、颜色、旋转等)。图像预处理为了匹配预训练模型的预期输入格式,对图像进行更改。
通常,图像会先进行增强(以提高性能),然后再进行预处理,之后传递给模型。您可以使用任何库(Albumentations、Kornia)进行增强,并使用图像处理器进行预处理。
本指南使用 torchvision transforms 模块进行增强。
首先加载 food101 数据集的小样本。
from datasets import load_dataset
dataset = load_dataset("food101", split="train[:100]")
从 transforms 模块中,使用 Compose API 将 RandomResizedCrop 和 ColorJitter 链接在一起。这些变换随机裁剪和调整图像大小,并随机调整图像的颜色。
要随机裁剪到的图像大小可以从图像处理器中检索。对于某些模型,需要精确的高度和宽度,而对于其他模型,仅需要 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_mean
和 image_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