# EoMT-DINOv3

  

## نظرة عامة

توسّع عائلة **EoMT-DINOv3** من بنية [Encoder-only Mask Transformer](eomt) باستخدام محولات الرؤية (Vision Transformers) التي تم تدريبها مسبقًا باستخدام [DINOv3](dinov3). يوفر هذا التحديث جودة تقطيع (Segmentation) أقوى عبر معايير ADE20K وCOCO، مع الحفاظ على التصميم القائم على المُشفِّر فقط (encoder-only) الذي جعل EoMT جذابة للتطبيقات الفورية.

مقارنةً بالنماذج القائمة على DINOv2، تستفيد نسخ DINOv3 من تضمينات المواقع الدوارة، ومكاتب MLP البوابة الاختيارية، وأحدث وصفات التدريب المسبق من Meta AI. تُسهم هذه التغييرات في تحقيق مكاسب أداء قابلة للقياس عبر مهام التقطيع الدلالي والمعياري والشامل، كما هو موضح في [مجموعة نماذج DINOv3](https://github.com/tue-mps/eomt/blob/master/model_zoo/dinov3.md).

طُرِحَت بنية EoMT الأصلية في ورقة CVPR 2025 المميزة *[Your ViT is Secretly an Image Segmentation Model](https://huggingface.co/papers/2503.19108)* التي كتبها Tommie Kerssies وNiccolò Cavagnero وAlexander Hermans وNarges Norouzi وGiuseppe Averta وBastian Leibe وGijs Dubbelman وDaan de Geus. وتحافظ ترقية DINOv3 على رأس التقطيع الخفيف نفسه واستراتيجية الاستدلال القائمة على الاستعلامات، مع استبدال المُشفِّر بنقاط تفتيش DINOv3 ViT.

نصائح:

* تُتيح الإعدادات ضبط معاملات خاصة بـ DINOv3 مثل `rope_theta` و`use_gated_mlp`. وتتوقع هياكل DINOv3 الكبيرة مثل `dinov3-vitg14` تعيين `use_gated_mlp=True`.
* يمكن لنماذج DINOv3 العمل على نطاق أوسع من الدقات بفضل تضمينات المواقع الدوارة. لا يزال معالج الصور يعتمد على القطع المربعة افتراضياً، لكن يمكن تقديم أحجام مخصصة عبر `AutoImageProcessor`.
* توفر نقاط التفتيش المُدرَّبة مسبقًا التي يستضيفها مختبر أنظمة الإدراك المحمول في جامعة TU/e أوزانًا دلتا يجب دمجها مع هياكل DINOv3 الأساسية. وتصف أدوات التحويل في [المستودع الرسمي](https://github.com/tue-mps/eomt) هذا سير العمل بالتفصيل.

تمت مساهمة هذا النموذج من قِبل [nielsr](https://huggingface.co/nielsr). يمكن العثور على الكود الأصلي [هنا](https://github.com/tue-mps/eomt).

## أمثلة على الاستخدام

فيما يلي مثال مبسط يوضح كيفية تشغيل التقطيع البانورامي باستخدام نموذج EoMT المدعوم من DINOv3. يمكن إعادة استخدام معالج الصور نفسه للتقطيع الدلالي أو التقطيع على مستوى الكائنات ببساطة عن طريق تبديل نقطة التفتيش.

```python
import requests
import torch
from PIL import Image

from transformers import AutoImageProcessor, AutoModelForUniversalSegmentation

model_id = "tue-mps/eomt-dinov3-coco-panoptic-base-640"
processor = AutoImageProcessor.from_pretrained(model_id)
model = AutoModelForUniversalSegmentation.from_pretrained(model_id, device_map="auto")

image = Image.open(requests.get("http://images.cocodataset.org/val2017/000000039769.jpg", stream=True).raw)

inputs = processor(images=image, return_tensors="pt").to(model.device)

with torch.inference_mode():
    outputs = model(**inputs)

segmentation = processor.post_process_panoptic_segmentation(outputs, target_sizes=[image.size[::-1]])[0]
list(segmentation.keys())
['segmentation', 'segments_info']
```

## EomtDinov3Config[[transformers.EomtDinov3Config]]

#### transformers.EomtDinov3Config[[transformers.EomtDinov3Config]]

```python
transformers.EomtDinov3Config(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, hidden_size: int = 1024, num_hidden_layers: int = 24, num_attention_heads: int = 16, hidden_act: str = 'gelu', hidden_dropout_prob: float | int = 0.0, initializer_range: float = 0.02, layer_norm_eps: float = 1e-06, image_size: int | list[int] | tuple[int, int] = 640, patch_size: int | list[int] | tuple[int, int] = 16, num_channels: int = 3, layerscale_value: float = 1.0, drop_path_rate: float | int = 0.0, num_upscale_blocks: int = 2, attention_dropout: float | int = 0.0, num_blocks: int = 4, no_object_weight: float = 0.1, class_weight: float = 2.0, mask_weight: float = 5.0, dice_weight: float = 5.0, train_num_points: int = 12544, oversample_ratio: float = 3.0, importance_sample_ratio: float = 0.75, num_queries: int = 200, num_register_tokens: int = 4, intermediate_size: int = 4096, rope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = None, query_bias: bool = True, key_bias: bool = False, value_bias: bool = True, proj_bias: bool = True, mlp_bias: bool = True, use_gated_mlp: bool = False, pos_embed_shift: float | None = None, pos_embed_jitter: float | None = None, pos_embed_rescale: float | None = 2.0)
```

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

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

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

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

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

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

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

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

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

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

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

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

layerscale_value (`float`، *اختياري*، القيمة الافتراضية 1.0) : القيمة الأولية لمعامل LayerScale.

drop_path_rate (`Union[float, int]`, *اختياري*, القيمة الافتراضية هي `0.0`) : معدل إسقاط المسار لدمج البقع.

num_upscale_blocks (`int`، *اختياري*، القيمة الافتراضية 2) : عدد كتل رفع العينة المستخدمة في فك الترميز أو رأس التقطيع.

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

num_blocks (`int`، *اختياري*، القيمة الافتراضية 4) : عدد كتل الميزات أو المراحل في البنية.

no_object_weight (`float`، *اختياري*، القيمة الافتراضية 0.1) : وزن الخسارة لفئة "لا يوجد كائن" في التقطيع البانورامي/المشهدي.

class_weight (`float`، *اختياري*، القيمة الافتراضية `2.0`) : الوزن النسبي لخطأ التصنيف في تكلفة المطابقة الهنغارية.

mask_weight (`float`، *اختياري*، القيمة الافتراضية `5.0`) : الوزن النسبي لخسارة التركيز (focal loss) في خسارة التقطيع البانورامي (panoptic segmentation).

dice_weight (`float`، *اختياري*، القيمة الافتراضية `5.0`) : الوزن النسبي لخسارة الدايك (dice loss) في خسارة التقطيع البانورامي (panoptic segmentation).

train_num_points (`int`، *اختياري*، القيمة الافتراضية 12544) : عدد النقاط التي يتم أخذ عينات منها لحساب خسارة القناع (mask loss) أثناء التدريب.

oversample_ratio (`float`، *اختياري*، القيمة الافتراضية 3.0) : نسبة الإفراط في العينة المستخدمة في أخذ العينات من النقاط لتدريب الأقنعة.

importance_sample_ratio (`float`، *اختياري*، القيمة الافتراضية 0.75) : نسبة النقاط التي يتم أخذها كعينة بناءً على الأهمية أثناء التدريب.

num_queries (`int`، *اختياري*، القيمة الافتراضية 200) : عدد استعلامات الكائنات في Transformer.

num_register_tokens (`int`، *اختياري*، القيمة الافتراضية 4) : عدد رموز التسجيل القابلة للتعلّم المضافة إلى مدخلات المحول.

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

rope_parameters (`Union[~modeling_rope_utils.RopeParameters, dict]`، *اختياري*) : قاموس يحتوي على معاملات التهيئة الخاصة بتضمينات RoPE. يجب أن يحتوي القاموس على قيمة لـ `rope_theta`، وبشكل اختياري معاملات تُستخدم للتوسيع في حال رغبتَ في استخدام RoPE مع `max_position_embeddings` أطول.

query_bias (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان سيتم استخدام الانحياز في إسقاط الاستعلام.

key_bias (`bool`، *اختياري*، الافتراضي `False`) : ما إذا كان سيتم استخدام الانحياز في الإسقاط الرئيسي.

value_bias (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان سيتم استخدام الانحياز في الإسقاط القيمي.

proj_bias (`bool`، *اختياري*، الافتراضي `True`) : ما إذا كان سيتم استخدام الانحياز في الإسقاط الخرجي.

mlp_bias (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان سيتم استخدام انحياز (bias) في طبقات up_proj و down_proj و gate_proj ضمن طبقات MLP.

use_gated_mlp (`bool`، *اختياري*، الافتراضي `False`) : ما إذا كان سيتم استخدام طبقات MLP ذات البوابات.

pos_embed_shift (`float`، *اختياري*) : قيمة الإزاحة لتضمينات المواقع.

pos_embed_jitter (`float`، *اختياري*) : قيمة الاهتزاز لتضمينات المواقع.

pos_embed_rescale (`float`، *اختياري*، القيمة الافتراضية 2.0) : قيمة إعادة التحجيم لتضمينات المواقع.

هذه فئة الإعدادات المخزنة لإعدادات نموذج Eomt Dinov3Model. تُستخدم لاستحداث نموذج Eomt Dinov3 وفقاً للحجج المحددة، مع تعريف بنية النموذج. إن استحداث إعدادات باستخدام القيم الافتراضية سيؤدي إلى إعدادات مشابهة لتلك الخاصة بـ [tue-mps/coco_panoptic_eomt_large_640_dinov3](https://huggingface.co/tue-mps/coco_panoptic_eomt_large_640_dinov3)

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

## EomtDinov3PreTrainedModel[[transformers.EomtDinov3PreTrainedModel]]

#### transformers.EomtDinov3PreTrainedModel[[transformers.EomtDinov3PreTrainedModel]]

```python
transformers.EomtDinov3PreTrainedModel(config: PreTrainedConfig, *inputs, **kwargs)
```

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

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

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

يرث هذا النموذج من [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.EomtDinov3PreTrainedModel.forward]]

```python
forward(*args, **kwargs)
```

قيمة وهمية لمسار منقّط (مثل `torch.float32`): سلاسل الوصول إلى السمات، والاستدعاءات تتصرف كمُزيّنات مُمرِّرة، و`repr` هو المسار المنقّط، وعند استخدامه كصنف أساسي يُستبدل بصنف أساسي من نوع `type` عادي (بموجب `__mro_entries__` في PEP 560)، بحيث تحتفظ الأصناف الفرعية الحقيقية بفئة ميتا عادية، وتقرأ `inspect.signature` دالة `__init__` الحقيقية الخاصة بها بدلاً من تلك الموجودة في القيمة الوهمية.

## EomtDinov3ForUniversalSegmentation[[transformers.EomtDinov3ForUniversalSegmentation]]

#### transformers.EomtDinov3ForUniversalSegmentation[[transformers.EomtDinov3ForUniversalSegmentation]]

```python
transformers.EomtDinov3ForUniversalSegmentation(config: EomtDinov3Config)
```

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

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

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

نموذج EoMT-DINOv3 مع رأس في الأعلى للتجزئة على مستوى الكائن/الدلالية/الشاملة.

يرث هذا النموذج من [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.EomtDinov3ForUniversalSegmentation.forward]]

```python
forward(pixel_values: Tensor, mask_labels: list[torch.Tensor] | None = None, class_labels: list[torch.Tensor] | None = None, patch_offsets: list[torch.Tensor] | None = None, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

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

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

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

mask_labels (`list[torch.Tensor]`، *اختياري*) : قائمة بوسمات القناع (mask labels) ذات الشكل `(num_labels, height, width)` لتغذية النموذج

class_labels (`list[torch.LongTensor]`، *اختياري*) : قائمة بوسوم الفئات المستهدفة ذات الشكل `(num_labels, height, width)` لتغذية النموذج. تحدد هذه القائمة وسم `mask_labels`، على سبيل المثال وسم `mask_labels[i][j]` إذا كان `class_labels[i][j]`.

patch_offsets (`list[torch.Tensor]`، *اختياري*) : قائمة من السجلات (tuples) تشير إلى فهرس الصورة والمواضع الابتدائية والنهائية للرقع (patches) لتجزئة الدلالات (semantic segmentation).

**يعيد:** `EomtDinov3ForUniversalSegmentationOutput` أو `tuple(torch.Tensor)`

A `EomtDinov3ForUniversalSegmentationOutput` or a tuple of `torch.Tensor` (if `return_dict=False` is passed or when `config.return_dict=False`) comprising various elements depending on the configuration ([EomtDinov3Config](/docs/transformers/main/ar/model_doc/eomt_dinov3#transformers.EomtDinov3Config)) and inputs.

تتجاوز طريقة [EomtDinov3ForUniversalSegmentation](/docs/transformers/main/ar/model_doc/eomt_dinov3#transformers.EomtDinov3ForUniversalSegmentation) الخاصة بالتقديم (forward) الطريقة الخاصة `__call__`.

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

- **loss** (`torch.Tensor`، *اختياري*) -- الخسارة المحسوبة، تُعاد عند وجود التسميات.
- **class_queries_logits** (`torch.Tensor`، *اختياري*) -- متجه ذو شكل `(batch_size, num_queries, num_labels + 1)` يمثل الفئات المقترحة لكل استعلام. لاحظ أن `+ 1` ضروري لأننا ندمج الفئة الفارغة.
- **masks_queries_logits** (`torch.Tensor`، *اختياري*) -- متجه ذو شكل `(batch_size, num_queries, height, width)` يمثل الأقنعة المقترحة لكل استعلام.
- **last_hidden_state** (`torch.Tensor` من الشكل `(batch_size, num_channels, height, width)`) -- حالات المخفية الأخيرة (خريطة الميزات النهائية) للطبقة الأخيرة.
- **hidden_states** (`tuple(torch.Tensor)`، *اختياري*، يُعاد عند تمرير `output_hidden_states=True` أو عند تعيين `config.output_hidden_states=True`) -- مجموعة من `torch.Tensor` (واحدة لإخراج التضمينات + واحدة لإخراج كل مرحلة) بأبعاد `(batch_size, sequence_length, hidden_size)`. حالات مخفية لجميع طبقات النموذج.
- **attentions** (`tuple(tuple(torch.Tensor))`، *اختياري*، يُعاد عند تمرير `output_attentions=True` أو عند تعيين `config.output_attentions=True`) -- مجموعة من `tuple(torch.Tensor)` (واحدة لكل طبقة) بأبعاد `(batch_size, num_heads, sequence_length, sequence_length)`. أوزان الانتباه الذاتي والتقاطعي من فاحش التحويل (transformer decoder).
- **patch_offsets** (`list[torch.Tensor]`، *اختياري*) -- قائمة من السلاسل (tuples) تشير إلى فهرس الصورة ومواقع بداية ونهاية البقع (patches) للتجزئة الدلالية.

