فهم الكشف الشامل (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) القياسية، فسيعمل كل شيء تلقائياً — حيث تتعامل التنبؤات، والتحقق، والتصدير مع النماذج ذات البنية من البداية إلى النهاية بشكل جاهز.
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 / YOLO11 | YOLO26 (شامل) | |
|---|---|---|
| مخرجات الكشف | (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:
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.
بالنسبة لـ Hailo، يختار المُصدِّر مسار الإخراج من الرأس المحمّل بدلاً من الوسيطة، لذا يتم رفض end2end إذا تم تمريرها: يحتفظ نموذج كشف YOLO26 الافتراضي بمخرجاته الفردية الخالية من NMS، بينما تقوم نقطة التحقق التي يكون رأسها بالفعل end2end=False بتجميع المسار التقليدي باستخدام HailoRT NMS.
مقايضات الدقة والسرعة#
يوفر اكتشاف البداية إلى النهاية فوائد نشر كبيرة مع تأثير ضئيل على الدقة:
| المقياس | شامل (افتراضي) | رأس فردي متعدد + 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مُدرجة ضمن كيف يعمل اكتشاف الكائنات من البداية إلى النهاية.