# المعالجات

تتطلب النماذج متعددة الوسائط معالجًا مسبقًا قادرًا على التعامل مع مدخلات تجمع بين أكثر من نمط واحد. اعتمادًا على نمط المدخلات، يحتاج المعالج إلى تحويل النص إلى مصفوفة من المتجهات (tensors)، والصور إلى قيم البكسل، والصوت إلى مصفوفة من المتجهات بمعدل أخذ عينات صحيح.

على سبيل المثال، [PaliGemma](./model_doc/paligemma) هو نموذج لغوي بصري يستخدم معالج الصور [SigLIP](./model_doc/siglip) ومقسّم الرموز [Llama](./model_doc/llama). تُغلّف فئة [ProcessorMixin](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin) كلا نوعَي المعالج المسبق هذين، مما يوفر فئة معالج موحدة ومفردة لنموذج متعدد الوسائط.

استدعِ [from_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained) لتحميل المعالج. مرِّر نوع الإدخال إلى المعالج لتوليد مدخلات النموذج المتوقعة، ومعرفات الإدخال، وقيم البكسل.

```py
from transformers import AutoProcessor, PaliGemmaForConditionalGeneration
from PIL import Image
import requests

processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")

prompt = "answer en Where is the cat standing?"
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(text=prompt, images=image, return_tensors="pt")
inputs
```

يصف هذا الدليل فئة المعالج وكيفية المعالجة المسبقة للمدخلات متعددة الوسائط.

## فئات المعالج

All processors inherit from the [ProcessorMixin](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin) class which provides methods like [from_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained), [save_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.save_pretrained), and [push_to_hub()](/docs/transformers/main/ar/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub) for loading, saving, and sharing processors to the Hub.

هناك طريقتان لتحميل المعالج، باستخدام [AutoProcessor](/docs/transformers/main/ar/model_doc/auto#transformers.AutoProcessor) وباستخدام فئة المعالج الخاصة بالنموذج.

توفر واجهة [AutoClass](./model_doc/auto) طريقة بسيطة لتحميل المعالجات دون الحاجة إلى تحديد فئة النموذج الخاصة بها بشكل مباشر.

استخدم [from_pretrained()](/docs/transformers/main/ar/model_doc/auto#transformers.AutoProcessor.from_pretrained) لتحميل المعالج.

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")
```

تُرتبط المعالجات أيضًا بفئة نموذج متعدد الوسائط مُسبقة التدريب محددة. يمكنك تحميل المعالج مباشرةً من فئة النموذج باستخدام [from_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained).

```py
from transformers import WhisperProcessor

processor = WhisperProcessor.from_pretrained("openai/whisper-tiny")
```

يمكنك أيضًا تحميل نوعَي المعالج المسبق بشكل منفصل، وهما [WhisperTokenizerFast](/docs/transformers/main/ar/model_doc/whisper#transformers.WhisperTokenizer) و[WhisperFeatureExtractor](/docs/transformers/main/ar/model_doc/whisper#transformers.WhisperFeatureExtractor).

```py
from transformers import WhisperTokenizerFast, WhisperFeatureExtractor, WhisperProcessor

tokenizer = WhisperTokenizerFast.from_pretrained("openai/whisper-tiny")
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")
processor = WhisperProcessor(feature_extractor=feature_extractor, tokenizer=tokenizer)
```

## حفظ مُعالِج وتحميله

تكتب الدالة [save_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.save_pretrained) إعدادات المعالج في ملف واحد باسم `processor_config.json`. أما المُرمِّز وقالب المحادثة فيُحفظان في ملفيهما الخاصين.

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("llava-hf/llava-onevision-qwen2-0.5b-ov-hf")
processor.save_pretrained("./llava-onevision")
```

```text
llava-onevision/
├── chat_template.jinja
├── processor_config.json
├── tokenizer.json
└── tokenizer_config.json
```

كل معالج فرعي باستثناء المعرّف الرمزي (tokenizer) يكون متداخلاً داخل `processor_config.json` تحت اسم خاصيته، مثل `image_processor` أو `video_processor` أو `feature_extractor`. أما الإعدادات التي تنتمي إلى المعالج نفسه، مثل `image_token`، فتقع في المستوى الأعلى. المثال أدناه مُختصر.

```json
{
  "image_processor": {
    "image_processor_type": "LlavaOnevisionImageProcessor",
    "do_resize": true,
    "size": {"height": 384, "width": 384},
    "image_mean": [0.5, 0.5, 0.5]
  },
  "image_token": "<image>",
  "processor_class": "LlavaOnevisionProcessor",
  "video_processor": {
    "video_processor_type": "LlavaOnevisionVideoProcessor",
    "do_resize": true,
    "size": {"height": 384, "width": 384},
    "image_mean": [0.5, 0.5, 0.5]
  },
  "video_token": "<video>"
}
```

تُحفظ الملفات الأخرى بشكل منفصل.

- يكتب مُجزِّئ الرموز ملفاتّه المعتادة، مثل `tokenizer.json` و`tokenizer_config.json`. وإذا كان المعالج يحتوي على مُجزِّئ رموز ثانٍ، فيُحفظ في مجلد فرعي يحمل اسم خاصيته، مثل `decoder_tokenizer/`.
- يُحفظ قالب المحادثة في `chat_template.jinja`. إذا كان المعالج يحتوي على عدة قوالب للمحادثة، فإن القالب `default` يُوضع في `chat_template.jinja` والبقية تُوضع في مجلد `chat_templates/`.

عند تحميل مُعالِج باستخدام [from_pretrained()](/docs/transformers/main/ar/model_doc/wav2vec2#transformers.Wav2Vec2Processor.from_pretrained)، يبحث كل مُعالِج فرعي أولاً عن مفتاحه المتداخل في `processor_config.json`. وإذا لم يكن المفتاح موجوداً، فإنه يعتمد على ملف مستقل. تقرأ مُعالِجات الصور ومستخرِجات الميزات من `preprocessor_config.json`، بينما تقرأ مُعالِجات الفيديو من `video_preprocessor_config.json` ثم `preprocessor_config.json`. لا تزال نقاط التفتيش الأقدم التي تخزّن كل مُعالِج فرعي في ملفه الخاص تُحمَّل بهذه الطريقة.

> [!NOTE]
> تتمتع الإعدادات المتداخلة بأولوية على الملف المستقل. إذا كان نقطة التفتيش تحتوي على كلا النوعين، فإن تعديل `preprocessor_config.json` أو `video_preprocessor_config.json` لا يُحدث أي أثر. بدلاً من ذلك، عدّل الإدخال المتداخل في `processor_config.json`.

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

تقوم المعالجات بمعالجة المدخلات متعددة الوسائط مسبقًا لتحويلها إلى الصيغة المتوقعة في مكتبة Transformers. هناك عدة تركيبات من أنماط المدخلات التي يمكن للمعالج التعامل معها، مثل النص والصوت، أو النص والصورة.

تتطلب مهام التعرف التلقائي على الكلام (ASR) معالجًا قادرًا على التعامل مع مدخلات النص والصوت. حمّل مجموعة بيانات واستعرض العمودين `audio` و`text` (يمكنك إزالة الأعمدة الأخرى غير الضرورية).

```py
from datasets import load_dataset

dataset = load_dataset("keithito/lj_speech", split="train")
dataset = dataset.map(remove_columns=["file", "id", "normalized_text"])
dataset[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
         7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
 'sampling_rate': 22050}

dataset[0]["text"]
'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'
```

تذكّر بإعادة أخذ عينات معدل أخذ العينات ليتطابق مع معدل أخذ العينات المطلوب في النماذج المُدرَّبة مسبقًا.

```py
from datasets import Audio

dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
```

حمّل مُعالِجًا ومرّر عمودي `array` و`text` الصوتيين إليه.

```py
from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("openai/whisper-tiny")

def prepare_dataset(example):
    audio = example["audio"]
    example.update(processor(audio=audio["array"], text=example["text"], sampling_rate=16000))
    return example
```

طبّق دالة `prepare_dataset` لمعالجة مجموعة البيانات مسبقاً. يعيد المعالج `input_features` لعمود `audio` و`labels` لعمود النص.

```py
prepare_dataset(dataset[0])
```

