تخطي إلى المحتوى

فهم الكشف الشامل في Ultralytics

مقدمة

إذا كنت تقوم بالترقية إلى YOLO26 من طراز أقدم مثل YOLOv8 أو YOLO11، فإن أحد أكبر التغييرات التي ستلاحظها هو إزالة Non-Maximum Suppression (NMS). تنتج YOLO التقليدية آلاف التنبؤات المتداخلة التي تحتاج إلى خطوة NMS منفصلة NMS لتصفية النتائج النهائية. وهذا يزيد من زمن الاستجابة، ويعقد الرسوم البيانية للتصدير، ويمكن أن يؤدي إلى سلوك غير متسق عبر منصات الأجهزة المختلفة.

يتبع YOLO26 نهجًا مختلفًا. فهو يُخرج نتائج الكشف النهائية مباشرةً من النموذج — دون الحاجة إلى أي تصفية خارجية. يُعرف هذا باسم «الكشف عن الكائنات من البداية إلى النهاية»، وهو ميزة مُفعَّلة افتراضيًّا في جميع نماذج YOLO26. وينتج عن ذلك مسار نشر أبسط، وزمن استجابة أقل، واستدلال أسرع بنسبة تصل إلى 43% على وحدات المعالجة المركزية (CPU).

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

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

ملخص سريع

  • هل تستخدم واجهة برمجة التطبيقات ( Ultralytics ) أو CLI سطر الأوامر ( CLI) الخاصة Ultralytics ؟ لا حاجة لإجراء أي تغييرات — ما عليك سوى استبدال اسم الطراز بـ yolo26n.pt.
  • هل تستخدم كود استدلال مخصص (ONNX ، TensorRT، إلخ)؟ قم بتحديث عملية المعالجة اللاحقة — أصبح ناتج الكشف الآن (N, 300, 6) في xyxy التنسيق، ولا NMS . وتقوم مهام أخرى بإضافة بيانات إضافية (معاملات القناع، أو النقاط الرئيسية، أو الزاوية).
  • هل تريد التصدير؟ تدعم معظم التنسيقات الإخراج من طرف إلى طرف بشكل أصلي. ومع ذلك، فإن بعض التنسيقات (NCNN وRKNN PaddlePaddle وExecuTorch وIMX وEdge TPU) تعود تلقائيًا إلى الإخراج التقليدي بسبب قيود المشغلات غير المدعومة (على سبيل المثال، torch.topk).

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

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

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

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

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

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

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

هل أحتاج إلى تغيير الرمز الخاص بي؟

استخدام واجهةPython أو CLI Ultralytics Python

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

لا يلزم إجراء أي تغييرات على الكود عند استخدام Ultralytics

from ultralytics import YOLO

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

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

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

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

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

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

أين N هو حجم الدفعة و nc هو عدد الفصول (على سبيل المثال، 80 لـ COCO).

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

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] > conf_threshold]  # confidence filter — that's it!

التحول إلى رأس "واحد إلى عدة"

إذا كنت بحاجة إلى تنسيق YOLO التقليدي 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)
yolo predict model=yolo26n.pt source=image.jpg end2end=False
yolo val model=yolo26n.pt data=coco.yaml end2end=False
yolo export model=yolo26n.pt format=onnx end2end=False

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

تدعم معظم تنسيقات التصدير الاستدلال الشامل بشكل افتراضي، بما في ذلك ONNXو TensorRTو CoreML، OpenVINO، TFLiteو TF.js و MNN.

لا تدعم التنسيقات التالية الاتصال من طرف إلى طرف، وتنتقل تلقائيًا إلى نمط "واحد إلى العديد": NCNN، RKNN، PaddlePaddle، ExecuTorch، IMX، و Edge TPU.

ماذا يحدث عندما لا يتم دعم نموذج "من البداية إلى النهاية"

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

TensorRT INT8

TensorRT يدعم النموذج الشامل، ولكنه معطل تلقائيًا عند التصدير باستخدام int8=True على TensorRT .3.0 أو أقل.

موازنات الدقة والسرعة

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

مقياس (Metric)من البداية إلى النهاية (الافتراضي)واحد إلى عدة + NMSend2end=False)
سرعة استدلال CPUأسرع بنسبة تصل إلى 43%خط الأساس
mAPmAP بحوالي 0.5 mAPتساوي أو تفوق YOLO11
المعالجة اللاحقةفلتر الثقة فقطNMS الكامل
تعقيد النشرالحد الأدنىيتطلب NMS

في معظم التطبيقات العملية، يبلغ ~0.5 mAP الفرق ضئيل للغاية، لا سيما عند أخذ مكاسب السرعة والبساطة في الاعتبار. إذا كانت الدقة القصوى هي أولويتك القصوى، فيمكنك دائمًا اللجوء إلى رأس «واحد إلى العديد» باستخدام end2end=False.

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

الترحيل من YOLOv8 YOLO11

إذا كنت تقوم بترقية مشروع موجود إلى YOLO26، فإليك قائمة مرجعية سريعة لضمان انتقال سلس:

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

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

هل يمكنني استخدام end2end=True و nms=True معًا؟

لا. هذه الخيارات متعارضة. إذا قمت بتعيين nms=True في إطار نموذج شامل خلال تصدير، سيتم فرضه تلقائيًا على nms=False مع تحذير. يقوم جهاز التوجيه الشامل بالفعل بتصفية التكرارات داخليًّا، لذا لا NMS خارجي.

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

ما الذي تتحكم فيه المعلمة max_det في النماذج الشاملة؟

في max_det يحدد هذا المعامل (القيمة الافتراضية: 300) الحد الأقصى لعدد عمليات الكشف التي يمكن أن ينتجها الرأس «واحد إلى واحد» لكل صورة. يمكنك تعديله أثناء الاستدلال أو عند التصدير:

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

يرجى ملاحظة أن نقاط التحقق الافتراضية لـ YOLO26 تم تدريبها باستخدام max_det=300. بينما يمكنك زيادة هذه القيمة، تم تحسين الرأس أحادي المطابقة أثناء التدريب لإنتاج ما يصل إلى 300 عملية كشف نظيفة، لذا قد تكون عمليات الكشف التي تتجاوز هذا الحد ذات جودة أقل. إذا كنت بحاجة إلى أكثر من 300 عملية كشف لكل صورة، ففكر في إعادة التدريب بقيمة أعلى max_det القيمة.

نتائج ONNX الذي قمت بتصديره هي (1، 300، 6) — هل هذا صحيح؟

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

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

المهمةشكل المخرجاتالوصف
اكتشاف(1, 300, 6)[x1, y1, x2, y2, conf, class_id]
التجزئة(1, 300, 38) + (1, 32, 160, 160)6 قيم للمربع + 32 معامل قناع، بالإضافة إلى tensor قناع نموذجي
الوضع(1, 300, 57)6 قيم للمربع + 17 نقطة مفتاحية × 3 (س، ص، الرؤية)
OBB(1, 300, 7)6 قيم للمربع + زاوية دوران واحدة

كيف يمكنني التحقق مما إذا كان النموذج الذي قمت بتصديره متكاملاً؟

يمكنك التحقق من ذلك إما باستخدامPython Ultralytics Python أو عن طريق فحص بيانات تعريف ONNX الذي تم تصديره مباشرةً:

تحقق مما إذا كان النموذج شاملاً (end-to-end)

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
import onnxruntime as ort

session = ort.InferenceSession("yolo26n.onnx")
metadata = session.get_modelmeta().custom_metadata_map
print(metadata.get("end2end"))  # 'True' if end-to-end is enabled

بدلاً من ذلك، تحقق من شكل المخرجات — نماذج الكشف الشاملة تنتج (1, 300, 6)، بينما تنتج النماذج التقليدية (1, nc + 4, 8400). لأشكال المهام الأخرى، راجع الأسئلة الشائعة حول أشكال المخرجات.

هل يتم دعم نهج "من البداية إلى النهاية" في مهام التجزئة وتحديد الوضع ومستطيل الحدود (OBB)؟

نعم. جميع متغيرات مهام YOLO26 — اكتشاف, تقسيم, تقدير الوضعية، و اكتشاف الكائنات الموجهة (obb) — تدعم الاستدلال الشامل بشكل افتراضي. end2end=False كما أن الخطة البديلة متاحة في جميع المهام أيضًا.

تُثري كل مهمة ناتج الكشف الأساسي ببيانات خاصة بها:

المهمةالنموذجالناتج من البداية إلى النهاية
اكتشافyolo26n.pt(N, 300, 6)
التجزئةyolo26n-seg.pt(N, 300, 38) + بروتو (N, 32, 160, 160)
الوضعyolo26n-pose.pt(N, 300, 57)
OBByolo26n-obb.pt(N, 300, 7)


📅 تم الإنشاء قبل 13 أيام ✏️ تم التحديث قبل 11 أيام
glenn-jocherraimbekovm

تعليقات