رؤية YOLO 2026:

فهم الكشف الشامل (End-to-End) في Ultralytics YOLO26#

نماذج YOLO26 بأسلوب الكشف — الكشف، والتجزئة، ووضعيات الجسم، وOBB — خالية من NMS بشكل افتراضي: فهي تُخرج عمليات الكشف النهائية مباشرة من النموذج، بدون خطوة معالجة لاحقة لـ Non-Maximum Suppression (NMS). تنتج النماذج السابقة مثل YOLOv8 وYOLO11 آلاف التنبؤات المتراكبة التي يتعين على خطوة NMS منفصلة تصفيتها، مما يضيف زمن وصول، ويُعقد رسوم التصدير البيانية، وقد يسلك سلوكاً غير متسق عبر منصات العتاد.

يُعرف هذا باسم اكتشاف الكائنات من البداية إلى النهاية، وهو مُفعَّل افتراضياً. والنتيجة هي خط أنابيب نشر أبسط وزمن وصول أقل — حيث يعمل YOLO26n بشكل أسرع بنسبة تصل إلى 43% مقارنة بـ YOLO11n على استدلال ONNX لوحدة المعالجة المركزية (وحدة معالجة مركزية Intel Xeon بقوة 2.00 جيجاهرتز).

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

لإلقاء نظرة أعمق على الدافع الكامن وراء هذا التحول المعماري، راجع منشور مدونة Ultralytics حول سبب إزالة YOLO26 لـ NMS.

ملخص سريع
  • هل تستخدم واجهة برمجة تطبيقات Ultralytics أو واجهة سطر الأوامر (CLI)؟ لا توجد تغييرات مطلوبة — فقط قم بتغيير اسم نموذجك إلى yolo26n.pt.
  • هل تستخدم كود استدلال مخصص (مثل ONNX Runtime، أو TensorRT، وغيرها)؟ قم بتحديث المعالجة اللاحقة لديك — أصبح إخراج الاكتشاف الآن (N, 300, 6) بتنسيق xyxy، دون الحاجة إلى NMS. تضيف المهام الأخرى بيانات إضافية (معاملات الأقنعة، أو النقاط الرئيسية، أو الزوايا).
  • هل تقوم بالتصدير؟ تحافظ معظم التنسيقات على المخرجات من البداية إلى النهاية بشكل أصلي؛ ويعود عدد قليل منها إلى المخرجات التقليدية، ويمكن أن يؤدي التكميم إلى إلغاء تنشيطها — راجع توافق تنسيق التصدير.

كيف يعمل الكشف الشامل#

يستخدم YOLO26 بنية ذات رأس مزدوج أثناء التدريب. يتشارك كلا الرأسين في نفس الهيكل الأساسي والعنق، لكنهما ينتجان المخرجات بطرق مختلفة:

الرأسالغرضمخرجات الكشفالمعالجة اللاحقة
واحد لواحد (افتراضي)استدلال شامل(N, 300, 6)عتبة الثقة فقط
واحد لكثيرمخرجات YOLO التقليدية(N, nc + 4, 8400)يتطلب NMS

الأشكال أعلاه مخصصة لـ الكشف، حيث N هو حجم الدفعة، وnc هو عدد الفئات (على سبيل المثال، 80 لـ COCO)، وعِداد نقاط التثبيت 8400 هو القيمة الموجودة في imgsz=640. توسع المهام الأخرى المخرجات الفردية ببيانات إضافية لكل عملية اكتشاف:

المهمةمخرجات شاملةبيانات إضافية
الاكتشاف(N, 300, 6)
تجزئة الحالات الفردية(N, 300, 6 + nm) + النموذج الأولي (N, nm, H, W)معاملات القناع nm (الافتراضي 32)
Pose(N, 300, 57)17 نقطة رئيسية × 3 (x, y, الرؤية)
OBB(N, 300, 7)زاوية الدوران

أثناء التدريب، يعمل كلا الرأسين في نفس الوقت — يوفر الرأس الفردي المتعدد إشارة تعلم أغنى، بينما يتعلم الرأس الفردي الفردي إنتاج تنبؤات نظيفة وغير متداخلة. أثناء الاستدلال والتصدير، يكون الرأس الفردي الفردي فقط نشطاً افتراضياً، مما ينتج ما يصل إلى 300 اكتشاف لكل صورة بالتنسيق [x1, y1, x2, y2, confidence, class_id].

عندما تستدعي model.fuse()، فإنه يقوم بدمج طبقات Conv + BatchNorm لاستدلال أسرع، وفي النماذج ذات البنية من البداية إلى النهاية، يزيل أيضاً الرأس الفردي المتعدد — مما يقلل من حجم النموذج وعمليات الفلوب (FLOPs). لمزيد من التفاصيل حول بنية الرأس المزدوج، راجع صفحة نموذج YOLO26.

هل أحتاج إلى تغيير الكود الخاص بي؟#

باستخدام Ultralytics Python API أو CLI#

لا توجد تغييرات مطلوبة. إذا كنت تستخدم واجهة برمجة تطبيقات Python من Ultralytics أو واجهة سطر الأوامر (CLI) القياسية، فسيعمل كل شيء تلقائياً — حيث تتعامل التنبؤات، والتحقق، والتصدير مع النماذج ذات البنية من البداية إلى النهاية بشكل جاهز.

لا توجد تغييرات في الكود مطلوبة مع Ultralytics API
from ultralytics import YOLO

# Load a YOLO26 model
model = YOLO("yolo26n.pt")

# Predict — no NMS step, no code changes
results = model.predict("image.jpg")

باستخدام كود استدلال مخصص#

نعم، تنسيق الإخراج مختلف. إذا كتبتم منطق معالجة لاحقة مخصص لـ YOLOv8 أو YOLO11 (على سبيل المثال، عند تشغيل الاستدلال باستخدام ONNX Runtime أو TensorRT)، فستحتاج إلى تحديثه للتعامل مع شكل الإخراج الجديد:

YOLOv8 / YOLO11YOLO26 (شامل)
مخرجات الكشف(N, nc + 4, 8400)(N, 300, 6)
تنسيق الصندوقxywh (مركز س، مركز ص، العرض، الارتفاع)xyxy (أعلى اليسار س، أعلى اليسار ص، أسفل اليمين س، أسفل اليمين ص)
التخطيطإحداثيات الصندوق + درجات الفئة لكل مرساة (Anchor)[x1, y1, x2, y2, conf, class_id]
NMS مطلوبنعملا
المعالجة اللاحقةNMS + تصفية الثقةتصفية الثقة فقط

بالنسبة لمهام التجزئة، والوضعيات، وOBB، يلحق YOLO26 بيانات خاصة بالمهمة بكل اكتشاف — راجع جدول أشكال الإخراج.

مع النماذج من البداية إلى النهاية، تصبح المعالجة اللاحقة أبسط بكثير — على سبيل المثال، عند استخدام ONNX Runtime:

import onnxruntime as ort

# Load and run the exported end-to-end model
session = ort.InferenceSession("yolo26n.onnx")
output = session.run(None, {session.get_inputs()[0].name: input_tensor})

# End-to-end output: (batch, 300, 6) → [x1, y1, x2, y2, confidence, class_id]
detections = output[0][0]  # first image in batch
detections = detections[detections[:, 4] > 0.25]  # confidence filter, no NMS

التبديل إلى رأس الواحد لكثير#

إذا كنت بحاجة إلى تنسيق إخراج YOLO التقليدي (على سبيل المثال، لإعادة استخدام كود المعالجة اللاحقة القائم على NMS الموجود)، يمكنك التبديل إلى الرأس الفردي المتعدد عندما يكون متاحاً عن طريق تعيين end2end=False:

استخدام رأس الواحد لكثير لمخرجات تقليدية قائمة على NMS
from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Prediction with NMS (traditional behavior)
results = model.predict("image.jpg", end2end=False)

# Validation with NMS
metrics = model.val(data="coco.yaml", end2end=False)

# Export without end-to-end
model.export(format="onnx", end2end=False)

توافق تنسيق التصدير#

تدعم معظم تنسيقات التصدير استدلال البداية إلى النهاية بشكل جاهز، بما في ذلك ONNX، وTensorRT، وCoreML، وOpenVINO، وLiteRT، وMNN.

التنسيقات التالية لا تدعم البداية إلى النهاية وتعود تلقائياً إلى رأس الفردي المتعدد: NCNN، وRKNN، وPaddlePaddle، وExecuTorch، وIMX، وEdge TPU، وQualcomm QNN.

ماذا يحدث عندما لا يكون الاستدلال الشامل مدعوماً

عندما تقوم بالتصدير إلى أحد هذه التنسيقات، يتبدّل Ultralytics تلقائياً إلى الرأس المتعدد ويسجل تحذيراً. هذا يعني أنك ستحتاج إلى NMS في خط أنابيب الاستدلال الخاص بك لهذه التنسيقات، تماماً كما هو الحال مع YOLOv8 أو YOLO11.

بالنسبة لـ Hailo، يختار المُصدِّر مسار الإخراج من الرأس المحمّل بدلاً من الوسيطة، لذا يتم رفض end2end إذا تم تمريرها: يحتفظ نموذج كشف YOLO26 الافتراضي بمخرجاته الفردية الخالية من NMS، بينما تقوم نقطة التحقق التي يكون رأسها بالفعل end2end=False بتجميع المسار التقليدي باستخدام HailoRT NMS.

يمكن أن يؤدي التكميم وإصدار وقت التشغيل إلى تعطيل الميزة من البداية إلى النهاية

تدعم TensorRT وLiteRT العمل من البداية إلى النهاية، ولكن يتم تعطيل الفرع تلقائياً على إصدارات TensorRT الأقدم من 8.5.0، وعلى TensorRT 10.3.0 مع quantize=8 على JetPack 6، وعلى LiteRT مع quantize=8 أو quantize="w8a16". تسجل كل حالة تحذیراً وتُصدِّر الرأس المتعدد.

مقايضات الدقة والسرعة#

يوفر اكتشاف البداية إلى النهاية فوائد نشر كبيرة مع تأثير ضئيل على الدقة:

المقياسشامل (افتراضي)رأس فردي متعدد + NMS (end2end=False)
COCO mAPvalأقل بـ 0.6-0.8خط الأساس
المعالجة اللاحقةتصفية الثقة فقطخط أنابيب NMS كامل
تعقيد النشرحد أدنىيتطلب تنفيذ NMS

عبر مقاييس الكشف الخمسة، يكلف الرأس الفردي 0.6-0.8 mAP على COCO — من 40.9 إلى 40.1 لـ YOLO26n ومن 57.5 إلى 56.9 لـ YOLO26x — مقابل إسقاط تمرير NMS تماماً. إذا كانت الدقة القصوى هي أولويتك، فالجأ إلى الرأس المتعدد باستخدام end2end=False.

راجع مقاييس أداء YOLO26 للاطلاع على المعايير التفصيلية عبر جميع أحجام النماذج (n، s، m، l، x).

الهجرة من YOLOv8 أو YOLO11#

إذا كنت تقوم ترقية مشروع حالي إلى YOLO26:

  • مستخدمو واجهة برمجة تطبيقات Ultralytics / سطر الأوامر: لا توجد تغييرات مطلوبة — فقط قم بتحديث اسم النموذج إلى yolo26n.pt (أو yolo26n-seg.pt، أو yolo26n-pose.pt، أو yolo26n-obb.pt)
  • كود المعالجة اللاحقة المخصص: قم بالتحديث للتعامل مع أشكال الإخراج الجديدة — (N, 300, 6) للاكتشاف، بالإضافة إلى البيانات الخاصة بالمهمة لكل من التجزئة، والوضعيات، وOBB. لاحظ أيضاً تغير تنسيق الصندوق من xywh إلى xyxy
  • خطوط أنابيب التصدير: تحقق من قسم توافق التنسيق للتنسيق المستهدف الخاص بك
  • TensorRT الأقل من 8.5.0: يتم تعطيل العمل من البداية إلى النهاية في كل دقة — قم ترقية TensorRT إلى 8.5.0 أو الأحدث للاحتفاظ به
  • الصادرات المُكمَّمة: تؤدي TensorRT 10.3.0 مع quantize=8 على JetPack 6، وLiteRT مع quantize=8 أو quantize="w8a16"، إلى تعطيل ميزة من البداية إلى النهاية تلقائياً — قم بالتصدير بدقة أعلى للاحتفاظ بها
  • صادرات FP16: إذا كنت بحاجة إلى جميع المخرجات بتنسيق FP16، قم بالتصدير باستخدام end2end=False — راجع سبب بقاء output0 بتنسيق FP32
  • نظام iOS / CoreML: البداية إلى النهاية مدعومة بالكامل. إذا كنت بحاجة إلى دعم معاينة Xcode، فاستخدم end2end=False مع nms=True
  • أجهزة الحافة (NCNN, RKNN): تعود هذه التنسيقات تلقائياً إلى الواحد لكثير، لذا قم بتضمين NMS في خط أنابيب الجهاز الخاص بك

الخلاصة#

يعد اكتشاف البداية إلى النهاية هو الوضع الافتراضي في YOLO26 ولا يتطلب أي تغييرات في الكود إذا كنت تستخدم واجهة برمجة تطبيقات Python من Ultralytics أو واجهة سطر الأوامر (CLI). فقط خطوط أنابيب المعالجة اللاحقة المخصصة هي التي تحتاج إلى التحديث لقراءة مخرج (N, 300, 6) الجديد وإسقاط خطوة NMS — باستثناء تنسيقات التصدير التي تعود إلى مخرج الفردي المتعدد (مثل NCNN وRKNN)، والتي لا تزال تتطلب NMS على الجهاز. للاطلاع على مقاييس السرعة والدقة التفصيلية عبر جميع أحجام النماذج، راجع صفحة نموذج YOLO26، وللحصول على المجموعة الكاملة من خيارات وتنسيقات التصدير، راجع وثائق وضع التصدير.

الأسئلة الشائعة#

  • لا. هذه الخيارات متفردة متبادلة. إذا قمت بتعيين nms=True على نموذج ذي بنية من البداية إلى النهاية أثناء التصدير، فسيتم إجباره تلقائياً على nms=False مع إظهار تحذير. يتعامل رأس البداية إلى النهاية بالفعل مع تصفية التكرارات داخلياً، لذا فإن استخدام NMS خارجي يعد غير ضروري.

    مع ذلك، يعد الجمع بين end2end=False وnms=True تكوينًا صالحًا — فهو يدمج NMS التقليدي في مخطط التصدير. يمكن أن يكون هذا مفيدًا لصادرات CoreML لأنه يتيح لك استخدام ميزة المعاينة في Xcode مع نموذج الاكتشاف مباشرة.

  • يحدد المعامل max_det (الافتراضي: 300) الحد الأقصى لعدد الاكتشافات التي يتم إرجاعها لكل صورة. يمكنك ضبطه في وقت الاستدلال أو وقت التصدير:

    model.predict("image.jpg", max_det=100)  # fewer detections
    model.export(format="onnx", max_det=500)  # more detections for dense scenes

    تتم دمج القيمة في الرسم البياني المُصدَّر باعتبارها top-k للرأس، لذا يعمل max_det=500 على توسيع موتر الإخراج ليصل إلى (1, 500, 6)، بحد أقصى يعتمد على عِداد نقاط التثبيت.

  • نعم، هذا هو تنسيق الإخراج المتوقع من البداية إلى النهاية للكشف: حجم الدفعة يساوي 1، وحتى 300 عملية اكتشاف، تحتوي كل منها على 6 قيم [x1, y1, x2, y2, confidence, class_id]. ما عليك سوى التصفية حسب عتبة الثقة — دون الحاجة إلى NMS.

    بالنسبة للمهام الأخرى، يختلف شكل المخرجات:

    المهمةشكل المخرجاتالوصف
    اكتشاف(1, 300, 6)[x1, y1, x2, y2, conf, class_id]
    التقسيم (Segmentation)(1, 300, 38) + (1, 32, 160, 160)6 قيم للصندوق + 32 معامل قناع، بالإضافة إلى موتر قناع أولي
    وضعية(1, 300, 57)6 قيم للصندوق + 17 نقطة رئيسية × 3 (x, y, الرؤية)
    OBB(1, 300, 7)6 قيم للصندوق + 1 زاوية دوران
  • يمكنك التحقق من واجهة برمجة تطبيقات Python الخاصة بـ Ultralytics أو من بيانات التعريف الخاصة بنموذج ONNX المُصدَّر:

    تحقق مما إذا كان النموذج من الطرف إلى الطرف
    from ultralytics import YOLO
    
    model = YOLO("yolo26n.onnx")
    model.predict(verbose=False)  # run predict to setup predictor first
    print(model.predictor.model.end2end)  # True if end-to-end is enabled

    يجيب الفحصان عن سؤالين مختلفين: تسجل بيانات تعريف ONNX الرأس الذي تم تصديره، بينما يُبلغ predictor.model.end2end أن إخراج الخلفية تمت معالجته لاحقاً بالفعل ولا يحتاج إلى NMS خارجي. وهما يتعارضان مع نموذج مُصدَّر بـ end2end=False, nms=True، والذي يستخدم الرأس المتعدد ولكنه يدمج NMS في الرسم البياني ويُخرج أيضاً (1, 300, 6) — لذا فإن العلم وحده أو شكل الإخراج وحده لا يحدد الرأس. بالنسبة لأشكال المهام الأخرى، راجع الأسئلة الشائعة حول أشكال الإخراج.

  • نعم. تدعم متغيرات المهام بأسلوب اكتشاف YOLO26 — وهي الاكتشاف، وتجزئة المثيلات، وتقدير الوضعيات، واكتشاف الكائنات الموجهة (OBB) — استدلال البداية إلى النهاية افتراضياً. يتوفر البديل الاحتياطي end2end=False عبر هذه المهام أيضاً.

    تُعزز كل مهمة مخرجات الكشف الأساسية ببيانات خاصة بالمهمة؛ أشكال إخراج yolo26n.pt وyolo26n-seg.pt وyolo26n-pose.pt وyolo26n-obb.pt مُدرجة ضمن كيف يعمل اكتشاف الكائنات من البداية إلى النهاية.

التعليقات