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

فهم الكشف الشامل في 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 (x، y، الرؤية)
OBB(N, 300, 7)زاوية الدوران

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

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

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

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

لا حاجة لإجراء أي تغييرات. إذا كنت تستخدم 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 أو TensorRT)، ستحتاج إلى تحديثه للتعامل مع شكل المخرجات الجديد:

YOLOv8 YOLO11YOLO26 (من البداية إلى النهاية)
ناتج الكشف(N, nc + 4, 8400)(N, 300, 6)
تنسيق المربعxywh (نقطة المركز x، نقطة المركز y، العرض، الارتفاع)xyxy (الإحداثي x في أعلى اليسار، والإحداثي y في أعلى اليسار، والإحداثي x في أسفل اليمين، والإحداثي y في أسفل اليمين)
التصميمإحداثيات المربعات + درجات الفئات لكل نقطة ارتكاز[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 (x، y، الرؤية)
OBB(1, 300, 7)6 قيم للصندوق + زاوية دوران واحدة

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

يمكنك التحقق من ذلك إما باستخدامPython Ultralytics Python أو عن طريق فحص بيانات تعريف 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
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)


📅 تم الإنشاء قبل 0 أيام ✏️ تم التحديث قبل 0 أيام
raimbekovm

تعليقات