Transformers documentation
من الفيديو والنص إلى النص
من الفيديو والنص إلى النص
نماذج الفيديو-النص إلى النص، المعروفة أيضًا بنماذج لغة الفيديو، هي نماذج قادرة على معالجة الفيديو وإخراج نص. يمكن لهذه النماذج التعامل مع مهام متنوعة، بدءًا من الإجابة عن أسئلة حول الفيديو وصولًا إلى إنشاء أوصاف نصية للفيديو.
تتميز هذه النماذج ببنية معمارية شبه متطابقة مع نماذج من الصورة والنص إلى النص، باستثناء بعض التعديلات اللازمة لقبول بيانات الفيديو، إذ أن بيانات الفيديو تتكون في جوهرها من إطارات صور ذات اعتماديات زمنية. تستقبل بعض نماذج من الصورة والنص إلى النص عدة صور، لكن هذا وحده غير كافٍ لنموذج يقبل مقاطع الفيديو.
علاوة على ذلك، تُدرَّب نماذج الفيديو-النص-إلى-النص غالبًا مع جميع أوضاع الرؤية. فقد يحتوي كل مثال على مقاطع فيديو، أو عدة مقاطع فيديو، وصور، أو عدة صور. كما يمكن لبعض هذه النماذج قبول مدخلات متناوبة. على سبيل المثال، يمكنك الإشارة إلى مقطع فيديو محدد داخل سلسلة نصية عن طريق إضافة رمز فيديو في النص مثل "ما الذي يحدث في هذا الفيديو؟ <video>".
لاحظ أن هذه النماذج تعالج مقاطع الفيديو دون صوت. في المقابل، يمكن لنماذج Any-to-any معالجة مقاطع الفيديو التي تحتوي على صوت.
في هذا الدليل، نقدم نظرة عامة موجزة على نماذج اللغة المرئية (Video LMs) ونوضح كيفية استخدامها مع Transformers للاستدلال.
لنبدأ أولاً، فهناك أنواع متعددة من نماذج اللغة المرئية:
- النماذج الأساسية المستخدمة في الضبط الدقيق
- نماذج محادثة مُعدَّلة للتخصيص للمحادثة
- نماذج مُعدّلة بالتدريب الدقيق التعليماتي
يركز هذا الدليل على الاستدلال باستخدام نموذج مُعدّل بالتعليمات، وهو llava-hf/llava-onevision-qwen2-0.5b-ov-hf الذي يمكنه استقبال بيانات متداخلة. أو يمكنك تجربة llava-interleave-qwen-0.5b-hf إذا لم تسمح لك أجهزتك بتشغيل نموذج بحجم 7B.
لنبدأ بتثبيت التبعيات.
pip install -q transformers accelerate flash_attn torchcodec
لنقم بتهيئة النموذج والمعالج.
from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration
import torch
model_id = "llava-hf/llava-onevision-qwen2-0.5b-ov-hf"
device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else "cpu"
processor = AutoProcessor.from_pretrained(model_id, device=device)
model = LlavaForConditionalGeneration.from_pretrained(model_id, device_map="auto", dtype=torch.float16)سنقوم بالاستدلال باستخدام فيديوهين، وكلاهما يحتوي على قطط.
الفيديوهات هي سلاسل من إطارات الصور. اعتماداً على قيود العتاد، يكون إعادة أخذ العينات (downsampling) ضرورية. إذا كان عدد الإطارات بعد إعادة أخذ العينات قليلاً جداً، فستكون التنبؤات منخفضة الجودة.
تحتوي نماذج الفيديو-النص-إلى-نص على معالجات تتضمن معالج فيديو مُجرَّد. يمكنك تمرير الحُجج المتعلقة باستدلال الفيديو إلى دالة apply_chat_template().
يمكنك معرفة المزيد حول معالجات الفيديو هنا.
يمكننا تعريف سجل المحادثة لدينا، مع تمرير فيديو عبر رابط URL كما هو موضح أدناه.
messages = [
{
"role": "user",
"content": [
{"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_1.mp4"},
{"type": "text", "text": "Describe what is happening in this video."},
],
}
]يمكنك معالجة مقاطع الفيديو مسبقًا عن طريق تمرير الرسائل، وإعداد do_sample_frames إلى True، وتمرير num_frames. هنا، نأخذ عينة من 10 إطارات.
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
num_frames=10,
do_sample_frames=True
)
inputs.to(model.device)تحتوي المدخلات على input_ids للنص المُرمَّز، وpixel_values_videos لعشر إطارات، وattention_mask للرموز.
يمكننا الآن الاستدلال باستخدام مدخلاتنا المعالجة مسبقًا وفك ترميزها.
generated_ids = model.generate(**inputs, max_new_tokens=128)
input_length = len(inputs["input_ids"][0])
output_text = processor.batch_decode(
generated_ids[:, input_length:], skip_special_tokens=True, clean_up_tokenization_spaces=False
)
output_text = processor.batch_decode(
generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text[0])
#"The video features a fluffy, long-haired cat with a mix of brown and white fur, lying on a beige carpeted floor. The cat's eyes are wide open, and its whiskers are prominently visible. The cat appears to be in a relaxed state, with its head slightly"يمكنك أيضًا دمج عدة مقاطع فيديو مع النص مباشرةً في قالب المحادثة كما هو موضح أدناه.
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "Here's a video."},
{"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_1.mp4"},
{"type": "text", "text": "Here's another video."},
{"type": "video", "video": "https://huggingface.co/spaces/merve/llava-interleave/resolve/main/cats_2.mp4"},
{"type": "text", "text": "Describe similarities in these videos."},
],
}
]تبقى عملية الاستدلال كما هي في المثال السابق.
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
num_frames=100,
do_sample_frames=True
)
inputs.to(model.device)
generated_ids = model.generate(**inputs, max_new_tokens=50)
input_length = len(inputs["input_ids"][0])
output_text = processor.batch_decode(
generated_ids[:, input_length:], skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
#['Both videos feature a cat with a similar appearance, characterized by a fluffy white coat with black markings, a pink nose, and a pink tongue. The cat\'s eyes are wide open, and it appears to be in a state of alertness or excitement. ']