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 支援版本。對於一批 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")
預處理
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,在訓練期間應用尺度增強,這可能導致批次中的影像具有不同的大小。
為了解決這個問題,用特殊的填充標記 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