# محوّل الرؤية للفيديو (ViViT)

## نظرة عامة

قُدِّم نموذج Vivit في [ViViT: A Video Vision Transformer](https://huggingface.co/papers/2103.15691) من قِبل Anurag Arnab وMostafa Dehghani وGeorg Heigold وChen Sun وMario Lučić وCordelia Schmid. تقترح الورقة البحثية أحد أوائل مجموعات النماذج الناجحة القائمة بالكامل على محولات التحويل (transformers) لفهم الفيديو.

المستخلص من الورقة البحثية هو كالتالي:

*نقدّم نماذج مبنية بالكامل على معمارية الترانسفورمر لتصنيف الفيديو، مستفيدين من النجاح الأخير الذي حققته هذه النماذج في تصنيف الصور. يستخرج نموذجنا الرموز المكانية-الزمنية من الفيديو المُدخل، ثم تُشفَّر هذه الرموز بواسطة سلسلة من طبقات الترانسفورمر. وللتعامل مع تسلسلات الرموز الطويلة التي تظهر في الفيديو، نقترح عدة متغيرات فعّالة لنموذجنا تقوم بتجزئة الأبعاد المكانية والزمنية للمدخل. وعلى الرغم من أن النماذج المبنية على الترانسفورمر معروفة بأنها لا تكون فعّالة إلا عند توفر مجموعات بيانات تدريب كبيرة، فإننا نُظهر كيف يمكننا تنظيم النموذج بفعالية أثناء التدريب والاستفادة من نماذج الصور المُسبقة التدريب لتتمكن من التدريب على مجموعات بيانات أصغر نسبياً. أجرينا دراسات استئصالية شاملة، وحققنا نتائج متقدمة على عدة معايير لتصنيف الفيديو، بما في ذلك Kinetics 400 و600، وEpic Kitchens، وSomething-Something v2، وMoments in Time، متفوقين على الأساليب السابقة المبنية على شبكات التحويلية ثلاثية الأبعاد العميقة.*

تمت مساهمة هذا النموذج من قِبل [jegormeister](https://huggingface.co/jegormeister). يمكن العثور على الكود الأصلي (المكتوب بلغة JAX) [هنا](https://github.com/google-research/scenic/tree/main/scenic/projects/vivit).

### استخدام الانتباه القياسي بنقطة منتج

يتضمن PyTorch مُشغّلًا أصليًا للانتباه بنقطة جداء مُقيّمة (SDPA) كجزء من `torch.nn.functional`. تشمل هذه الدالة عدة تطبيقات يمكن تطبيقها اعتمادًا على المدخلات والعتاد المستخدم. راجع [التوثيق الرسمي](https://pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html) أو صفحة [GPU Inference](https://huggingface.co/docs/transformers/main/en/perf_infer_gpu_one#pytorch-scaled-dot-product-attention) لمزيد من المعلومات.

يُستخدم SDPA افتراضيًا لـ `torch>=2.1.1` عندما تكون هناك نسخة تنفيذية متاحة، لكن يمكنك أيضًا تعيين `attn_implementation="sdpa"` في `from_pretrained()` لطلب استخدام SDPA بشكل صريح.

```python
from transformers import VivitModel

model = VivitModel.from_pretrained("google/vivit-b-16x2-kinetics400", attn_implementation="sdpa", device_map="auto")
...
```

للحصول على أفضل تسارعات، ننصح بتحميل النموذج بدقة نصفية (مثل `torch.float16` أو `torch.bfloat16`).

في معيار محلي (A100-40GB، PyTorch 2.3.0، نظام التشغيل Ubuntu 22.04) باستخدام `float32` ونموذج `google/vivit-b-16x2-kinetics400`، لاحظنا التسارعات التالية أثناء الاستدلال.

### التدريب

|   num_training_steps |   batch_size |   هل هو cuda |   السرعة (%) |   ذروة الذاكرة العاجلة (ميغابايت) |   ذروة ذاكرة sdpa (ميغابايت) |   توفير الذاكرة (%) |
|---------------------:|-------------:|----------:|--------------:|----------------------:|---------------------:|-----------------:|
|                  100 |            1 |      صحيح |         7.122 |               2575.28 |              5932.54 |           130.364 |

### الاستدلال

|   num_batches |   batch_size |   هل هو cuda |   نصف |   السرعة (%) |   ذاكرة مستعجلة (ميغابايت) |   ذاكرة الذاكرة المؤقتة (ميغابايت) |   الذاكرة المحفوظة (%) |
|---------------|--------------|-----------|-----------|---------------|------------------|---------------|-----------------|
|            20 |             1 |   صحيح    |   False   |      15.422   |     715.807      |    317.079    |      125.75     |
|            20 |             2 |   صحيح    |   False   |      17.146   |    1234.75       |    447.175    |      176.122    |
|            20 |             4 |   صحيح    |   False   |      18.093   |    2275.82       |    709.864    |      220.6      |
|            20 |             8 |   صحيح    |   False   |      19.284   |    4358.19       |   1233.24     |      253.393    |

## VivitConfig[[transformers.VivitConfig]]

#### transformers.VivitConfig[[transformers.VivitConfig]]

```python
transformers.VivitConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, image_size: int | list[int] | tuple[int, int] = 224, num_frames: int = 32, tubelet_size: list[int] | tuple[int, ...] = (2, 16, 16), num_channels: int = 3, hidden_size: int = 768, num_hidden_layers: int = 12, num_attention_heads: int = 12, intermediate_size: int = 3072, hidden_act: str = 'gelu_fast', hidden_dropout_prob: float | int = 0.0, attention_probs_dropout_prob: float | int = 0.0, initializer_range: float = 0.02, layer_norm_eps: float = 1e-06, qkv_bias: bool = True, pooler_output_size: int | None = None, pooler_act: str = 'tanh')
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/configuration_vivit.py#L24)

**المعاملات:**

image_size (`Union[int, list[int], tuple[int, int]]`، *اختياري*، القيمة الافتراضية `224`) : حجم (دقة) كل صورة.

num_frames (`int`، *اختياري*، القيمة الافتراضية 32) : عدد الإطارات في كل فيديو.

tubelet_size (`list[int]`، *اختياري*، القيمة الافتراضية هي `[2, 16, 16]`) : حجم (دقة) كل أنبوبيّة.

num_channels (`int`، *اختياري*، القيمة الافتراضية `3`) : عدد قنوات الإدخال.

hidden_size (`int`، *اختياري*، القيمة الافتراضية `768`) : بُعد التمثيلات المخفية.

num_hidden_layers (`int`، *اختياري*، القيمة الافتراضية `12`) : عدد الطبقات المخفية في مُفكِّك Transformer.

num_attention_heads (`int`، *اختياري*، القيمة الافتراضية `12`) : عدد رؤوس الانتباه في كل طبقة انتباه داخل مُفكِّك Transformer.

intermediate_size (`int`، *اختياري*، القيمة الافتراضية `3072`) : بُعد تمثيلات MLP.

hidden_act (`str`، *اختياري*، القيمة الافتراضية `gelu_fast`) : دالة التنشيط غير الخطية (دالة أو نص) في المُفكِّك. على سبيل المثال، `"gelu"`، `"relu"`، `"silu"`، وما إلى ذلك.

hidden_dropout_prob (`Union[float, int]`، *اختياري*، القيمة الافتراضية `0.0`) : احتمال الإسقاط (dropout) لجميع الطبقات المتصلة بالكامل في التضمينات (embeddings) والمشفّر (encoder) والمجمّع (pooler).

attention_probs_dropout_prob (`Union[float, int]`، *اختياري*، القيمة الافتراضية `0.0`) : نسبة الإسقاط (dropout) لاحتمالات الانتباه.

initializer_range (`float`، *اختياري*، القيمة الافتراضية `0.02`) : الانحراف المعياري لـ truncated_normal_initializer المستخدم في تهيئة جميع مصفوفات الأوزان.

layer_norm_eps (`float`, *اختياري*, الافتراضي هو `1e-06`) : قيمة إيبسلون المستخدمة في طبقات تطبيع الطبقة.

qkv_bias (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إضافة انحياز إلى الاستعلامات والمفاتيح والقيم.

pooler_output_size (`int`، *اختياري*) : بُعد طبقة المُجمِّع (pooler layer). إذا كانت القيمة None، فإن القيمة الافتراضية هي `hidden_size`.

pooler_act (`str`، *اختياري*، القيمة الافتراضية `"tanh"`) : دالة التنشيط التي سيستخدمها المُجمِّع (pooler).

هذه فئة الإعدادات المخزنة لإعدادات نموذج VivitModel. تُستخدم لتوليد نموذج Vivit وفقاً للحجج المحددة، مع تعريف بنية النموذج. إن إنشاء إعدادات باستخدام القيم الافتراضية سيؤدي إلى الحصول على إعدادات مشابهة لتلك الخاصة بـ [google/vivit-b-16x2-kinetics400](https://huggingface.co/google/vivit-b-16x2-kinetics400)

ترث كائنات الإعداد من [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig) ويمكن استخدامها للتحكم في مخرجات النموذج. اقرأ التوثيق الخاص بـ [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig) لمزيد من المعلومات.

مثال:

```python
>>> from transformers import VivitConfig, VivitModel

>>> # Initializing a ViViT google/vivit-b-16x2-kinetics400 style configuration
>>> configuration = VivitConfig()

>>> # Initializing a model (with random weights) from the google/vivit-b-16x2-kinetics400 style configuration
>>> model = VivitModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

## VivitImageProcessor[[transformers.VivitImageProcessor]]

#### transformers.VivitImageProcessor[[transformers.VivitImageProcessor]]

```python
transformers.VivitImageProcessor(do_resize: bool = True, size: dict[str, int] | None = None, resample: Resampling = <Resampling.BILINEAR: 2>, do_center_crop: bool = True, crop_size: dict[str, int] | None = None, do_rescale: bool = True, rescale_factor: int | float = 0.00784313725490196, offset: bool = True, do_normalize: bool = True, image_mean: float | list[float] | None = None, image_std: float | list[float] | None = None, **kwargs)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/image_processing_vivit.py#L63)

**المعاملات:**

do_resize (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب تغيير أبعاد الصورة (الارتفاع، العرض) إلى `size` المحدد. يمكن تجاوز ذلك عبر معامل `do_resize` في طريقة `preprocess`.

size (`dict[str, int]` *اختياري*، القيمة الافتراضية `{"shortest_edge" : 256}`): حجم الصورة الناتجة بعد إعادة التحجيم. سيتم إعادة تحجيم الحافة الأقصر للصورة إلى `size["shortest_edge"]` مع الحفاظ على نسبة أبعاد الصورة الأصلية. يمكن تجاوز هذا الإعداد بواسطة `size` في طريقة `preprocess`.

resample (`PILImageResampling`، *اختياري*، الافتراضي `Resampling.BILINEAR`) : مرشح إعادة العينة المستخدم عند تغيير حجم الصورة. يمكن تجاوزه بواسطة معامل `resample` في طريقة `preprocess`.

do_center_crop (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب قصّ الصورة في المنتصف إلى `crop_size` المحدد. يمكن تجاوز ذلك عبر معامل `do_center_crop` في طريقة `preprocess`.

crop_size (`dict[str, int]`، *اختياري*، القيمة الافتراضية `{"height" : 224, "width": 224}`): حجم الصورة بعد تطبيق القص المركزي. يمكن تجاوز هذا الحجم عبر معامل `crop_size` في طريقة `preprocess`.

do_rescale (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إعادة تحجيم الصورة حسب معامل التحجيم المحدد `rescale_factor`. يمكن تجاوز ذلك عبر معامل `do_rescale` في طريقة `preprocess`.

rescale_factor (`int` أو `float`، *اختياري*، القيمة الافتراضية هي `1/127.5`) : يحدد معامل المقياس المستخدم عند إعادة تحجيم الصورة. يمكن تجاوز هذا المعامل عبر معامل `rescale_factor` في طريقة `preprocess`.

offset (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم توسيط الصورة في الاتجاهين السالب والموجب. يمكن تجاوز ذلك بواسطة `offset` في طريقة `preprocess`.

do_normalize (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم تطبيع الصورة. يمكن تجاوز ذلك عبر معامل `do_normalize` في طريقة `preprocess`.

image_mean (`float` أو `list[float]`، *اختياري*، القيمة الافتراضية هي `IMAGENET_STANDARD_MEAN`) : المتوسط المستخدم عند تطبيع الصورة. وهو عدد عشري أو قائمة من الأعداد العشرية بطول عدد القنوات في الصورة. يمكن تجاوز هذه القيمة عبر معامل `image_mean` في طريقة `preprocess`.

image_std (`float` أو `list[float]`، *اختياري*، القيمة الافتراضية هي `IMAGENET_STANDARD_STD`) : الانحراف المعياري المستخدم عند تطبيع الصورة. وهو عدد عشري أو قائمة من الأعداد العشرية بطول عدد القنوات في الصورة. يمكن تجاوزه بواسطة معامل `image_std` في طريقة `preprocess`.

ينشئ معالج صور Vivit.

#### preprocess[[transformers.VivitImageProcessor.preprocess]]

```python
preprocess(videos: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']], do_resize: bool | None = None, size: dict[str, int] | None = None, resample: PIL.Image.Resampling | None = None, do_center_crop: bool | None = None, crop_size: dict[str, int] | None = None, do_rescale: bool | None = None, rescale_factor: float | None = None, offset: bool | None = None, do_normalize: bool | None = None, image_mean: float | list[float] | None = None, image_std: float | list[float] | None = None, return_tensors: str | transformers.utils.generic.TensorType | None = None, data_format: ChannelDimension = <ChannelDimension.FIRST: 'channels_first'>, input_data_format: str | transformers.image_utils.ChannelDimension | None = None)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/image_processing_vivit.py#L285)

**المعاملات:**

videos (`ImageInput`) : إطارات الفيديو التي يجب معالجتها مسبقًا. يتوقع إطارًا واحدًا أو دفعة من إطارات الفيديو بقيم بكسل تتراوح بين 0 و255. إذا كنت تمرر إطارات بقيم بكسل بين 0 و1، فاضبط `do_rescale=False`.

do_resize (`bool`، *اختياري*، الافتراضي `self.do_resize`) : ما إذا كان يجب تغيير حجم الصورة.

size (`dict[str, int]`، *اختياري*، القيمة الافتراضية هي `self.size`) : حجم الصورة بعد تطبيق إعادة التحجيم.

resample (`PILImageResampling`، *اختياري*، الافتراضي `self.resample`) : مرشح إعادة العينة المستخدم عند تغيير حجم الصورة. يمكن أن يكون أحد قيم enum `PILImageResampling`، ولا يكون له تأثير إلا إذا تم تعيين `do_resize` إلى `True`.

do_center_crop (`bool`، *اختياري*، القيمة الافتراضية `self.do_centre_crop`) : ما إذا كان يجب قص الصورة من المنتصف.

crop_size (`dict[str, int]`، *اختياري*، القيمة الافتراضية هي `self.crop_size`) : حجم الصورة بعد تطبيق القص المركزي.

do_rescale (`bool`، *اختياري*، القيمة الافتراضية `self.do_rescale`) : ما إذا كان يجب إعادة مقياس قيم الصورة بين `[-1 - 1]` إذا كانت `offset` هي `True`، وإلا `[0, 1]`.

rescale_factor (`float`، *اختياري*، القيمة الافتراضية `self.rescale_factor`) : عامل إعادة التحجيم لإعادة تحجيم الصورة إذا كان `do_rescale` مضبوطًا على `True`.

offset (`bool`، *اختياري*، القيمة الافتراضية `self.offset`) : ما إذا كان سيتم تحجيم الصورة في الاتجاهين السالب والموجب.

do_normalize (`bool`، *اختياري*، الافتراضي `self.do_normalize`) : ما إذا كان سيتم تطبيع الصورة.

image_mean (`float` أو `list[float]`، *اختياري*، القيمة الافتراضية هي `self.image_mean`) : متوسط الصورة.

image_std (`float` أو `list[float]`، *اختياري*، القيمة الافتراضية هي `self.image_std`) : الانحراف المعياري للصورة.

return_tensors (`str` أو `TensorType`، *اختياري*) : نوع المصفوفات (tensors) التي سيتم إرجاعها. يمكن أن يكون أحد ما يلي: - غير مُعيَّن: إرجاع قائمة من `np.ndarray`. - `TensorType.PYTORCH` أو `'pt'`: إرجاع دفعة (batch) من النوع `torch.Tensor`. - `TensorType.NUMPY` أو `'np'`: إرجاع دفعة (batch) من النوع `np.ndarray`.

data_format (`ChannelDimension` أو `str`، *اختياري*، الافتراضي هو `ChannelDimension.FIRST`) : تنسيق بُعد القناة للصورة الناتجة. يمكن أن يكون أحد ما يلي: - `ChannelDimension.FIRST`: صورة بتنسيق (num_channels, height, width). - `ChannelDimension.LAST`: صورة بتنسيق (height, width, num_channels). - غير مُعيَّن: استخدام تنسيق بُعد القناة المستنتج من الصورة المدخلة.

input_data_format (`ChannelDimension` أو `str`، *اختياري*) : تنسيق بُعد القناة للصورة المدخلة. إذا لم يتم ضبطه، يُستنتج تنسيق بُعد القناة من الصورة المدخلة. يمكن أن يكون أحد ما يلي: - `"channels_first"` أو `ChannelDimension.FIRST`: صورة بتنسيق (num_channels, height, width). - `"channels_last"` أو `ChannelDimension.LAST`: صورة بتنسيق (height, width, num_channels). - `"none"` أو `ChannelDimension.NONE`: صورة بتنسيق (height, width).

معالجة صورة أو دفعة من الصور مسبقًا.

## VivitVideoProcessor[[transformers.VivitVideoProcessor]]

#### transformers.VivitVideoProcessor[[transformers.VivitVideoProcessor]]

```python
transformers.VivitVideoProcessor(**kwargs: *<class 'transformers.processing_utils.VideosKwargs'>)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/video_processing_vivit.py#L25)

**المعاملات:**

do_convert_rgb (`bool`، *kwargs*، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب تحويل الصورة إلى RGB.

do_resize (`bool`، *kwargs*، *اختياري*، الافتراضي هو `True`) : ما إذا كان سيتم تغيير حجم الصورة.

size (`Annotated[int | list[int] | tuple[int, ...] | dict[str, int] | None, None]`، *kwargs*، القيمة الافتراضية `{'shortest_edge' : 256}`): يصف الأبعاد القصوى للإدخال إلى النموذج.

default_to_square (`bool`، *kwargs*، *اختياري*، الافتراضي `False`) : ما إذا كان سيتم افتراض صورة مربعة عند تغيير الحجم، إذا كان size من نوع int.

resample (`Annotated[Union[int, PILImageResampling, NoneType], None]`، *kwargs*، القيمة الافتراضية `2`) : مرشح إعادة العينة المستخدم عند تغيير حجم الصورة. يمكن أن يكون أحد قيم التعداد `PILImageResampling`. لا يؤثر إلا إذا كانت قيمة `do_resize` هي `True`.

do_rescale (`bool`، *kwargs*، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إعادة تحجيم الصورة.

rescale_factor (`float`، *kwargs*، *اختياري*، القيمة الافتراضية `0.00784313725490196`) : معامل إعادة التحجيم لإعادة تحجيم الصورة إذا تم تعيين `do_rescale` إلى `True`.

do_normalize (`bool`، *kwargs*، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم تطبيع الصورة.

image_mean (`Union[float, list[float], tuple[float, ...]]`، *kwargs*، *اختياري*، القيمة الافتراضية هي `[0.5, 0.5, 0.5]`) : متوسط الصورة المستخدم للتطبيع. لا يكون له تأثير إلا إذا تم تعيين `do_normalize` إلى `True`.

image_std (`Union[float, list[float], tuple[float, ...]]`، *kwargs*، *اختياري*، القيمة الافتراضية هي `[0.5, 0.5, 0.5]`) : الانحراف المعياري للصورة المستخدم للتطبيع. لا يكون له أي تأثير إلا إذا تم تعيين `do_normalize` إلى `True`.

do_center_crop (`bool`, *kwargs*, *اختياري*, القيمة الافتراضية هي `True`) : ما إذا كان سيتم قص الصورة من المنتصف.

do_pad (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب إضافة حشوة إلى الصورة. يتم تنفيذ الحشوة إما إلى أكبر حجم في الدفعة أو إلى حجم مربع ثابت لكل صورة. تعتمد استراتيجية الحشوة الدقيقة على النموذج.

crop_size (`Annotated[int | list[int] | tuple[int, ...] | dict[str, int] | None, None]`، *kwargs*، القيمة الافتراضية `{'height' : 224, 'width': 224}`): حجم الصورة الناتجة بعد تطبيق `center_crop`.

data_format (`Union[str, ~image_utils.ChannelDimension]`، *kwargs*، *اختياري*) : يُدعم `ChannelDimension.FIRST` فقط. أُضيف من أجل التوافق مع المعالجات البطيئة.

input_data_format (`Union[str, ~image_utils.ChannelDimension]`، *kwargs*، *اختياري*) : تنسيق بُعد القناة للصورة المدخلة. إذا لم يتم ضبطه، يُستنتج تنسيق بُعد القناة من الصورة المدخلة. يمكن أن يكون أحد ما يلي: - `"channels_first"` أو `ChannelDimension.FIRST`: صورة بتنسيق (num_channels, height, width). - `"channels_last"` أو `ChannelDimension.LAST`: صورة بتنسيق (height, width, num_channels). - `"none"` أو `ChannelDimension.NONE`: صورة بتنسيق (height, width).

device (`Annotated[Union[str, torch.device, NoneType], None]`, *kwargs*) : الجهاز الذي تتم عليه معالجة مقاطع الفيديو. إذا لم يتم ضبطه، يُستنتج الجهاز من مقاطع الفيديو المدخلة.

do_sample_frames (`bool`، *kwargs*، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان يجب أخذ عينات من الإطارات من الفيديو قبل المعالجة أم معالجة الفيديو بالكامل.

video_metadata (`Annotated[~video_utils.VideoMetadata | dict | list[dict | ~video_utils.VideoMetadata] | list[list[dict | ~video_utils.VideoMetadata]] | None, None]`, *kwargs*) : بيانات وصفية للفيديو تتضمن معلومات عن المدة الإجمالية، ومعدل الإطارات في الثانية (fps)، وإجمالي عدد الإطارات. تُستخدم هذه البيانات لاختيار إطارات من الفيديو أو لحساب الطوابع الزمنية. لا تقم بتمرير أي بيانات وصفية إلا إذا كنت تحاول فك ترميز الفيديو يدوياً قبل المعالجة.

fps (`Annotated[int | float | None, None]`، *kwargs*) : عدد الإطارات المستهدفة التي يجب أخذ عينات منها في الثانية الواحدة عندما يكون `do_sample_frames=True`.

num_frames (`Annotated[int | None, None]`، *kwargs*) : الحد الأقصى لعدد الإطارات التي يجب أخذها كعينة عند تعيين `do_sample_frames=True`.

return_metadata (`bool`، *kwargs*، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان يجب إرجاع بيانات وصفية للفيديو أم لا. بيانات الوصفية للفيديو هي كائن يحتوي على معلومات حول مدة الفيديو، ومعدل الإطارات، وخلفية فك الترميز، وما إلى ذلك.

return_tensors (`Annotated[str | ~utils.generic.TensorType | None, None]`, *kwargs*) : إذا تم ضبطه، فسيُرجع تينسورات من إطار عمل محدد. القيم المقبولة هي: - `'pt'`: يُرجع كائنات `torch.Tensor` من PyTorch. - `'np'`: يُرجع كائنات `np.ndarray` من NumPy.

- ****kwargs** ([VideosKwargs](/docs/transformers/main/ar/main_classes/processors#transformers.VideosKwargs)، *اختياري*) : خيارات معالجة إضافية لكل نمط (نص، صور، مقاطع فيديو، صوت). تُدرج المعلمات الخاصة بالنموذج أعلاه؛ راجع فئة TypedDict للحصول على القائمة الكاملة للحجج المدعومة.

ينشئ معالج فيديو من نوع VivitVideoProcessor.

#### preprocess[[transformers.VivitVideoProcessor.preprocess]]

```python
preprocess(videos: typing.Union[list['PIL.Image.Image'], numpy.ndarray, ForwardRef('torch.Tensor'), list[numpy.ndarray], list['torch.Tensor'], list[list['PIL.Image.Image']], list[list[numpy.ndarray]], list[list['torch.Tensor']], transformers.video_utils.URL, list[transformers.video_utils.URL], list[list[transformers.video_utils.URL]], transformers.video_utils.Path, list[transformers.video_utils.Path], list[list[transformers.video_utils.Path]]], **kwargs: *<class 'transformers.processing_utils.VideosKwargs'>)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/video_processing_vivit.py#L49)

**المعاملات:**

videos (`Union[list[PIL.Image.Image], numpy.ndarray, torch.Tensor, list[numpy.ndarray], list[torch.Tensor], list[list[PIL.Image.Image]], list[list[numpy.ndarray]], list[list[torch.Tensor]], ~video_utils.URL, list[~video_utils.URL], list[list[~video_utils.URL]], ~video_utils.Path, list[~video_utils.Path], list[list[~video_utils.Path]]]`) : الفيديو الذي سيتم معالجته مسبقًا. يتوقع إدخال فيديو واحد أو دفعة من الفيديوهات بقيم بكسل تتراوح بين 0 و255. إذا كنت تمرر فيديوهات بقيم بكسل بين 0 و1، فاضبط `do_rescale=False`.

do_convert_rgb (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب تحويل الصورة إلى RGB.

do_resize (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب تغيير حجم الصورة.

size (`Annotated[int | list[int] | tuple[int, ...] | dict[str, int] | None, None]`, *kwargs*) : يصف الأبعاد القصوى للمدخلات إلى النموذج.

default_to_square (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب افتراض صورة مربعة عند تغيير الحجم، إذا كان الحجم عددًا صحيحًا.

resample (`Annotated[Union[int, PILImageResampling, NoneType], None]`, *kwargs*) : مرشح إعادة العينة المستخدم عند تغيير حجم الصورة. يمكن أن يكون أحد قيم enum `PILImageResampling`. لا يؤثر إلا إذا كان `do_resize` مضبوطاً على `True`.

do_rescale (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب إعادة تحجيم الصورة.

rescale_factor (`float`، *kwargs*، *اختياري*) : معامل إعادة التحجيم لإعادة تحجيم الصورة إذا كان `do_rescale` مضبوطًا على `True`.

do_normalize (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب تطبيع الصورة.

image_mean (`Union[float, list[float], tuple[float, ...]]`، *kwargs*، *اختياري*) : متوسط الصورة المستخدم للتطبيع. لا يكون له أي تأثير إلا إذا تم تعيين `do_normalize` إلى `True`.

image_std (`Union[float, list[float], tuple[float, ...]]`، *kwargs*، *اختياري*) : الانحراف المعياري للصورة المستخدم للتطبيع. لا يكون له أي تأثير إلا إذا تم تعيين `do_normalize` إلى `True`.

do_center_crop (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب قص الصورة من المنتصف.

do_pad (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب إضافة حشوة إلى الصورة. يتم تنفيذ الحشوة إما إلى أكبر حجم في الدفعة أو إلى حجم مربع ثابت لكل صورة. تعتمد استراتيجية الحشوة الدقيقة على النموذج.

crop_size (`Annotated[int | list[int] | tuple[int, ...] | dict[str, int] | None, None]`، *kwargs*) : حجم الصورة الناتجة بعد تطبيق `center_crop`.

data_format (`Union[str, ~image_utils.ChannelDimension]`، *kwargs*، *اختياري*) : يُدعم `ChannelDimension.FIRST` فقط. أُضيف من أجل التوافق مع المعالجات البطيئة.

input_data_format (`Union[str, ~image_utils.ChannelDimension]`، *kwargs*، *اختياري*) : تنسيق بُعد القناة للصورة المدخلة. إذا لم يتم ضبطه، يُستنتج تنسيق بُعد القناة من الصورة المدخلة. يمكن أن يكون أحد ما يلي: - `"channels_first"` أو `ChannelDimension.FIRST`: صورة بتنسيق (num_channels, height, width). - `"channels_last"` أو `ChannelDimension.LAST`: صورة بتنسيق (height, width, num_channels). - `"none"` أو `ChannelDimension.NONE`: صورة بتنسيق (height, width).

device (`Annotated[Union[str, torch.device, NoneType], None]`, *kwargs*) : الجهاز الذي تتم عليه معالجة مقاطع الفيديو. إذا لم يتم ضبطه، يُستنتج الجهاز من مقاطع الفيديو المدخلة.

do_sample_frames (`bool`، *kwargs*، *اختياري*) : ما إذا كان سيتم أخذ عينات من الإطارات من الفيديو قبل المعالجة أم معالجة الفيديو بالكامل.

video_metadata (`Annotated[~video_utils.VideoMetadata | dict | list[dict | ~video_utils.VideoMetadata] | list[list[dict | ~video_utils.VideoMetadata]] | None, None]`, *kwargs*) : بيانات وصفية للفيديو تتضمن معلومات عن المدة الإجمالية، ومعدل الإطارات في الثانية (fps)، وإجمالي عدد الإطارات. تُستخدم هذه البيانات لاختيار إطارات من الفيديو أو لحساب الطوابع الزمنية. لا تقم بتمرير أي بيانات وصفية إلا إذا كنت تحاول فك ترميز الفيديو يدوياً قبل المعالجة.

fps (`Annotated[int | float | None, None]`، *kwargs*) : عدد الإطارات المستهدفة التي يجب أخذ عينات منها في الثانية الواحدة عندما يكون `do_sample_frames=True`.

num_frames (`Annotated[int | None, None]`، *kwargs*) : الحد الأقصى لعدد الإطارات التي يجب أخذها كعينة عند تعيين `do_sample_frames=True`.

return_metadata (`bool`، *kwargs*، *اختياري*) : ما إذا كان يجب إرجاع بيانات وصفية للفيديو أم لا. بيانات الوصفية للفيديو هي كائن يحتوي على معلومات حول مدة الفيديو، ومعدل الإطارات، وخلفية فك الترميز، وما إلى ذلك.

return_tensors (`Annotated[str | ~utils.generic.TensorType | None, None]`, *kwargs*) : تُرجع توتنرات مكدّسة إذا كان الإعداد `'pt'`، وإلا تُرجع قائمة من التوتنرات.

**يعيد:** `~image_processing_base.BatchFeature`

- **data** (`dict`) -- قاموس من القوائم/المصفوفات/الموترات التي يعيدها أسلوب __call__ ('pixel_values'، وما إلى ذلك).
- **tensor_type** (`Union[None, str, TensorType]`، *اختياري*) -- يمكنك تحديد tensor_type هنا لتحويل قوائم الأعداد الصحيحة إلى تينسورات PyTorch/Numpy عند التهيئة.

## VivitModel[[transformers.VivitModel]]

#### transformers.VivitModel[[transformers.VivitModel]]

```python
transformers.VivitModel(config: VivitConfig, add_pooling_layer: bool = True)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/modeling_vivit.py#L318)

**المعاملات:**

config ([VivitConfig](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitConfig)) : فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. عند التهيئة باستخدام ملف إعدادات، لا يتم تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميل أوزان النموذج.

add_pooling_layer (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب إضافة طبقة تجميع

نموذج Vivit الأساسي الذي يُخرج حالات مخفية خام دون أي رأس محدد في الأعلى.

يرث هذا النموذج من [PreTrainedModel](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel). راجع توثيق الفئة الأصلية لمعرفة الطرق العامة التي تنفذها المكتبة لجميع نماذجها (مثل التنزيل أو الحفظ، وتغيير حجم تضمينات الإدخال، وقص الرؤوس، وما إلى ذلك).

هذا النموذج هو أيضاً فئة فرعية من [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) في PyTorch. استخدمه كوحدة PyTorch عادية، وارجع إلى توثيق PyTorch لكل ما يتعلق بالاستخدام العام والسلوك.

#### forward[[transformers.VivitModel.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, interpolate_pos_encoding: bool = False, attention_mask: typing.Optional[torch.Tensor] = None, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/modeling_vivit.py#L333)

**المعاملات:**

pixel_values (`torch.Tensor` من الشكل `(batch_size, num_channels, image_size, image_size)`، *اختياري*) : المصفوفات المقابلة للصور المدخلة. يمكن الحصول على قيم البكسل باستخدام [VivitImageProcessor](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitImageProcessor). راجع [VivitImageProcessor.__call__()](/docs/transformers/main/ar/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) للتفاصيل (`processor_class` يستخدم [VivitImageProcessor](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitImageProcessor) لمعالجة الصور).

interpolate_pos_encoding (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم استيفاء ترميزات المواقع المُدرَّبة مسبقًا.

attention_mask (`torch.Tensor` من الشكل `(batch_size, sequence_length)`، *اختياري*) : قناع لتجنب تنفيذ الانتباه على فهارس رموز الحشو. قيم القناع المختارة من `[0, 1]`: - 1 للرموز التي **ليست مقنّعة**، - 0 للرموز التي **مقنّعة**.  [ما هي أقنعة الانتباه؟](../glossary#attention-mask)

**يعيد:** [BaseModelOutputWithPooling](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.BaseModelOutputWithPooling) أو `tuple(torch.Tensor)`

[BaseModelOutputWithPooling](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.BaseModelOutputWithPooling) أو مجموعة مرتبة من `torch.Tensor` (في حال تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) تتكون من عناصر مختلفة اعتماداً على الإعداد ([VivitConfig](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitConfig)) والمدخلات.

تُعيد طريقة [VivitModel](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitModel) الخاصة بالتقديم (forward) تعريف الطريقة الخاصة `__call__`.

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

- **last_hidden_state** (`torch.Tensor` من الشكل `(batch_size, sequence_length, hidden_size)`) -- تسلسل من حالات الإخفاء (hidden-states) عند مخرج الطبقة الأخيرة من النموذج.
- **pooler_output** (`torch.Tensor` من الشكل `(batch_size, hidden_size)`) -- حالة الطبقة المخفية الأخيرة للرمز الأول في التسلسل (رمز التصنيف) بعد المعالجة الإضافية عبر الطبقات المستخدمة في مهمة ما قبل التدريب المساعدة. على سبيل المثال، بالنسبة لعائلة نماذج BERT، تُرجع هذه الخاصية رمز التصنيف بعد معالجته عبر طبقة خطية ودالة تفعيل tanh. يتم تدريب أوزان الطبقة الخطية من هدف التنبؤ بالجملة التالية (التصنيف) أثناء ما قبل التدريب.
- **hidden_states** (`tuple(torch.Tensor)`، *اختياري*، يُعاد عند تمرير `output_hidden_states=True` أو عند تعيين `config.output_hidden_states=True`) -- مجموعة من `torch.Tensor` (واحدة لمخرجات التضمينات، إذا كان النموذج يحتوي على طبقة تضمين، + واحدة لمخرجات كل طبقة) بأبعاد `(batch_size, sequence_length, hidden_size)`.

  حالات النموذج المخفية عند مخرج كل طبقة بالإضافة إلى مخرجات التضمين الأولي الاختيارية.
- **attentions** (`tuple(torch.Tensor)`، *اختياري*، يُعاد عند تمرير `output_attentions=True` أو عند تعيين `config.output_attentions=True`) -- مجموعة من `torch.Tensor` (واحدة لكل طبقة) بأبعاد `(batch_size, num_heads, sequence_length, sequence_length)`.

  أوزان الانتباه بعد تطبيق دالة softmax على الانتباه، وتُستخدم لحساب المتوسط الموزون في رؤوس الانتباه الذاتي.

أمثلة:

```python
>>> import av
>>> import numpy as np

>>> from transformers import VivitImageProcessor, VivitModel
>>> from huggingface_hub import hf_hub_download

>>> np.random.seed(0)

>>> def read_video_pyav(container, indices):
...     '''
...     Decode the video with PyAV decoder.
...     Args:
...         container (`av.container.input.InputContainer`): PyAV container.
...         indices (`list[int]`): List of frame indices to decode.
...     Returns:
...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
...     '''
...     frames = []
...     container.seek(0)
...     start_index = indices[0]
...     end_index = indices[-1]
...     for i, frame in enumerate(container.decode(video=0)):
...         if i > end_index:
...             break
...         if i >= start_index and i in indices:
...             frames.append(frame)
...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])

>>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
...     '''
...     Sample a given number of frame indices from the video.
...     Args:
...         clip_len (`int`): Total number of frames to sample.
...         frame_sample_rate (`int`): Sample every n-th frame.
...         seg_len (`int`): Maximum allowed index of sample's last frame.
...     Returns:
...         indices (`list[int]`): List of sampled frame indices
...     '''
...     converted_len = int(clip_len * frame_sample_rate)
...     end_idx = np.random.randint(converted_len, seg_len)
...     start_idx = end_idx - converted_len
...     indices = np.linspace(start_idx, end_idx, num=clip_len)
...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
...     return indices

>>> # video clip consists of 300 frames (10 seconds at 30 FPS)
>>> file_path = hf_hub_download(
...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
... )
>>> container = av.open(file_path)

>>> # sample 32 frames
>>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=1, seg_len=container.streams.video[0].frames)
>>> video = read_video_pyav(container=container, indices=indices)

>>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
>>> model = VivitModel.from_pretrained("google/vivit-b-16x2-kinetics400")

>>> # prepare video for the model
>>> inputs = image_processor(list(video), return_tensors="pt")

>>> # forward pass
>>> outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 3137, 768]
```

## VivitForVideoClassification[[transformers.VivitForVideoClassification]]

#### transformers.VivitForVideoClassification[[transformers.VivitForVideoClassification]]

```python
transformers.VivitForVideoClassification(config: VivitConfig)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/modeling_vivit.py#L447)

**المعاملات:**

config ([VivitConfig](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitConfig)) : فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. عند التهيئة باستخدام ملف إعدادات، لا يتم تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميل أوزان النموذج.

نموذج ViViT Transformer مع رأس تصنيف فيديو في الأعلى (طبقة خطية فوق الحالة المخفية النهائية لرمز [CLS])، على سبيل المثال، لـ Kinetics-400.

لاحظ أنه من الممكن ضبط ViT على صور بدقة أعلى من تلك التي تم تدريبها عليها، وذلك بإعداد `interpolate_pos_encoding` إلى `True` في استدعاء forward للنموذج. سيؤدي هذا إلى استيفاء ترميزات المواقع المُدرَّبة مسبقاً لتتوافق مع الدقة الأعلى.

يرث هذا النموذج من [PreTrainedModel](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel). راجع توثيق الفئة الأصلية لمعرفة الطرق العامة التي تنفذها المكتبة لجميع نماذجها (مثل التنزيل أو الحفظ، وتغيير حجم تضمينات الإدخال، وقص الرؤوس، وما إلى ذلك).

هذا النموذج هو أيضاً فئة فرعية من [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) في PyTorch. استخدمه كوحدة PyTorch عادية، وارجع إلى توثيق PyTorch لكل ما يتعلق بالاستخدام العام والسلوك.

#### forward[[transformers.VivitForVideoClassification.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, labels: typing.Optional[torch.LongTensor] = None, interpolate_pos_encoding: bool = False, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/vivit/modeling_vivit.py#L460)

**المعاملات:**

pixel_values (`torch.Tensor` من الشكل `(batch_size, num_channels, image_size, image_size)`، *اختياري*) : المصفوفات المقابلة لصور الإدخال. يمكن الحصول على قيم البكسل باستخدام [VivitImageProcessor](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitImageProcessor). راجع [VivitImageProcessor.__call__()](/docs/transformers/main/ar/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) للتفاصيل (`processor_class` يستخدم [VivitImageProcessor](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitImageProcessor) لمعالجة الصور).

labels (من نوع `torch.LongTensor` بأبعاد `(batch_size,)`، *اختياري*) : تسميات لحساب خسارة تصنيف/الانحدار للصور. يجب أن تكون الفهارس ضمن `[0, ..., config.num_labels - 1]`. إذا كان `config.num_labels == 1` يتم حساب خسارة الانحدار (خسارة متوسط المربع)، وإذا كان `config.num_labels > 1` يتم حساب خسارة التصنيف (الإنتروبيا المتقاطعة).

interpolate_pos_encoding (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كان سيتم استيفاء ترميزات المواقع المُدرَّبة مسبقًا.

**يعيد:** [ImageClassifierOutput](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.ImageClassifierOutput) أو `tuple(torch.Tensor)`

[ImageClassifierOutput](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.ImageClassifierOutput) أو مجموعة مرتبة من `torch.Tensor` (في حال تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) وتتضمن عناصر مختلفة اعتماداً على الإعداد ([VivitConfig](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitConfig)) والمدخلات.

تُعيد طريقة [VivitForVideoClassification](/docs/transformers/main/ar/model_doc/vivit#transformers.VivitForVideoClassification) الخاصة بالتقديم (forward) تعريف الطريقة الخاصة `__call__`.

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

- **loss** (`torch.Tensor` من الشكل `(1,)`, *اختياري*، يُعاد عند تقديم `labels`) -- خسارة التصنيف (أو الانحدار إذا كان config.num_labels==1).
- **logits** (`torch.Tensor` من الشكل `(batch_size, config.num_labels)`) -- درجات التصنيف (أو الانحدار إذا كان config.num_labels==1) (قبل SoftMax).
- **hidden_states** (`tuple(torch.Tensor)`, *اختياري*, يُعاد عند تمرير `output_hidden_states=True` أو عند `config.output_hidden_states=True`) -- مجموعة مرتبة من `torch.Tensor` (واحدة لمخرجات التضمينات، إذا كان النموذج يحتوي على طبقة تضمين، + واحدة لمخرجات كل مرحلة) بشكل `(batch_size, sequence_length, hidden_size)`. حالات مخفية (تُسمى أيضًا خرائط الميزات) للنموذج عند مخرجات كل مرحلة.
- **attentions** (`tuple(torch.Tensor)`, *اختياري*, يُعاد عند تمرير `output_attentions=True` أو عند `config.output_attentions=True`) -- مجموعة مرتبة (Tuple) من `torch.Tensor` (واحدة لكل طبقة) بأبعاد `(batch_size, num_heads, patch_size, sequence_length)`.

  أوزان الانتباه بعد تطبيق دالة softmax على الانتباه، وتُستخدم لحساب المتوسط الموزون في رؤوس الانتباه الذاتي.

أمثلة:

```python
>>> import av
>>> import numpy as np
>>> import torch

>>> from transformers import VivitImageProcessor, VivitForVideoClassification
>>> from huggingface_hub import hf_hub_download

>>> np.random.seed(0)

>>> def read_video_pyav(container, indices):
...     '''
...     Decode the video with PyAV decoder.
...     Args:
...         container (`av.container.input.InputContainer`): PyAV container.
...         indices (`list[int]`): List of frame indices to decode.
...     Returns:
...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
...     '''
...     frames = []
...     container.seek(0)
...     start_index = indices[0]
...     end_index = indices[-1]
...     for i, frame in enumerate(container.decode(video=0)):
...         if i > end_index:
...             break
...         if i >= start_index and i in indices:
...             frames.append(frame)
...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])

>>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
...     '''
...     Sample a given number of frame indices from the video.
...     Args:
...         clip_len (`int`): Total number of frames to sample.
...         frame_sample_rate (`int`): Sample every n-th frame.
...         seg_len (`int`): Maximum allowed index of sample's last frame.
...     Returns:
...         indices (`list[int]`): List of sampled frame indices
...     '''
...     converted_len = int(clip_len * frame_sample_rate)
...     end_idx = np.random.randint(converted_len, seg_len)
...     start_idx = end_idx - converted_len
...     indices = np.linspace(start_idx, end_idx, num=clip_len)
...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
...     return indices

>>> # video clip consists of 300 frames (10 seconds at 30 FPS)
>>> file_path = hf_hub_download(
...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
... )
>>> container = av.open(file_path)

>>> # sample 32 frames
>>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=4, seg_len=container.streams.video[0].frames)
>>> video = read_video_pyav(container=container, indices=indices)

>>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
>>> model = VivitForVideoClassification.from_pretrained("google/vivit-b-16x2-kinetics400")

>>> inputs = image_processor(list(video), return_tensors="pt")

>>> with torch.no_grad():
...     outputs = model(**inputs)
...     logits = outputs.logits

>>> # model predicts one of the 400 Kinetics-400 classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
LABEL_116
```

