# OmDet-Turbo

## نظرة عامة

قُدِّم نموذج OmDet-Turbo في [Real-time Transformer-based Open-Vocabulary Detection with Efficient Fusion Head](https://huggingface.co/papers/2403.06892) من قِبل Tiancheng Zhao وPeng Liu وXuan He وLu Zhang وKyusong Lee. يدمج OmDet-Turbo مكوّنات من RT-DETR ويقدّم وحدة اندماج متعددة الوسائط سريعة لتحقيق قدرات كشف كائنات مفتوحة المفردات في الوقت الفعلي مع الحفاظ على دقة عالية. يحقق النموذج الأساسي أداءً يصل إلى 100.2 إطار في الثانية و53.4 AP على COCO zero-shot.

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

*أظهرت كاشفات التحويل (DETRs) القائمة على التحويلات أداءً استثنائيًا في مهام كشف الكائنات ذات المجموعة المغلقة ومهام كشف الكائنات ذات المفردات المفتوحة (OVD) من خلال دمج أنماط اللغة. ومع ذلك، فإن متطلباتها الحسابية المكثفة عرقلت تطبيقها العملي في سيناريوهات كشف الكائنات في الوقت الفعلي (OD). في هذه الورقة، نفحص حدود نموذجين رائدين في معيار OVDEval، وهما OmDet وGrounding-DINO، ونقدم OmDet-Turbo. يتميز هذا النموذج الجديد لكشف الكائنات في الوقت الفعلي والقائم على التحويلات بوحدة رأس دمج فعّال (EFH) مبتكرة مصممة للتخفيف من الاختناقات المرصودة في OmDet وGrounding-DINO. ومن الجدير بالذكر أن OmDet-Turbo-Base يحقق 100.2 إطارًا في الثانية (FPS) عند تطبيق تقنيات TensorRT وتخزين اللغة المؤقت. ومن الجدير بالذكر أيضًا أنه في سيناريوهات الصفرية على مجموعات بيانات COCO وLVIS، يحقق OmDet-Turbo مستويات أداء تكاد تكون على قدم المساواة مع أحدث النماذج المُشرَفة حاليًا. علاوة على ذلك، فإنه يحدد معايير جديدة لأحدث التقنيات على ODinW وOVDEval، حيث يبلغ AP 30.1 وNMS-AP 26.86 على التوالي. وتُبرز عملية OmDet-Turbo في التطبيقات الصناعية من خلال أدائه الاستثنائي على مجموعات البيانات المرجعية وسرعة الاستدلال المتفوقة، مما يجعله خيارًا جذابًا لمهام كشف الكائنات في الوقت الفعلي.*

 نظرة عامة على بنية OmDet-Turbo. مأخوذة من الورقة الأصلية.

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

## نصائح للاستخدام

من الخصائص الفريدة لـ OmDet-Turbo مقارنةً بنماذج كشف الأشياء بدون تدريب مسبق أخرى، مثل [Grounding DINO](grounding-dino)، هي بنية التضمين المفصولة للفئات والأوامر النصية التي تتيح تخزين التضمينات النصية مؤقتًا. وهذا يعني أن النموذج يحتاج إلى كلا المدخلين: الفئات والمهمة، حيث تكون الفئات قائمةً بالأشياء التي نرغب في كشفها، والمهمة هي النص المرتبط بالواقع المستخدم لتوجيه عملية الكشف مفتوح المفردات. تقتصر هذه الطريقة على نطاق الكشف مفتوح المفردات وتجعل عملية فك الترميز أسرع.

يُستخدم [OmDetTurboProcessor](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor) لتحضير ثلاثية الفئات والمهمة والصورة. مدخل المهمة اختياري، وعند عدم تقديمه، يكون الافتراضي `"Detect [class1], [class2], [class3], ..."`. لمعالجة النتائج من النموذج، يمكن استخدام `post_process_grounded_object_detection` من [OmDetTurboProcessor](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor). ومن اللافت أن هذه الدالة تستقبل الفئات المدخلة، فبخلاف نماذج كشف الكائنات بدون تدريب الأخرى، يعني فصل ترميزات الفئات عن ترميزات المهمة أنه لا حاجة إلى فك ترميز الترميزات المتوقعة للفئات في خطوة ما بعد المعالجة، ويمكن مطابقة الفئات المتوقعة مع الفئات المدخلة مباشرة.

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

### استدلال صورة واحدة

إليك كيفية تحميل النموذج وتجهيز المدخلات لتنفيذ كشف الأشياء بدون تدريب على صورة واحدة:

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

from transformers import AutoProcessor, OmDetTurboForObjectDetection

processor = AutoProcessor.from_pretrained("omlab/omdet-turbo-swin-tiny-hf")
model = OmDetTurboForObjectDetection.from_pretrained("omlab/omdet-turbo-swin-tiny-hf", device_map="auto")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text_labels = ["cat", "remote"]
inputs = processor(image, text=text_labels, return_tensors="pt").to(model.device)

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

# convert outputs (bounding boxes and class logits)
results = processor.post_process_grounded_object_detection(
    outputs,
    target_sizes=[(image.height, image.width)],
    text_labels=text_labels,
    threshold=0.3,
    nms_threshold=0.3,
)
result = results[0]
boxes, scores, text_labels = result["boxes"], result["scores"], result["text_labels"]
for box, score, text_label in zip(boxes, scores, text_labels):
    box = [round(i, 2) for i in box.tolist()]
    print(f"Detected {text_label} with confidence {round(score.item(), 3)} at location {box}")
Detected remote with confidence 0.768 at location [39.89, 70.35, 176.74, 118.04]
Detected cat with confidence 0.72 at location [11.6, 54.19, 314.8, 473.95]
Detected remote with confidence 0.563 at location [333.38, 75.77, 370.7, 187.03]
Detected cat with confidence 0.552 at location [345.15, 23.95, 639.75, 371.67]
```

### الاستدلال على صور متعددة

يمكن لـ OmDet-Turbo تنفيذ الاستدلال على عدة صور دفعة واحدة، مع دعم أوامر نصية وفئات مختلفة في نفس الدفعة:

```python
import torch
import requests
from io import BytesIO
from PIL import Image
from transformers import AutoProcessor, OmDetTurboForObjectDetection

processor = AutoProcessor.from_pretrained("omlab/omdet-turbo-swin-tiny-hf")
model = OmDetTurboForObjectDetection.from_pretrained("omlab/omdet-turbo-swin-tiny-hf", device_map="auto")

url1 = "http://images.cocodataset.org/val2017/000000039769.jpg"
image1 = Image.open(BytesIO(requests.get(url1).content)).convert("RGB")
text_labels1 = ["cat", "remote"]
task1 = "Detect {}.".format(", ".join(text_labels1))

url2 = "http://images.cocodataset.org/train2017/000000257813.jpg"
image2 = Image.open(BytesIO(requests.get(url2).content)).convert("RGB")
text_labels2 = ["boat"]
task2 = "Detect everything that looks like a boat."

url3 = "https://huggingface.co/datasets/hf-internal-testing/transformers-synthetic-assets/resolve/main/images/statue_of_liberty.jpg"
image3 = Image.open(BytesIO(requests.get(url3).content)).convert("RGB")
text_labels3 = ["statue", "trees"]
task3 = "Focus on the foreground, detect statue and trees."

inputs = processor(
    images=[image1, image2, image3],
    text=[text_labels1, text_labels2, text_labels3],
    task=[task1, task2, task3],
    return_tensors="pt",
)

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

# convert outputs (bounding boxes and class logits)
results = processor.post_process_grounded_object_detection(
    outputs,
    text_labels=[text_labels1, text_labels2, text_labels3],
    target_sizes=[(image.height, image.width) for image in [image1, image2, image3]],
    threshold=0.2,
    nms_threshold=0.3,
)

for i, result in enumerate(results):
    for score, text_label, box in zip(
        result["scores"], result["text_labels"], result["boxes"]
    ):
        box = [round(i, 1) for i in box.tolist()]
        print(
            f"Detected {text_label} with confidence "
            f"{round(score.item(), 2)} at location {box} in image {i}"
        )
Detected remote with confidence 0.77 at location [39.9, 70.4, 176.7, 118.0] in image 0
Detected cat with confidence 0.72 at location [11.6, 54.2, 314.8, 474.0] in image 0
Detected remote with confidence 0.56 at location [333.4, 75.8, 370.7, 187.0] in image 0
Detected cat with confidence 0.55 at location [345.2, 24.0, 639.8, 371.7] in image 0
Detected boat with confidence 0.32 at location [146.9, 219.8, 209.6, 250.7] in image 1
Detected boat with confidence 0.3 at location [319.1, 223.2, 403.2, 238.4] in image 1
Detected boat with confidence 0.27 at location [37.7, 220.3, 84.0, 235.9] in image 1
Detected boat with confidence 0.22 at location [407.9, 207.0, 441.7, 220.2] in image 1
Detected statue with confidence 0.73 at location [544.7, 210.2, 651.9, 502.8] in image 2
Detected trees with confidence 0.25 at location [3.9, 584.3, 391.4, 785.6] in image 2
Detected trees with confidence 0.25 at location [1.4, 621.2, 118.2, 787.8] in image 2
Detected statue with confidence 0.2 at location [428.1, 205.5, 767.3, 759.5] in image 2

```

## OmDetTurboConfig[[transformers.OmDetTurboConfig]]

#### transformers.OmDetTurboConfig[[transformers.OmDetTurboConfig]]

```python
transformers.OmDetTurboConfig(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, 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, is_encoder_decoder: bool = True, text_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, backbone_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, apply_layernorm_after_vision_backbone: bool = True, image_size: int | list[int] | tuple[int, int] = 640, disable_custom_kernels: bool = False, layer_norm_eps: float = 1e-05, batch_norm_eps: float = 1e-05, init_std: float = 0.02, text_projection_in_dim: int = 512, text_projection_out_dim: int = 512, task_encoder_hidden_dim: int = 1024, class_embed_dim: int = 512, class_distance_type: typing.Literal['cosine', 'dot'] = 'cosine', num_queries: int = 900, csp_activation: str = 'silu', conv_norm_activation: str = 'gelu', encoder_feedforward_activation: str = 'relu', encoder_feedforward_dropout: float | int = 0.0, encoder_dropout: float | int = 0.0, hidden_expansion: int = 1, encoder_hidden_dim: int = 256, vision_features_channels: list[int] | tuple[int, ...] = (256, 256, 256), encoder_in_channels: list[int] | tuple[int, ...] = (192, 384, 768), encoder_projection_indices: list[int] | tuple[int, ...] = (2,), encoder_attention_heads: int = 8, encoder_dim_feedforward: int = 2048, encoder_layers: int = 1, positional_encoding_temperature: int = 10000, num_feature_levels: int = 3, decoder_hidden_dim: int = 256, decoder_num_heads: int = 8, decoder_num_layers: int = 6, decoder_activation: str = 'relu', decoder_dim_feedforward: int = 2048, decoder_num_points: int = 4, decoder_dropout: float | int = 0.0, eval_size: int | None = None, learn_initial_query: bool = False, cache_size: int = 100)
```

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

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

is_encoder_decoder (`bool`، *اختياري*، الافتراضي هو `True`) : ما إذا كان النموذج يُستخدم كمُشفِّر/مُفكِّك أم لا.

text_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`، *اختياري*) : كائن الإعداد أو قاموس العمود الفقري النصي.

backbone_config (`Union[dict, ~configuration_utils.PreTrainedConfig]`، *اختياري*) : إعدادات نموذج الهيكل الأساسي.

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

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

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

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

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

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

text_projection_in_dim (`int`، *اختياري*، القيمة الافتراضية 512) : بُعد الإدخال للتحويل النصي.

text_projection_out_dim (`int`، *اختياري*، القيمة الافتراضية 512) : بُعد المخرج للتحويل النصي.

task_encoder_hidden_dim (`int`، *اختياري*، القيمة الافتراضية 1024) : بُعد التغذية الأمامية لمشفّر المهمة.

class_embed_dim (`int`، *اختياري*، القيمة الافتراضية 512) : بُعد تضمينات الفئات.

class_distance_type (`str`، *اختياري*، القيمة الافتراضية `"cosine"`) : نوع المسافة المقارنة بين الفئات المتوقعة وتضمينات الفئات المُسقطَة. يمكن أن يكون `"cosine"` أو `"dot"`.

num_queries (`int`، *اختياري*، القيمة الافتراضية 900) : عدد الاستعلامات.

csp_activation (`str`، *اختياري*، القيمة الافتراضية `"silu"`) : دالة التنشيط لشبكات Cross Stage Partial (CSP) في المُشفِّر.

conv_norm_activation (`str`، *اختياري*، القيمة الافتراضية `"gelu"`) : دالة التنشيط لطبقات ConvNormLayer في المُشفِّر.

encoder_feedforward_activation (`str`، *اختياري*، القيمة الافتراضية `"relu"`) : دالة التنشيط للشبكة الأمامية (feedforward) في المُشفِّر.

encoder_feedforward_dropout (`float`، *اختياري*، القيمة الافتراضية 0.0) : معدل الإسقاط (dropout) الذي يلي تفعيل شبكة التغذية الأمامية في المُشفِّر.

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

hidden_expansion (`int`، *اختياري*، القيمة الافتراضية 1) : التوسيع الخفي لشبكات CSP في المُشفِّر.

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

vision_features_channels (`tuple(int)`، *اختياري*، القيمة الافتراضية `[256, 256, 256]`) : قنوات ميزات الرؤية المُساقطة المستخدمة كمدخلات لفك الترميز.

encoder_in_channels (`List(int)`، *اختياري*، القيمة الافتراضية `[192, 384, 768]`) : قنوات الإدخال للمُشفِّر.

encoder_projection_indices (`List(int)`، *اختياري*، القيمة الافتراضية `[2]`) : فهارس ميزات الإدخال التي تُسقطها كل طبقة.

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

encoder_dim_feedforward (`int`، *اختياري*، القيمة الافتراضية 2048) : بُعد التغذية الأمامية (feedforward) للترميز.

encoder_layers (`int`، *اختياري*، القيمة الافتراضية `1`) : عدد الطبقات المخفية في مُشفِّر Transformer. سيستخدم القيمة نفسها لـ`num_layers` إذا لم يتم ضبطه.

positional_encoding_temperature (`int`، *اختياري*، القيمة الافتراضية 10000) : درجة حرارة الترميز الموضعي في المُشفِّر.

num_feature_levels (`int`، *اختياري*، القيمة الافتراضية 3) : عدد مستويات الميزات لوحدة الانتباه القابل للتشوه متعددة المقاييس في وحدة فك الترميز.

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

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

decoder_num_layers (`int`، *اختياري*، القيمة الافتراضية `6`) : عدد الطبقات المخفية في مُفكِّك Transformer. سيستخدم القيمة نفسها لـ`num_layers` إذا لم يتم ضبطه.

decoder_activation (`str`، *اختياري*، القيمة الافتراضية `"relu"`) : دالة التنشيط الخاصة بفك الترميز.

decoder_dim_feedforward (`int`، *اختياري*، القيمة الافتراضية 2048) : بُعد التغذية الأمامية (feedforward) لفك الترميز.

decoder_num_points (`int`، *اختياري*، القيمة الافتراضية 4) : عدد النقاط المُستخرجة في وحدة الانتباه التشوّهية متعددة المقاييس في المُفكّك.

decoder_dropout (`float`، *اختياري*، القيمة الافتراضية 0.0) : معدل الإسقاط (dropout) لفك الترميز.

eval_size (`tuple[int, int]`، *اختياري*) : الارتفاع والعرض المستخدمان لحساب الارتفاع والعرض الفعليين لتضمينات المواقع بعد مراعاة الخطوة (انظر RTDetr).

learn_initial_query (`bool`، *اختياري*، الافتراضي `False`) : ما إذا كان سيتم تعلّم الاستعلام الأولي.

cache_size (`int`، *اختياري*، القيمة الافتراضية 100) : حجم ذاكرة التخزين المؤقت للفئات والأوامر.

هذه فئة الإعدادات المخزنة لإعدادات نموذج Omdet TurboModel. تُستخدم لاستحداث نموذج Omdet Turbo وفقاً للحجج المحددة، مع تعريف بنية النموذج. إن استحداث إعدادات باستخدام القيم الافتراضية سيؤدي إلى إعدادات مشابهة لتلك الخاصة بـ [omlab/omdet-turbo-swin-tiny-hf](https://huggingface.co/omlab/omdet-turbo-swin-tiny-hf)

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

أمثلة:

```python
>>> from transformers import OmDetTurboConfig, OmDetTurboForObjectDetection

>>> # Initializing a OmDet-Turbo omlab/omdet-turbo-swin-tiny-hf style configuration
>>> configuration = OmDetTurboConfig()

>>> # Initializing a model (with random weights) from the omlab/omdet-turbo-swin-tiny-hf style configuration
>>> model = OmDetTurboForObjectDetection(configuration)

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

## OmDetTurboProcessor[[transformers.OmDetTurboProcessor]]

#### transformers.OmDetTurboProcessor[[transformers.OmDetTurboProcessor]]

```python
transformers.OmDetTurboProcessor(image_processor, tokenizer)
```

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

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

image_processor (`DetrImageProcessor`) : مُعالج الصور هو مدخل مطلوب.

tokenizer (`CLIPTokenizer`) : مُجزِّئ الرموز هو مدخل مطلوب.

ينشئ OmDetTurboProcessor الذي يجمع معالج الصور ومعالج الرموز في معالج واحد.

يوفر [OmDetTurboProcessor](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor) جميع وظائف [DetrImageProcessor](/docs/transformers/main/ar/model_doc/detr#transformers.DetrImageProcessor) و[CLIPTokenizer](/docs/transformers/main/ar/model_doc/clip#transformers.CLIPTokenizer). راجع [~DetrImageProcessor](/docs/transformers/main/ar/model_doc/detr#transformers.DetrImageProcessor) و[~CLIPTokenizer](/docs/transformers/main/ar/model_doc/clip#transformers.CLIPTokenizer) لمزيد من المعلومات.

#### __call__[[transformers.OmDetTurboProcessor.__call__]]

```python
__call__(images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor'], NoneType] = None, text: list[str] | list[list[str]] | None = None, **kwargs: *<class 'transformers.models.omdet_turbo.processing_omdet_turbo.OmDetTurboProcessorKwargs'>)
```

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

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

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

text (`Union[list[str], list[list[str]]]`، *اختياري*) : التسلسل أو الدفعة من التسلسلات المراد ترميزها. يمكن أن يكون كل تسلسل نصًا أو قائمة من النصوص (نص مُقسَّم مسبقًا). إذا مررت مدخلًا مُقسَّمًا مسبقًا، فاضبط `is_split_into_words=True` لتجنب الغموض مع المدخلات المُجمَّعة.

task (`str`، *kwargs*، `list[str]`، `TextInput`، أو `PreTokenizedInput`، *اختياري*) : وصف مهمة الكشف الذي سيتم ترميزه. إذا لم يُقدَّم، يتم توليد وصف مهمة افتراضي من مدخل `text` (مثلًا: "Detect {text}."). يمكن أن يكون نصًا واحدًا، أو قائمة من النصوص (واحد لكل صورة)، أو مدخلًا مُرمَّزًا مسبقًا. يوجّه وصف المهمة النموذج حول الكائنات التي يجب اكتشافها في الصور.

return_tensors (`str` أو [TensorType](/docs/transformers/main/ar/internal/file_utils#transformers.TensorType)، *اختياري*) : إذا تم تعيينه، فسيُرجع تينسورات من إطار عمل محدد. القيم المقبولة هي:  - `'pt'`: يُرجع كائنات `torch.Tensor` من PyTorch. - `'np'`: يُرجع كائنات `np.ndarray` من NumPy.

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

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

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

#### post_process_grounded_object_detection[[transformers.OmDetTurboProcessor.post_process_grounded_object_detection]]

```python
post_process_grounded_object_detection(outputs: OmDetTurboObjectDetectionOutput, text_labels: list[str] | list[list[str]] | None = None, threshold: float = 0.3, nms_threshold: float = 0.5, target_sizes: transformers.utils.generic.TensorType | list[tuple] | None = None, max_num_det: int | None = None)
```

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

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

outputs (`OmDetTurboObjectDetectionOutput`) : المخرجات الخام للنموذج.

text_labels (Union[list[str], list[list[str]]], *اختياري*) : أسماء الفئات المدخلة. إذا لم تُقدَّم، فسيتم تعيين `text_labels` إلى `None` في `outputs`.

threshold (float، القيمة الافتراضية 0.3) : إرجاع الاكتشافات التي تتجاوز درجة ثقتها هذا الحد الأدنى فقط.

nms_threshold (float، القيمة الافتراضية 0.5) : العتبة المستخدمة لكبت العلب غير القصوى. القيمة ضمن [0, 1].

target_sizes (`torch.Tensor` أو `list[tuple[int, int]]`، *اختياري*) : متجه (Tensor) بأبعاد `(batch_size, 2)` أو قائمة من الأزواج (`tuple[int, int]`) تحتوي على الحجم المستهدف `(height, width)` لكل صورة في الدفعة. إذا لم يتم تعيينه، فلن يتم تغيير حجم التنبؤات.

max_num_det (`int`، *اختياري*) : الحد الأقصى لعدد الاكتشافات التي يجب إرجاعها.

**يعيد:** `list[Dict]`

قائمة من القواميس، حيث يحتوي كل قاموس على الدرجات والفئات والصنادعات الخاصة بصورة في الدفعة كما تتنبأ بها النموذج.

يحوّل المخرجات الخام لـ [OmDetTurboForObjectDetection](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboForObjectDetection) إلى صناديق حدود نهائية بصيغة (top_left_x, top_left_y, bottom_right_x, bottom_right_y) ويحصل على فئة النص المرتبطة بها.

## OmDetTurboForObjectDetection[[transformers.OmDetTurboForObjectDetection]]

#### transformers.OmDetTurboForObjectDetection[[transformers.OmDetTurboForObjectDetection]]

```python
transformers.OmDetTurboForObjectDetection(config: OmDetTurboConfig)
```

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

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

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

نموذج OmDetTurbo (المكوّن من عمود فقري للرؤية وعمود فقري للنص، وبهيكلة مشفّر-مفكّك) يُخرج صناديق الإحاطة ودرجات الفئات لمهام مثل كشف COCO.

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

```python
forward(pixel_values: Tensor, classes_input_ids: LongTensor, classes_attention_mask: LongTensor, tasks_input_ids: LongTensor, tasks_attention_mask: LongTensor, classes_structure: LongTensor, labels: typing.Optional[torch.LongTensor] = None, output_attentions: bool | None = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

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

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

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

classes_input_ids (`torch.LongTensor` من الشكل `(total_classes (>= batch_size), sequence_length)`) : فهارس رموز تسلسل فئات الإدخال في مفردات نموذج اللغة. يمكن تقديم عدة فئات لكل مهمة، وبالتالي يتم تسطيح الفئات المُرمّزة، ويتم تقديم بنية الفئات في الحجة `classes_structure`. يمكن الحصول على الفهارس باستخدام [OmDetTurboProcessor](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor). راجع [OmDetTurboProcessor.__call__()](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor.__call__) للتفاصيل. [ما هي معرّفات الإدخال؟](../glossary#input-ids)

classes_attention_mask (`torch.BoolTensor` من الشكل `(total_classes (>= batch_size), num_classes, sequence_length)`) : قناع الانتباه (Attention mask) للفئات. هذا قناع ثنائي (binary mask) يُظهر أي الرموز (tokens) يجب الانتباه إليها، وأيها يجب تجاهلها.

tasks_input_ids (`torch.LongTensor` من الشكل `(batch_size, sequence_length)`) : فهارس رموز تسلسل مهام الإدخال في مفردات نموذج اللغة. يمكن الحصول على الفهارس باستخدام [OmDetTurboProcessor](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor). راجع [OmDetTurboProcessor.__call__()](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboProcessor.__call__) للتفاصيل. [ما هي معرّفات الإدخال؟](../glossary#input-ids)

tasks_attention_mask (`torch.BoolTensor` من الشكل `(batch_size, sequence_length)`) : قناع الانتباه للمهام. هذا قناع ثنائي يحدد الرموز التي يجب الانتباه إليها، والتي يجب عدم الانتباه إليها.

classes_structure (`torch.LongTensor` من الشكل `(batch_size)`) : بنية الفئات. يشير هذا المصفوف إلى عدد الفئات لكل مهمة.

labels (`list[Dict]` بطول `(batch_size,)`، *اختياري*) : تسميات لحساب خسارة المطابقة الثنائية. قائمة من القواميس، يحتوي كل قاموس على الأقل على المفتاحين التاليين: 'class_labels' و 'boxes' (تسميات الفئات وصناديق الحدود لصورة في الدفعة على التوالي). يجب أن تكون تسميات الفئات نفسها `torch.LongTensor` بطول `(number of bounding boxes in the image,)` وأن تكون الصناديق `torch.Tensor` بشكل `(number of bounding boxes in the image, 4)`.

output_attentions (`bool`، *اختياري*) : ما إذا كان سيتم إرجاع مصفوفات الانتباه لجميع طبقات الانتباه. راجع `attentions` ضمن المصفوفات المُرجعة لمزيد من التفاصيل.

output_hidden_states (`bool`, *اختياري*) : ما إذا كان سيتم إرجاع الحالات المخفية لجميع الطبقات. راجع `hidden_states` ضمن الموترات المُرجعة لمزيد من التفاصيل.

return_dict (`bool`، *اختياري*) : ما إذا كان سيتم إرجاع [ModelOutput](/docs/transformers/main/ar/main_classes/output#transformers.utils.ModelOutput) بدلاً من tuple عادي.

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

`OmDetTurboObjectDetectionOutput` أو مجموعة مرتبة من `torch.Tensor` (إذا تم تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) وتتضمن عناصر مختلفة اعتماداً على الإعداد ([OmDetTurboConfig](/docs/transformers/main/ar/model_doc/omdet-turbo#transformers.OmDetTurboConfig)) والمدخلات.

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

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

- **loss** (`torch.Tensor`، *اختياري*) -- قيمة الخسارة.
- **decoder_coord_logits** (`torch.Tensor` من الشكل `(batch_size, num_queries, 4)`) -- إحداثيات اللوجيتات المتوقعة للأشياء.
- **decoder_class_logits** (`torch.Tensor` من الشكل `(batch_size, num_queries, num_classes)`) -- الفئة المتوقعة للكائنات.
- **init_reference_points** (`torch.Tensor` من الشكل `(batch_size, num_queries, 4)`) -- نقاط المرجع الأولية.
- **intermediate_reference_points** (`tuple[tuple[torch.Tensor]]`، *اختياري*) -- نقاط المرجع الوسيطة.
- **encoder_coord_logits** (`torch.Tensor` من الشكل `(batch_size, num_queries, 4)`) -- إحداثيات الكائنات المتوقعة من المُشفِّر.
- **encoder_class_logits** (`tuple[torch.Tensor]`، *اختياري*) -- فئة الكائنات المتوقعة من المُشفِّر.
- **encoder_extracted_states** (`torch.Tensor`، *اختياري*) -- الحالات المستخرجة من شبكة هرم الميزات (FPN) وشبكة تجميع المسارات (PAN) في المُشفِّر.
- **decoder_hidden_states** (`tuple[torch.Tensor]`، *اختياري*) -- مجموعة من `torch.Tensor` (واحدة لإخراج التضمينات + واحدة لإخراج كل طبقة) من الشكل `(batch_size, sequence_length, hidden_size)`. حالات الإخفاء للنموذج عند إخراج كل طبقة بالإضافة إلى إخراجات التضمين الأولية.
- **decoder_attentions** (`tuple[tuple[torch.Tensor]]`، *اختياري*) -- مجموعة من المجموعات من `torch.Tensor` (واحدة لكل طبقة من طبقات الانتباه) بأبعاد `(batch_size, num_heads, sequence_length, sequence_length)`. أوزان الانتباه بعد تطبيق softmax على الانتباه، وتُستخدم لحساب المتوسط المرجح في رؤوس الانتباه الذاتي، والانتباه المتقاطع، والانتباه التشوّهي متعدد المقاييس.
- **encoder_hidden_states** (`tuple[torch.Tensor]`، *اختياري*) -- مجموعة من `torch.Tensor` (واحدة لمخرجات التضمينات + واحدة لمخرجات كل طبقة) بأبعاد `(batch_size, sequence_length, hidden_size)`. حالات الإخفاء للنموذج عند مخرجات كل طبقة بالإضافة إلى مخرجات التضمين الأولية.
- **encoder_attentions** (`tuple[tuple[torch.Tensor]]`، *اختياري*) -- مجموعة من المجموعات من `torch.Tensor` (واحدة لكل طبقة من أوزان الانتباه) بأبعاد `(batch_size, num_heads, sequence_length, sequence_length)`. أوزان الانتباه بعد تطبيق softmax على الانتباه، وتُستخدم لحساب المتوسط المرجح في رؤوس الانتباه الذاتي، والانتباه المتقاطع، والانتباه التشوّهي متعدد المقاييس.
- **classes_structure** (`torch.LongTensor`، *اختياري*) -- عدد الفئات المستعلم عنها لكل صورة.

أمثلة:

```python
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> from PIL import Image

>>> from transformers import AutoProcessor, OmDetTurboForObjectDetection

>>> processor = AutoProcessor.from_pretrained("omlab/omdet-turbo-swin-tiny-hf")
>>> model = OmDetTurboForObjectDetection.from_pretrained("omlab/omdet-turbo-swin-tiny-hf")

>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> with httpx.stream("GET", url) as response:
...     image = Image.open(BytesIO(response.read()))
>>> classes = ["cat", "remote"]
>>> task = "Detect {}.".format(", ".join(classes))
>>> inputs = processor(image, text=classes, task=task, return_tensors="pt")

>>> outputs = model(**inputs)

>>> # convert outputs (bounding boxes and class logits)
>>> results = processor.post_process_grounded_object_detection(
...     outputs,
...     classes=classes,
...     target_sizes=[image.size[::-1]],
...     score_threshold=0.3,
...     nms_threshold=0.3,
>>> )[0]
>>> for score, class_name, box in zip(results["scores"], results["classes"], results["boxes"]):
...     box = [round(i, 1) for i in box.tolist()]
...     print(
...         f"Detected {class_name} with confidence "
...         f"{round(score.item(), 2)} at location {box}"
...     )
Detected remote with confidence 0.76 at location [39.9, 71.3, 176.5, 117.9]
Detected cat with confidence 0.72 at location [345.1, 22.5, 639.7, 371.9]
Detected cat with confidence 0.65 at location [12.7, 53.8, 315.5, 475.3]
Detected remote with confidence 0.57 at location [333.4, 75.6, 370.7, 187.0]
```

