# من الفيديو والنص إلى النص

نماذج الفيديو-النص إلى النص، المعروفة أيضًا بنماذج لغة الفيديو، هي نماذج قادرة على معالجة الفيديو وإخراج نص. يمكن لهذه النماذج التعامل مع مهام متنوعة، بدءًا من الإجابة عن أسئلة حول الفيديو وصولًا إلى إنشاء أوصاف نصية للفيديو.

تتميز هذه النماذج ببنية معمارية شبه متطابقة مع نماذج [من الصورة والنص إلى النص](./image_text_to_text)، باستثناء بعض التعديلات اللازمة لقبول بيانات الفيديو، إذ أن بيانات الفيديو تتكون في جوهرها من إطارات صور ذات اعتماديات زمنية. تستقبل بعض نماذج من الصورة والنص إلى النص عدة صور، لكن هذا وحده غير كافٍ لنموذج يقبل مقاطع الفيديو.

علاوة على ذلك، تُدرَّب نماذج الفيديو-النص-إلى-النص غالبًا باستخدام جميع أوضاع الرؤية. فقد يحتوي كل مثال على فيديو، أو عدة فيديوهات، أو صور، أو عدة صور. كما يمكن لبعض هذه النماذج قبول مدخلات متناوبة. على سبيل المثال، يمكنك الإشارة إلى فيديو محدد داخل نص من خلال إضافة رمز فيديو في النص، مثل: "ما الذي يحدث في هذا الفيديو؟ `<video>`".

لاحظ أن هذه النماذج تعالج مقاطع الفيديو دون صوت. في المقابل، يمكن لنماذج [Any-to-any](./any_to_any) معالجة مقاطع الفيديو التي تحتوي على صوت.

في هذا الدليل، نقدم نظرة عامة موجزة على نماذج اللغة المرئية (Video LMs) ونوضح كيفية استخدامها مع Transformers للاستدلال.

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

- النماذج الأساسية المستخدمة في الضبط الدقيق
- نماذج محادثة مُعدَّلة للتخصيص للمحادثة
- نماذج مُعدّلة بالتدريب الدقيق التعليماتي

يركز هذا الدليل على الاستدلال باستخدام نموذج مُعدّل بالتعليمات، [llava-hf/llava-onevision-qwen2-0.5b-ov-hf](https://huggingface.co/llava-hf/llava-interleave-qwen-7b-hf) الذي يمكنه استقبال بيانات متداخلة. أو يمكنك تجربة [llava-interleave-qwen-0.5b-hf](https://huggingface.co/llava-hf/llava-interleave-qwen-0.5b-hf) إذا لم يسمح لك جهازك بتشغيل نموذج بحجم 7B.

لنبدأ بتثبيت التبعيات.

```bash
pip install -q transformers accelerate flash_attn torchcodec
```

لنقم بتهيئة النموذج والمعالج.

```python
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()](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin.apply_chat_template).

> [!WARNING]
> يمكنك معرفة المزيد حول معالجات الفيديو [هنا](../main_classes/video_processor).

يمكننا تعريف سجل المحادثة لدينا، مع تمرير فيديو عبر رابط URL كما هو موضح أدناه.

```python
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 إطارات.

```python
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` للرموز.

يمكننا الآن الاستدلال باستخدام مدخلاتنا المعالجة مسبقًا وفك ترميزها.

```python
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"
```

يمكنك أيضًا دمج عدة مقاطع فيديو مع النص مباشرةً في قالب المحادثة كما هو موضح أدناه.

```python
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."},
        ],
    }
]
```

تبقى عملية الاستدلال كما هي في المثال السابق.

```python
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. ']
```

