Transformers documentation
المعالجات
المعالجات
تتطلب النماذج متعددة الوسائط معالجًا مسبقًا قادرًا على التعامل مع مدخلات تجمع بين أكثر من نمط واحد. اعتمادًا على نمط المدخلات، يحتاج المعالج إلى تحويل النص إلى مصفوفة من المتجهات (tensors)، والصور إلى قيم البكسل، والصوت إلى مصفوفة من المتجهات بمعدل أخذ عينات صحيح.
على سبيل المثال، PaliGemma هو نموذج لغوي بصري يستخدم معالج الصور SigLIP ومقسّم الرموز Llama. تُغلّف فئة ProcessorMixin كلا نوعَي المعالج المسبق هذين، مما يوفر فئة معالج موحدة ومفردة لنموذج متعدد الوسائط.
استدعِ from_pretrained() لتحميل المعالج. مرِّر نوع الإدخال إلى المعالج لتوليد مدخلات النموذج المتوقعة، ومعرفات الإدخال، وقيم البكسل.
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 class which provides methods like from_pretrained(), save_pretrained(), and push_to_hub() for loading, saving, and sharing processors to the Hub.
هناك طريقتان لتحميل المعالج، باستخدام AutoProcessor وباستخدام فئة المعالج الخاصة بالنموذج.
توفر واجهة AutoClass طريقة بسيطة لتحميل المعالجات دون الحاجة إلى تحديد فئة النموذج الخاصة بها بشكل مباشر.
استخدم from_pretrained() لتحميل المعالج.
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("google/paligemma-3b-pt-224")تُرتبط المعالجات أيضًا بفئة نموذج متعدد الوسائط مُسبقة التدريب محددة. يمكنك تحميل المعالج مباشرةً من فئة النموذج باستخدام from_pretrained().
from transformers import WhisperProcessor
processor = WhisperProcessor.from_pretrained("openai/whisper-tiny")يمكنك أيضًا تحميل نوعَي المعالج المسبق بشكل منفصل، وهما WhisperTokenizerFast وWhisperFeatureExtractor.
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() إعدادات المعالج في ملف واحد باسم processor_config.json. أما المُرمِّز وقالب المحادثة فيُحفظان في ملفيهما الخاصين.
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("llava-hf/llava-onevision-qwen2-0.5b-ov-hf")
processor.save_pretrained("./llava-onevision")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، فتقع في المستوى الأعلى. المثال أدناه مُختصر.
{
"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) ملفاتّه المعتادة، مثل
tokenizer.jsonوtokenizer_config.json. وإذا كان المعالج (processor) يحتوي على مُجزِّئ رموز ثانٍ، فيُحفظ في مجلد فرعي يحمل اسم خاصيّته، مثلdecoder_tokenizer/. - يُحفظ قالب المحادثة في
chat_template.jinja. إذا كان المعالج يحتوي على عدة قوالب للمحادثة، فإن القالبdefaultيُوضع فيchat_template.jinjaوالبقية تُوضع في مجلدchat_templates/.
عند تحميل مُعالِج باستخدام from_pretrained()، يبحث كل مُعالِج فرعي أولاً عن مفتاحه المتداخل في processor_config.json. إذا لم يكن المفتاح موجوداً، فإنه يعتمد على ملف مستقل. تقرأ مُعالِجات الصور ومستخرِجات الميزات من preprocessor_config.json، بينما تقرأ مُعالِجات الفيديو من video_preprocessor_config.json ثم preprocessor_config.json. لا تزال نقاط التفتيش الأقدم التي تخزّن كل مُعالِج فرعي في ملفه الخاص تُحمَّل بهذه الطريقة.
تتمتع الإعدادات المتداخلة بأولوية على الملف المستقل. إذا كان نقطة التفتيش تحتوي على كلا النوعين، فإن تعديل
preprocessor_config.jsonأوvideo_preprocessor_config.jsonلا يُحدث أي أثر. بدلاً من ذلك، عدّل الإدخال المتداخل فيprocessor_config.json.
المعالجة المسبقة
تقوم المعالجات بمعالجة المدخلات متعددة الوسائط مسبقًا لتحويلها إلى الصيغة المتوقعة في مكتبة Transformers. هناك عدة تركيبات من أنماط المدخلات التي يمكن للمعالج التعامل معها، مثل النص والصوت، أو النص والصورة.
تتطلب مهام التعرف التلقائي على الكلام (ASR) معالجًا قادرًا على التعامل مع مدخلات النص والصوت. حمّل مجموعة بيانات واستعرض العمودين audio وtext (يمكنك إزالة الأعمدة الأخرى غير الضرورية).
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'تذكّر بإعادة أخذ عينات معدل أخذ العينات ليتطابق مع معدل أخذ العينات المطلوب في النماذج المُدرَّبة مسبقًا.
from datasets import Audio
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))حمّل مُعالِجًا ومرّر عمودي array وtext الصوتيين إليه.
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 لعمود النص.
prepare_dataset(dataset[0])