# تصنيف الصور

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

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

1. قم بضبط [ViT](../model_doc/vit) على مجموعة بيانات [Food-101](https://huggingface.co/datasets/ethz/food101) لتصنيف عنصر غذائي في صورة.
2. استخدم النموذج المُحسَّن لديك للاستدلال.

للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالتحقق من [صفحة المهمة](https://huggingface.co/tasks/image-classification)

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

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

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

```py
>>> from huggingface_hub import notebook_login

>>> notebook_login()
```

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

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

```py
>>> from datasets import load_dataset

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

قسّم مجموعة `train` من مجموعة البيانات إلى مجموعة تدريب ومجموعة اختبار باستخدام طريقة [train_test_split](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.train_test_split):

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

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

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

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

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

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

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

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

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

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

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

```py
>>> from transformers import AutoImageProcessor

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

طبّق بعض تحويلات الصور على الصور لجعل النموذج أكثر مقاومةً للمبالغة في التخصيص. هنا ستستخدم وحدة [`transforms`](https://pytorch.org/vision/stable/transforms.html) في torchvision، لكن يمكنك أيضاً استخدام أي مكتبة صور تفضلها.

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

```py
>>> 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` - وهي المدخلات إلى النموذج - للصورة:

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

لتطبيق دالة المعالجة المسبقة على مجموعة البيانات بأكملها، استخدم طريقة [with_transform](https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.with_transform) في 🤗 Datasets. تُطبَّق التحويلات عند الطلب عند تحميل عنصر من مجموعة البيانات:

```py
>>> food = food.with_transform(transforms)
```

الآن أنشئ دفعة من الأمثلة باستخدام [DefaultDataCollator](/docs/transformers/main/ar/main_classes/data_collator#transformers.DefaultDataCollator). على عكس مُجمِّعات البيانات الأخرى في 🤗 Transformers، لا يطبّق `DefaultDataCollator` أي معالجة مسبقة إضافية مثل الحشو (padding).

```py
>>> from transformers import DefaultDataCollator

>>> data_collator = DefaultDataCollator()
```

## تقييم

غالبًا ما يكون تضمين مقياس أثناء التدريب مفيدًا لتقييم أداء نموذجك. يمكنك تحميل طريقة تقييم بسرعة باستخدام مكتبة 🤗 [Evaluate](https://huggingface.co/docs/evaluate/index). لهذه المهمة، حمّل مقياس [accuracy](https://huggingface.co/spaces/evaluate-metric/accuracy) (راجع [الجولة السريعة](https://huggingface.co/docs/evaluate/a_quick_tour) في 🤗 Evaluate لمعرفة المزيد حول كيفية تحميل المقياس وحسابه):

```py
>>> import evaluate

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

ثم أنشئ دالة تمرّر تنبؤاتك والتسميات إلى [compute](https://huggingface.co/docs/evaluate/main/en/package_reference/main_classes#evaluate.EvaluationModule.compute) لحساب الدقة:

```py
>>> 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](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer)، فاطّلع على الدرس الأساسي [هنا](../training)!

أنت مستعد الآن لبدء تدريب نموذجك! حمّل ViT باستخدام [AutoModelForImageClassification](/docs/transformers/main/ar/model_doc/auto#transformers.AutoModelForImageClassification). حدّد عدد التسميات إلى جانب عدد التسميات المتوقعة، وخرائط التسميات:

```py
>>> from transformers import AutoModelForImageClassification, TrainingArguments, Trainer

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

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

1. حدّد معاملات التدريب الفائقة في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments). من المهم ألا تحذف الأعمدة غير المستخدمة، لأن ذلك سيؤدي إلى إسقاط عمود `image`. بدون عمود `image`، لا يمكنك إنشاء `pixel_values`. اضبط `remove_unused_columns=False` لمنع هذا السلوك! المعامل الإلزامي الوحيد الآخر هو `output_dir` الذي يحدد مكان حفظ النموذج. ستقوم بدفع هذا النموذج إلى Hub عن طريق ضبط `push_to_hub=True` (تحتاج إلى تسجيل الدخول إلى Hugging Face لرفع النموذج). في نهاية كل حقبة، سيقوم [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) بتقييم الدقة وحفظ نقطة الفحص للتدريب.
2. مرّر حُجج التدريب إلى [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) مع النموذج، ومجموعة البيانات، ومُجزّئ الرموز، ومُجمِّع البيانات، ودالة `compute_metrics`.
3. استدعِ [train()](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer.train) لضبط نموذجك.

```py
>>> 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()](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer.push_to_hub) ليتمكن الجميع من استخدام نموذجك:

```py
>>> trainer.push_to_hub()
```

لمثال أكثر تفصيلاً حول كيفية ضبط نموذج لتصنيف الصور، راجع [دفتر PyTorch](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb) المقابل.

## الاستدلال

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

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

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

    

أبسط طريقة لتجربة نموذجك المُحسَّن للاستدلال هي استخدامه في [pipeline()](/docs/transformers/main/ar/main_classes/pipelines#transformers.pipeline). أنشئ كائن `pipeline` لتصنيف الصور باستخدام نموذجك، ثم مرّر صورتك إليه:

```py
>>> 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:

```py
>>> from transformers import AutoImageProcessor
>>> import torch

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

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

```py
>>> from transformers import AutoModelForImageClassification

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

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

```py
>>> predicted_label = logits.argmax(-1).item()
>>> model.config.id2label[predicted_label]
'beignets'
```

