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

تصنيف الصور

تُخصّص تصنيف الصور تسميةً أو فئةً لصورة. وعلى عكس تصنيف النصوص أو الصوت، فإن المدخلات هي قيم البكسلات التي تتكوّن منها الصورة. ولتصنيف الصور تطبيقاتٌ عديدة، مثل اكتشاف الأضرار بعد كارثة طبيعية، أو مراقبة صحة المحاصيل، أو المساعدة في فحص الصور الطبية بحثًا عن مؤشرات الأمراض.

يوضح هذا الدليل كيفية:

  1. قم بضبط ViT على مجموعة بيانات Food-101 لتصنيف عنصر غذائي في صورة.
  2. استخدم النموذج المُحسَّن لديك للاستدلال.

للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالتحقق من صفحة المهمة

قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:

pip install transformers datasets evaluate accelerate pillow torchvision scikit-learn trackio

ننصحك بتسجيل الدخول إلى حسابك على Hugging Face لرفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:

>>> from huggingface_hub import notebook_login

>>> notebook_login()

تحميل مجموعة بيانات Food-101

ابدأ بتحميل مجموعة فرعية أصغر من مجموعة بيانات Food-101 من مكتبة 🤗 Datasets. سيمنحك هذا فرصة للتجربة والتأكد من عمل كل شيء بشكل صحيح قبل قضاء مزيد من الوقت في التدريب على المجموعة الكاملة.

>>> from datasets import load_dataset

>>> food = load_dataset("ethz/food101", split="train[:5000]")

قسّم مجموعة train من مجموعة البيانات إلى مجموعة تدريب ومجموعة اختبار باستخدام طريقة train_test_split:

>>> food = food.train_test_split(test_size=0.2)

ثم اطّلع على مثال:

>>> food["train"][0]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F52AFC8AC50>,
 'label': 79}

يحتوي كل مثال في مجموعة البيانات على حقلين:

  • image: صورة PIL للعنصر الغذائي
  • label: فئة التسمية الخاصة بعنصر الطعام

لتسهيل على النموذج الحصول على اسم التسمية من معرّف التسمية، أنشئ قاموسًا يربط اسم التسمية برقم صحيح والعكس:

>>> labels = food["train"].features["label"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
...     label2id[label] = str(i)
...     id2label[str(i)] = label

الآن يمكنك تحويل معرّف التسمية إلى اسم التسمية:

>>> id2label[str(79)]
'prime_rib'

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

الخطوة التالية هي تحميل معالج صور ViT لمعالجة الصورة وتحويلها إلى متجه:

>>> from transformers import AutoImageProcessor

>>> checkpoint = "google/vit-base-patch16-224-in21k"
>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)

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

اقطع جزءًا عشوائيًا من الصورة، ثم أعد تحجيمه، وقيّسه باستخدام متوسط الصورة وانحرافها المعياري:

>>> from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor

>>> normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
>>> 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), ToTensor(), normalize])

ثم أنشئ دالة للمعالجة المسبقة لتطبيق التحويلات وإرجاع pixel_values - وهي المدخلات إلى النموذج - للصورة:

>>> def transforms(examples):
...     examples["pixel_values"] = [_transforms(img.convert("RGB")) for img in examples["image"]]
...     del examples["image"]
...     return examples

لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم طريقة with_transform في 🤗 Datasets. تُطبَّق التحويلات عند الطلب عند تحميل عنصر من مجموعة البيانات:

>>> food = food.with_transform(transforms)

الآن أنشئ دفعة من الأمثلة باستخدام DefaultDataCollator. على عكس مُجمِّعات البيانات الأخرى في 🤗 Transformers، لا يطبّق DefaultDataCollator أي معالجة مسبقة إضافية مثل الحشو (padding).

>>> from transformers import DefaultDataCollator

>>> data_collator = DefaultDataCollator()

تقييم

غالبًا ما يكون تضمين مقياس أثناء التدريب مفيدًا لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 Evaluate. لهذه المهمة، حمّل مقياس accuracy (راجع quick tour الخاص بـ 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل المقياس وحسابه):

>>> import evaluate

>>> accuracy = evaluate.load("accuracy")

ثم أنشئ دالة تمرّر تنبؤاتك والتسميات إلى compute لحساب الدقة:

>>> import numpy as np


>>> def compute_metrics(eval_pred):
...     predictions, labels = eval_pred
...     predictions = np.argmax(predictions, axis=1)
...     return accuracy.compute(predictions=predictions, references=labels)

دالة compute_metrics الخاصة بك جاهزة الآن، وستعود إليها عند إعداد التدريب.

تدريب

إذا لم تكن على دراية بتدريب نموذج باستخدام Trainer، فاطّلع على الدرس الأساسي هنا!

أنت مستعد الآن لبدء تدريب نموذجك! حمّل ViT باستخدام AutoModelForImageClassification. حدد عدد التسميات مع عدد التسميات المتوقعة، بالإضافة إلى خرائط التسميات:

>>> from transformers import AutoModelForImageClassification, TrainingArguments, Trainer

>>> model = AutoModelForImageClassification.from_pretrained(
...     checkpoint,
...     num_labels=len(labels),
...     id2label=id2label,
...     label2id=label2id,
... )

في هذه المرحلة، تبقى ثلاث خطوات فقط:

  1. حدّد معاملات التدريب الفائقة في TrainingArguments. من المهم ألا تحذف الأعمدة غير المستخدمة، لأن ذلك سيؤدي إلى إسقاط عمود image. بدون عمود image، لا يمكنك إنشاء pixel_values. اضبط remove_unused_columns=False لمنع هذا السلوك! المعامل الإلزامي الوحيد الآخر هو output_dir الذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub عن طريق ضبط push_to_hub=True (يتعين عليك تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم Trainer بتقييم الدقة وحفظ نقطة الفحص للتدريب.
  2. مرّر حُجج التدريب إلى Trainer مع النموذج، ومجموعة البيانات، ومُجزّئ الرموز، ومُجمِّع البيانات، ودالة compute_metrics.
  3. استدعِ train() لضبط نموذجك.
>>> training_args = TrainingArguments(
...     output_dir="my_awesome_food_model",
...     remove_unused_columns=False,
...     eval_strategy="epoch",
...     save_strategy="epoch",
...     learning_rate=5e-5,
...     per_device_train_batch_size=16,
...     gradient_accumulation_steps=4,
...     per_device_eval_batch_size=16,
...     num_train_epochs=3,
...     warmup_steps=0.1,
...     logging_steps=10,
...     report_to="trackio",
...     run_name="food101",
...     load_best_model_at_end=True,
...     metric_for_best_model="accuracy",
...     push_to_hub=True,
... )

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     data_collator=data_collator,
...     train_dataset=food["train"],
...     eval_dataset=food["test"],
...     processing_class=image_processor,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

بمجرد اكتمال التدريب، شارك نموذجك على Hub باستخدام طريقة push_to_hub() ليتمكن الجميع من استخدام نموذجك:

>>> trainer.push_to_hub()

لمثال أكثر تفصيلاً حول كيفية ضبط نموذج لتصنيف الصور، راجع دفتر PyTorch المقابل.

الاستدلال

ممتاز، والآن بعد أن قمت بضبط نموذج، يمكنك استخدامه للاستدلال!

حمّل صورة تريد تشغيل الاستدلال عليها:

>>> ds = load_dataset("ethz/food101", split="validation[:10]")
>>> image = ds["image"][0]
image of beignets

أبسط طريقة لتجربة نموذجك المُحسَّن للاستدلال هي استخدامه في pipeline(). أنشئ كائن pipeline لتصنيف الصور باستخدام نموذجك، ثم مرّر صورتك إليه:

>>> from transformers import pipeline

>>> classifier = pipeline("image-classification", model="my_awesome_food_model")
>>> classifier(image)
[{'score': 0.31856709718704224, 'label': 'beignets'},
 {'score': 0.015232225880026817, 'label': 'bruschetta'},
 {'score': 0.01519392803311348, 'label': 'chicken_wings'},
 {'score': 0.013022331520915031, 'label': 'pork_chop'},
 {'score': 0.012728818692266941, 'label': 'prime_rib'}]

يمكنك أيضًا إعادة إنتاج نتائج pipeline يدويًا إذا رغبت في ذلك:

حمّل معالج الصور لمعالجة الصورة مسبقاً وإرجاع input كمُتَنسَرات PyTorch:

>>> from transformers import AutoImageProcessor
>>> import torch

>>> image_processor = AutoImageProcessor.from_pretrained("my_awesome_food_model")
>>> inputs = image_processor(image, return_tensors="pt")

مرّر مدخلاتك إلى النموذج وأعد قيم logits:

>>> from transformers import AutoModelForImageClassification

>>> model = AutoModelForImageClassification.from_pretrained("my_awesome_food_model")
>>> with torch.no_grad():
...     logits = model(**inputs).logits

احصل على التسمية المتنبأ بها ذات أعلى احتمال، واستخدم خرائط id2label الخاصة بالنموذج لتحويلها إلى تسمية:

>>> predicted_label = logits.argmax(-1).item()
>>> model.config.id2label[predicted_label]
'beignets'
Update on GitHub