Transformers 图像处理器(Image Processor)深度指南:像素值转换、预处理流程与批处理 Padding 实战
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
导读
在 🤗 Transformers 中,视觉模型的输入不是原始图片文件,而是表示图像颜色与尺寸的像素值张量(pixel values)。图像处理器(Image Processor)正是负责把 PIL、NumPy 或 torch.Tensor 形式的图像统一转换成视觉模型所需输入格式的组件。本指南基于仓库中的 韩文版图像处理器文档(与 英文版文档 内容互为对应),结合源码讲解如何加载图像处理器、理解其后端架构、完成"数据增强 + 预处理"的标准流水线,以及如何用 Padding 与自定义 collate 函数解决 DETR 等模型的不定尺寸批处理问题。读完本文,你将能够独立完成任意视觉模型从图像到pixel_values的完整输入链路搭建。
一、图像处理器是什么:从图像到像素值张量
图像处理器将图像转换为像素值——即表示图像颜色与尺寸的张量,这些像素值就是视觉模型的输入。为了让预训练模型正确识别新图像,输入图像的格式必须与模型训练时使用的数据完全一致。图像处理器通过以下两类核心操作统一图像格式(对应BaseImageProcessor提供的标准方法):
- 裁剪/缩放:
center_crop中心裁剪,或按目标尺寸调整图像大小; - 归一化/缩放:
normalize用image_mean/image_std归一化像素值,或rescale按rescale_factor(默认1/255,见 image_processing_utils.py)将像素值缩放到 0~1 区间。
经过上述处理后,图像被表示为(batch size, number of channels, height, width)形状的像素值张量。BaseImageProcessor的默认model_input_names = ["pixel_values"](见 源码),也印证了"像素值"就是模型的标准化输入名。
配置从哪来:preprocessor_config.json
每个预训练模型的图像处理器配置(图像尺寸、是否归一化、是否缩放等)都保存在模型仓库的preprocessor_config.json文件中。使用ImageProcessingMixin.from_pretrained即可从 Hugging Face Hub 或本地目录加载这些配置:
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")💡 建议把
inputs打印出来看一眼——你会直观地看到一张图片在张量视角下是什么样的,这是理解后续所有预处理细节的起点。
二、图像处理器类体系:后端架构与继承关系
当前仓库中的图像处理器采用后端(backend)架构,这与韩文版文档中"Python 实现 vs fast 实现"的旧表述一脉相承,只是实现方式已演进。类层次结构如下(见 BaseImageProcessor 类文档):
BaseImageProcessor(基类,负责 kwargs 校验与预处理分发) ├── TorchvisionBackend # 默认后端,GPU 加速,操作 torch.Tensor │ └── 模型级处理器,如 ViTImageProcessor └── PilBackend # 便携 CPU 后端,操作 np.ndarray └── 模型级处理器,如 ViTImageProcessorPilTorchvisionBackend—— 基于 torchvision 的默认实现,GPU 加速。文档说明:对于一批torch.Tensor输入,比 PIL 后端最多快 33 倍;当前所有模型均支持该后端,较新的模型只支持它。PilBackend—— PIL/NumPy 替代实现,便携且仅 CPU。仅对较老的模型可用,适合需要与原始实现保持数值完全一致的场景。
每个模型级图像处理器都继承自ImageProcessingMixin,从而获得from_pretrained与save_pretrained加载/保存能力。已加载处理器的当前后端可通过backend属性查看,例如processor.backend == "torchvision"。
预处理的标准调用链在源码中清晰可见(见 image_processing_utils.py 的架构说明):
__call__() → preprocess() → _preprocess_image_like_inputs() → _prepare_image_like_inputs() (逐图调用 process_image 完成格式转换) → _preprocess()(批量 resize/crop/rescale/normalize/pad)两种加载方式
方式一:AutoImageProcessor(自动加载)
AutoImageProcessor无需手动指定图像处理器与模型的关联关系,按模型自动解析。通过backend参数选择后端:
from transformers import AutoImageProcessor # 默认:装了 torchvision 就用 torchvision,否则退回 PIL image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224") # 显式指定 torchvision 后端 image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224", backend="torchvision") # 显式指定 PIL 后端(仅支持该后端的旧模型可用) image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224", backend="pil")方式二:模型特定类(直接加载)
每个图像处理器都与特定视觉模型绑定,其配置文件中保存了该模型所需的尺寸与归一化参数。直接实例化模型特定类(旧版文档中的use_fast=True参数已弃用,请改用backend参数):
from transformers import ViTImageProcessor image_processor = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")从源码看,ViTImageProcessor正是直接继承自TorchvisionBackend(见 image_processing_vit.py),因此默认就走 torchvision 加速路径。
⚠️ 韩文版文档中的
use_fast=True、ViTImageProcessorFast、DetrImageProcessorFast属于旧 API。当前仓库中AutoImageProcessor.from_pretrained的use_fast参数已被标记为Deprecated,官方建议改用backend="torchvision"(见 image_processing_auto.py 的参数说明)。
小插曲:部分旧模型的后端默认值
一小部分旧模型(如 Chameleon、Flava、Idefics3、SmolVLM)使用 Lanczos 插值。它们的默认后端取决于 torchvision 版本:torchvision > 0.27 原生支持 Lanczos,默认走 torchvision;旧版 torchvision 会回退到 BICUBIC,为保持原始输出而默认走 PIL。需要覆盖默认行为时可显式传backend="torchvision"(见 英文版文档)。
三、快速图像处理器:torchvision 后端与设备控制
torchvision 后端完全按照原BaseImageProcessor的设计实现,模型若支持即可无缝替换。安装 torchvision 后,用backend="torchvision"(或省略backend让系统自动选择)加载即可:
from transformers import AutoImageProcessor processor = AutoImageProcessor.from_pretrained("facebook/detr-resnet-50", backend="torchvision")device 参数:指定处理设备
device参数用于控制处理发生在哪个设备上:若输入本身是张量,则在张量所在的设备上处理;否则默认在 CPU 上处理。下面的例子把处理放到 GPU 上执行:
from torchvision.io import read_image from transformers import DetrImageProcessor images = read_image("image.jpg") processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50") images_processed = processor(images, return_tensors="pt", device="cuda")对应地,DetrImageProcessor同样继承自TorchvisionBackend(见 image_processing_detr.py),其process_image会在需要时把 PIL/NumPy 输入转换为torch.Tensor并搬运到指定设备(见 image_processing_backends.py)。
性能基准(文档声明)
英文版与韩文版文档均声明:以下基准在配备 NVIDIA A10G Tensor Core GPU 的 AWS EC2 g5.2xlarge 实例上测得,覆盖 DETR 与 RT-DETR 的完整流水线(含 padding、批量与 compiled 场景),用于展示快速后端在单图与批量处理下的加速效果。具体数值以文档中的 Benchmark 图表为准,实际加速比会因输入规模、插值方式与硬件而不同,建议在自己的数据上实测。
四、图像预处理(Preprocess)实战:增强与预处理流水线
预处理 ≠ 数据增强
- 数据增强(Augmentation):为扩充训练数据或防止过拟合,有意改变图像(亮度、颜色、旋转等);
- 预处理(Preprocessing):只做一件事——让图像精确匹配预训练模型要求的输入格式。
两者职责不同但通常串联使用:先增强,后预处理。增强可用 Albumentations、Kornia 等任意库,预处理统一交给图像处理器。本指南使用 torchvision 的transforms模块做增强。
完整示例:food101 数据集
先加载 food101 数据集的一小部分样本:
from datasets import load_dataset dataset = load_dataset("ethz/food101", split="train[:100]")用Compose把随机裁剪缩放(RandomResizedCrop)与随机颜色抖动(ColorJitter)链到一起。裁剪尺寸直接从图像处理器读取——有的模型需要精确的height/width,有的只需要最短边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(保存在 preprocessor 配置文件中)自动完成缩放与归一化:
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用datasets.Dataset.set_transform将"增强 + 预处理"组合函数实时应用到整个数据集:
dataset.set_transform(transforms)把处理后的像素值还原成图像,直观验证增强与预处理效果(pixel_values是 C×H×W 布局,展示前需permute成 H×W×C):
import numpy as np import matplotlib.pyplot as plt img = dataset[0]["pixel_values"] plt.imshow(img.permute(1, 2, 0))(原文档在此处附有"处理前/处理后"对比图,可参考 英文版文档 对应段落理解预期效果。)
不止预处理:后处理能力
对于目标检测、分割等视觉任务,图像处理器还提供**后处理(post-processing)**方法,把模型原始输出转换成有意义的预测——如边界框(bounding box)或分割图(segmentation map)。以 DETR 为例,源码中提供post_process_object_detection(将 logits 解码为框坐标与置信度)和post_process_panoptic_segmentation(生成全景分割结果)等接口,是"输入预处理—模型推理—输出后处理"闭环的最后一环。
五、Padding 与自定义 collate:DETR 不定尺寸批处理方案
问题背景
DETR 等模型在训练时使用尺度增强(scale augmentation),导致同一批次内的图像尺寸各不相同。而尺寸不同的图像无法直接组成一个 batch。
解决方案:pad 方法 + 自定义 collate_fn
用特殊填充标记0为图像补边以统一尺寸。pad方法(实现见 image_processing_detr.py)会:
- 计算出各图与目标尺寸的差值,调用
tvF.pad以fill=0填充; - 同时生成
pixel_mask——其中1表示有效像素、0表示填充区域(见源码第 663-665 行),模型据此忽略 padding 位置; - 对 DETR 场景还会同步更新标注(bounding box 坐标、masks)以匹配填充后的图像(见
_update_annotation_for_padded_image)。
批量层面,TorchvisionBackend.pad会先按形状分组、批量填充再重排(见 image_processing_backends.py),效率更高。配合自定义collate_fn完成组批:
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把这个collate_fn传给 DataLoader(如DataLoader(dataset, collate_fn=collate_fn)),即可让不同尺寸的图像在同一个 batch 中完成训练或推理——pixel_mask会告诉模型哪些区域是真实像素、哪些是填充的无效区域。
六、进阶话题:动态分辨率(Dynamic Resolution)
多数图像处理器会把所有图像缩放到同一个固定分辨率。而动态分辨率允许部分模型保留原始宽高比,让预处理数据量随图像内容增长——细节丰富的照片获得更多 patch,小图标则更少,从而把算力花在真正有信息的位置(见 英文版文档)。
如何切分图像因模型而异:有的模型把图像裁剪成数量可变的固定尺寸 patch(受min_patches、max_patches等参数约束);有的模型则把图像缩放到最合适的分辨率(从预定义的宽高比列表中选择,或由像素预算推导)。具体参数、默认值与输出形状请查阅对应模型文档页。
总结
图像处理器是 Transformers 视觉链路中承上启下的关键组件:它负责把任意格式的图像统一为模型要求的像素值张量。掌握本指南后,你应该能够:
- 用
AutoImageProcessor或模型特定类加载处理器,并理解preprocessor_config.json中尺寸、归一化等配置的作用; - 识别当前仓库基于
TorchvisionBackend/PilBackend的后端架构,用backend/device参数控制加速与设备; - 搭建"增强 → 预处理 → 数据集变换"的完整流水线,并正确使用
do_resize=False等细节参数; - 针对 DETR 等不定尺寸模型,用
pad+pixel_mask+ 自定义collate_fn完成批处理,让预处理结果真正跑进模型训练与推理。
进一步探索可参考:图像处理器基类实现、后端实现、AutoImageProcessor 自动加载、DETR 图像处理器。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考