Transformers documentation

معالجات الصور

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

معالجات الصور

تحوّل معالجات الصور (Image processors) الصور إلى قيم بكسل، وهي تينسورات تمثل ألوان الصورة وأبعادها. وتُعدّ قيم البكسل مدخلات لنموذج الرؤية. ولضمان استلام النموذج المُدرَّب مسبقًا على المدخلات الصحيحة، يمكن لمعالج الصور تنفيذ العمليات التالية للتأكد من أن الصورة مطابقة تمامًا للصور التي تم تدريب النموذج عليها مسبقًا.

  • قصّ من المنتصف أو تغيير حجم صورة
  • تطبيع قيم البكسلات أو إعادة مقياسها

استخدم from_pretrained() لتحميل إعدادات معالج الصور (حجم الصورة، ما إذا كان سيتم تطبيع الصور وإعادة تحجيمها، إلخ) من نموذج رؤية على Hub الخاص بـ Hugging Face أو من مجلد محلي. يتم حفظ إعدادات كل نموذج مُدرَّب مسبقًا في ملف preprocessor_config.json.

عندما يكون مُعالج الصور جزءًا من مُعالج متعدد الوسائط، فإن تكوينه يكون متداخلًا في processor_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")

يتناول هذا الدليل فئة معالج الصور وكيفية معالجة الصور مسبقًا لنماذج الرؤية.

فئات معالج الصور

تستخدم معالجات الصور بنية معمارية مبنية على الخوادم الخلفية (backends) مع خادمين خلفيين:

  • TorchvisionBackend — التنفيذ الافتراضي المعتمد على torchvision. مُسرَّع بواسطة وحدة معالجة الرسوميات (GPU) وأسرع بمقدار يصل إلى 33 مرة مقارنةً بالخلفية (backend) الخاصة بـ PIL عند التعامل مع دفعات من مدخلات torch.Tensor. تدعم جميع النماذج هذه الخلفية؛ بينما تدعم النماذج الأحدث هذه الخلفية فقط.
  • PilBackend — بديل PIL/NumPy. قابل للنقل ويعمل على المعالج فقط. متوفر فقط للنماذج الأقدم، حيث يكون من المفيد إعادة إنتاج المخرجات العددية الدقيقة للتنفيذ الأصلي.

يمكن فحص الخلفية النشطة في المعالج المحمّل من خلال خاصية backend الخاصة به (على سبيل المثال، processor.backend == "torchvision"). كل معالج صور فرعي يرث من ImageProcessingMixin الذي يوفر طريقتي from_pretrained() و save_pretrained().

هناك طريقتان لتحميل معالج الصور: إما باستخدام AutoImageProcessor أو مباشرةً من فئة محددة لنموذج معين.

AutoImageProcessor
معالج الصور الخاص بالنموذج

توفر واجهة AutoClass طريقة مريحة لتحميل معالج الصور دون الحاجة إلى تحديد النموذج المرتبط بمعالج الصور بشكل مباشر.

استخدم from_pretrained() مع الحجة backend لاختيار الخلفية. عند إغفال backend (الافتراضي)، يتم اختيار torchvision إذا كان مثبتًا، وإلا يُستخدم PIL. لاحظ أن backend="pil" مدعوم فقط للنماذج الأقدم؛ فالنماذج الأحدث تعرض فقط خلفية torchvision.

للحصول على أقرب تطابق مع معالجة ما قبل التدريب الخاصة بالنموذج، استخدم الخلفية (backend) المحددة في وثائقه أو كود تدريبه. إذا كانت خط أنابيب التدريب يستخدم PIL ويدعم النموذج كلا الخلفيتين، فمرر backend="pil". يمكن أن يؤدي التبديل بين الخلفيات إلى تغيير قيم البكسل بعد إعادة التحجيم، كما يمكن أن تؤدي تحديثات Pillow أو torchvision إلى تغييرها أيضًا. لضمان معالجة ما قبل قابلة للتكرار، حافظ على ثبات إصدارات الخلفية ومكتبة الصور.

تستخدم مجموعة صغيرة من النماذج الأقدم (Chameleon، Flava، Idefics3، SmolVLM) استيفاء Lanczos. يعتمد الخلفية الافتراضية الخاصة بها على إصدار torchvision لديك. مع torchvision > 0.27، يتم دعم Lanczos بشكل أصلي وتكون هذه النماذج افتراضياً على torchvision. أما إصدارات torchvision الأقدم فتعود إلى BICUBIC، لذا يكون الافتراضي هو PIL للحفاظ على المخرجات الأصلية. مرّر backend="torchvision" صراحةً لتجاوز الافتراضي.

from transformers import AutoImageProcessor

# Default: picks torchvision if available, otherwise pil
image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224")

# Explicitly request the torchvision backend
image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224", backend="torchvision")

# Explicitly request the PIL backend (only for models that support it)
image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224", backend="pil")

معالجات الخلفية الخاصة بـ Torchvision

TorchvisionBackend هو الواجهة الخلفية الافتراضية. تأكد من تثبيت torchvision، ثم حمّله باستخدام backend="torchvision" (أو ببساطة احذف backend، حيث يتم اختيار torchvision تلقائيًا عند توفره).

from transformers import AutoImageProcessor

processor = AutoImageProcessor.from_pretrained("facebook/detr-resnet-50", backend="torchvision")

تحكّم في الجهاز الذي تُنفَّذ عليه المعالجة باستخدام الحجة device. تُنفَّذ المعالجة افتراضيًا على نفس الجهاز الذي توجد عليه المدخلات إذا كانت متجهات (tensors)، وإلا فإنها تعود إلى وحدة المعالجة المركزية (CPU). ينفّذ المثال أدناه المعالجة على مُسرِّع (accelerator).

import torch
from torchvision.io import read_image
from transformers import DetrImageProcessor

device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else "cpu"

images = read_image("image.jpg")
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
images_processed = processor(images, return_tensors="pt", device=device)
Benchmarks

تم الحصول على نتائج الاختبارات المرجعية من وحدة AWS EC2 g5.2xlarge مزودة بمعالج رسومي NVIDIA A10G Tensor Core GPU.

دقة ديناميكية

تعتمد معظم معالجات الصور على تغيير حجم كل صورة إلى دقة ثابتة واحدة. تتيح الدقة الديناميكية لبعض النماذج الحفاظ على نسبة الأبعاد الأصلية للسماح بزيادة كمية البيانات المُعالجة مسبقًا مع حجم الصورة، بحيث تحصل الصورة عالية التفاصيل على عدد أكبر من البقع (patches) مقارنةً بالأيقونة الصغيرة، مما يتيح للنموذج توجيه قدرته الحاسوبية إلى المناطق التي تحتوي على محتوى يستحق التحليل.

يعتمد تقسيم الصورة على النموذج. بعض النماذج تقصّ الصورة إلى عدد متغيّر من البقع ذات الحجم الثابت، محكومًا بمعاملات مثل min_patches وmax_patches. أما نماذج أخرى فتعيد ضبط حجم الصورة إلى الدقة الأنسب لها، إما من خلال اختيارها من قائمة مسبقة التعريف لنسب الأبعاد، أو اشتقاقها من ميزانية بكسلات محددة.

راجع صفحة توثيق النموذج للاطلاع على معلماته وقيم افتراضية وأحجام المخرجات.

المعالجة المسبقة

تتوقع نماذج الرؤية في Transformers الإدخال على شكل تينسورات PyTorch لقيم البكسل. يتولى معالج الصور تحويل الصور إلى قيم بكسل، والتي تُعبَّر عن بحجم الدفعة، وعدد القنوات، والارتفاع، والعرض. لتحقيق ذلك، يتم تغيير حجم الصورة (مع اقتطاع مركزي) ثم تطبيع قيم البكسل وإعادة تحجيمها إلى القيم المتوقعة من النموذج.

لا تتطابق معالجة الصور المسبقة مع تعزيز الصور. يُحدث تعزيز الصور تغييرات (السطوع، الألوان، الدوران، إلخ) في صورة بغرض إنشاء أمثلة تدريب جديدة أو منع الإفراط في التكيّف. أما معالجة الصور المسبقة فتُحدث تغييرات في صورة بغرض مطابقة صيغة الإدخال المتوقعة لنموذج مُدرَّب مسبقًا.

عادةً، يتم تعزيز الصور (لزيادة الأداء) ثم معالجتها مسبقًا قبل تمريرها إلى نموذج. يمكنك استخدام أي مكتبة (Albumentations، Kornia) لتعزيز الصور ومعالج صور للمعالجة المسبقة.

يستخدم هذا الدليل وحدة transforms في torchvision للزيادة.

ابدأ بتحميل عينة صغيرة من مجموعة بيانات food101.

from datasets import load_dataset

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

من وحدة transforms، استخدم واجهة Compose لربط 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
Update on GitHub