Ultralytics YOLO27: انضم إلى قائمة الانتظار.
الدرسمتوسط

تقييم كل المهام وإطلاقها

حدّد بوابة لكل مهمة استنادًا إلى مقياسها عند حجم النشر، وتحقق من جميع المهام ضمن حلقة واحدة، وصدّر كل مهمة إلى ONNX مع التحقق من صحة التنبؤ.

لكل مهمة تعريفها الخاص للصحة: تداخل البكسلات، أو تشابه النقاط المفتاحية، أو IoU للمربعات المُدارة، أو إصابة من المرتبة الأولى، أو نسبة العمق. والفرق التي تعيد استخدام قائمة التحقق الخاصة بالكشف تطلق نماذج تجزئة تحكم عليها باستخدام mAP للمربعات، ونماذج وضعية تحكم عليها باستخدام مربعات لم تكن يومًا هي المنتج. وحتى النموذج الذي يجتاز بوابته قد يفشل بعد التصدير: في هذا الدرس، تعثر أوزان الوضعية نفسها على 5 أشخاص عند حجم إدخال وعلى 3 عند حجم آخر، كما تتضاعف مسافات نموذج العمق تقريبًا.

النتيجة

أنشئ جدول إصدار يتضمن مقياس البوابة وimgsz لكل نموذج مهمة، وتصدير ONNX موثّقًا لكل نموذج يعاد تحميله بالمهمة الصحيحة ويُصدر تنبؤات صحيحة على صورة من المجال نفسه.

المسار السريع
إذا كنت تعرف الأساسيات بالفعل، فإليك النسخة المختصرة.
  1. حدّد بوابة التجزئة باستخدام mAP50-95 للقناع، والدلالية باستخدام mIoU، والوضعية باستخدام mAP50-95 للوضعية، وOBB باستخدام mAP50-95 لـ OBB، والتصنيف باستخدام top-1، والعمق باستخدام δ1.

  2. اقرأ الأرقام الرئيسية من metrics.results_dict باستخدام المفتاح الخاص بالمهمة، وسجّل imgsz بجانب كل رقم.

  3. صدّر باستخدام model.export(format="onnx", imgsz=...) بالحجم الذي تحققت منه.

  4. أعِد تحميل التصدير باستخدام YOLO("model.onnx")، وأجرِ تنبؤًا واحدًا على صورة من مجال النموذج نفسه قبل الإطلاق.

عملي

بوابة واحدة لكل مهمة#

المهمةاجعل معيار البوابةمفتاح results_dictسمة Pythonيُقاس بواسطة
التجزئةmAP50-95 للقناعmetrics/mAP50-95(M)metrics.seg.mapIoU للبكسلات لكل كائن
الدلاليةmIoU (+ IoU لكل فئة)metrics/mIoUmetrics.miouIoU للبكسلات لكل فئة
الوضعيةmAP50-95 للوضعيةmetrics/mAP50-95(P)metrics.pose.mapOKS
obbmAP50-95 لـ OBBmetrics/mAP50-95(B)metrics.box.mapIoU للمربعات المُدارة
التصنيفدقة top-1metrics/accuracy_top1metrics.top1صحة الفئة الأعلى ترتيبًا
العمقδ1 (+ AbsRel)metrics/delta1metrics.delta1نسبة البكسلات التي يقع عمقها ضمن 1.25× من العمق الحقيقي

يوضح دليل مقاييس الأداء كل درجة. وتُظهر عمليات تشغيل التجزئة والوضعية أيضًا مقاييس المربعات؛ احتفظ بها للتشخيص — فالفجوة بين المربع والقناع تشير إلى جودة الحدود — لكنها ليست المنتج. وتظل إرشادات الكشف المحددة، مثل مسح العتبات ومصفوفة الالتباس، سارية من التحقق والتشخيص.

التحقق من جميع المهام ضمن حلقة واحدة#

يقبل وضع Val أوزان أي مهمة مع مجموعة البيانات المطابقة، لذا تنتج حلقة واحدة أرقام جدول الإصدار:

from ultralytics import YOLO

runs = {
    "yolo26n-seg.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)"),
    "yolo26n-sem.pt": ("cityscapes8.yaml", "metrics/mIoU"),
    "yolo26n-pose.pt": ("coco8-pose.yaml", "metrics/mAP50-95(P)"),
    "yolo26n-obb.pt": ("dota8.yaml", "metrics/mAP50-95(B)"),
    "yolo26n-depth.pt": ("depth8.yaml", "metrics/delta1"),
}
for weights, (data, key) in runs.items():
    metrics = YOLO(weights).val(data=data, device="cpu", plots=False, verbose=False)
    print(f"{weights:17s} {key:22s} {metrics.results_dict[key]:.3f}")
yolo26n-seg.pt    metrics/mAP50-95(M)    0.538
yolo26n-sem.pt    metrics/mIoU           0.610
yolo26n-pose.pt   metrics/mAP50-95(P)    0.419
yolo26n-obb.pt    metrics/mAP50-95(B)    0.857
yolo26n-depth.pt  metrics/delta1         0.377

من دون تحديد imgsz صراحةً، يتحقق كل نموذج بالحجم الذي دُرّب عليه: 640 للتجزئة والوضعية، و768 للعمق، و1024 للدلالية وOBB. تتجاوز هذه الأرقام للنماذج المدرّبة مسبقًا أرقام التدريب بدقة 320 بكسل الواردة سابقًا في الدورة — ويعود ذلك جزئيًا إلى التدريب وجزئيًا إلى الدقة. أربع صور للتحقق تجعل كل رقم هنا اختبارًا أوليًا؛ فعلى سبيل المثال، تعرض صفحة مهمة العمق قيمة δ1 على مجموعة NYU المعيارية كاملة. استُبعد التصنيف عمدًا: تحقّق من المصنّف الذي ضبطته دقيقًا باستخدام مجلداته الخاصة، كما في درس المصنّف.

الدقة جزء من المقياس

تحقق الأوزان نفسها نتائج مختلفة عند قيم imgsz مختلفة. سجّل imgsz بجوار كل رقم، وتحقق من النموذج بالحجم الذي ستنشره عليه، ولا تقارن أبدًا أرقامًا قِيست بأحجام مختلفة.

تصدير كل المهام#

تُصدّر كل مهمة إلى ONNX باستخدام استدعاء وضع التصدير نفسه. تُخزَّن المهمة في بيانات النموذج الوصفية، لذلك يطبّق YOLO("model.onnx") المعالجة اللاحقة المناسبة. أما خيارات بيئة التشغيل، والتحقق من التكافؤ، وضبط TensorRT أو OpenVINO، فتندرج ضمن التصدير إلى ONNX (والتحقق من التكافؤ)؛ وتتحقق هذه الحلقة من نجاح جميع المهام في دورة التصدير وإعادة التحميل:

from ultralytics import YOLO

for weights in ["yolo26n-seg.pt", "yolo26n-sem.pt", "yolo26n-pose.pt", "yolo26n-obb.pt", "yolo26n-cls.pt", "yolo26n-depth.pt"]:
    onnx_path = YOLO(weights).export(format="onnx", imgsz=320)
    onnx_model = YOLO(onnx_path)  # task comes from the ONNX metadata
    result = onnx_model("https://ultralytics.com/images/bus.jpg", imgsz=320, verbose=False)[0]
    print(f"{onnx_model.task:9s} {result.verbose()}")
segment   4 persons, 1 bus,
semantic
pose      3 persons,
obb       (no detections),
classify  minibus 0.38, police_van 0.21, trolleybus 0.05, amphibian 0.05, bullet_train 0.03,
depth     depth 4.67-26.91m,

أُعيد تحميل كل تصدير بالمهمة الصحيحة. وتستحق ثلاث نتائج إلقاء نظرة ثانية:

  • عثر نموذج الوضعية على 3 أشخاص عند 320 بكسل، بينما عثر تشغيل PyTorch بدقة 640 بكسل على 5.
  • قدّر نموذج العمق المشهد بنطاق 4.7–26.9 m، بينما قدّرت الأوزان نفسها بدقتها الأصلية البالغة 768 بكسل نطاقًا من 2.1–14.9 m.
  • لم يعثر OBB على أي شيء في صورة شارع — وهذا سلوك صحيح لنموذج جوي، وليس خللًا في التصدير.

يعطي PyTorch عند imgsz=320 أرقام الوضعية والعمق نفسها التي يعطيها ONNX، لذا فليس أي منهما معيبًا بسبب التصدير: حجم الإدخال هو ما غيّر النتيجة. صدّر بالحجم imgsz الذي تحققت منه. لا تتضمن النتائج الدلالية سطر ملخص لكل كائن، لذا تحقّق من result.semantic_mask بدلًا من ذلك.

اختبر كل نموذج مُصدَّر على بيانات مجاله

أجرِ تنبؤًا واحدًا باستخدام كل نموذج مُصدَّر على صورة تشبه الصور التي دُرّب عليها — مشاهد الشوارع لنماذج COCO، واللقطات الجوية لـ OBB، ومشاهد داخلية أو شوارع بالمقياس المناسب للعمق — قبل أن تعتبر عملية التصدير معطوبة أو تنشر النموذج.

إذا كتبت المعالجة اللاحقة بنفسك، فهذه هي مخرجات ONNX الخام عند imgsz=320، كما وردت في سجل التصدير:

المهمةأشكال مخرجات ONNXالمحتويات
التجزئة(1, 116, 2100) و(1, 32, 80, 80)مربعات + 80 درجة فئة + 32 معامل قناع؛ نماذج أولية للأقنعة
الدلالية(1, 320, 320)خريطة الفئات، وتُحسب argmax مسبقًا ضمن الرسم البياني
الوضعية(1, 56, 2100)مربعات + درجة واحدة + 17 × 3 قيمة للنقاط المفتاحية
obb(1, 20, 2100)مربعات + 15 درجة فئة + زاوية واحدة
التصنيف(1, 1000)احتمالات الفئات
العمق(1, 1, 320, 320)العمق بالمتر لكل بكسل

على منصة Ultralytics، تعرض صفحة النموذج مقاييس المهمة الخاصة به (مثل mAP للقناع في نموذج التجزئة) فوق علامة تبويب Export التي تنتج التنسيقات نفسها:

صفحة نموذج على منصة Ultralytics لنموذج تجزئة، تعرض بطاقات mAP50 وmAP50-95 والدقة والاستدعاء للقناع فوق علامة تبويب Export التي تسرد TorchScript وONNX وOpenVINO وTensorRT وCoreML

يمثل ONNX نقطة تبادل: يعمل ملف مُصدّر واحد في ONNX Runtime أو يُحوّل لاحقًا إلى بيئات تشغيل أخرى.

ONNX كتنسيق تبادل: تُصدّر النماذج من PyTorch وTensorFlow وKeras وأُطر العمل الأخرى إلى ONNX، ثم تُحمّل في ONNX Runtime أو إطار عمل آخر

قائمة التحقق قبل الإطلاق#

  • يحقق مقياس البوابة الوارد في الجدول أعلاه الهدف على مجموعة محجوبة، باستخدام imgsz الخاصة بالنشر.
  • يُعاد تحميل النموذج المُصدّر بالمهمة المتوقعة task، وتطابق تنبؤاته تنبؤات PyTorch على مجموعة صور ثابتة.
  • تعالج مسارات الشيفرة الخاصة بكل مهمة النتائج الفارغة: masks is None، وصفر من النقاط المفتاحية، وصفر من مربعات OBB.
  • تُسجّل الأرقام اللاحقة (المساحات والزوايا والمسافات واحتمالات الفئات) كي تتمكن من مراقبة انحرافها، كما هو موضح في قابلية الرصد والانحراف.

عندما لا تتحقق البوابة، تعني عبارة «العودة إلى البيانات» عادةً استخدام أحد ثلاثة عوامل:

ثلاث طرق لتحسين mAP: جودة البيانات، وتحسين النموذج، وعملية التعليق التوضيحي

عالج جودة البيانات وعملية وضع التعليقات التوضيحية أولًا — ففحوصات التسميات من الدرسين 2 و6 هي أقل نقطة تكلفة للبدء — ولا تغيّر النموذج إلا بعد تنقية البيانات.

جرّبه

اختر مهمتين درّبتهما في هذه الدورة. ولكل مهمة، اكتب صفًا في جدول إصدار يضم مقياس البوابة باستخدام imgsz الخاصة بالنشر، وصدّر best.pt المدرّب إلى ONNX بذلك الحجم، ثم أعد تحميله وتأكد من أنه يصدر تنبؤًا معقولًا على صورة واحدة من المجال نفسه.

متى يُعدّ مكتملًا
تكون قد أتممت الدرس عند تحقق جميع الشروط التالية.
  • يسرد جدول الإصدار مقياس البوابة الصحيح وقيمته وimgsz لكلا النموذجين.

  • صُدّر النموذجان إلى ONNX وأُعيد تحميلهما بالمهمة المتوقعة task.

  • أصدر كل تصدير تنبؤًا معقولًا على صورة من مجاله الخاص.

عرض الحل
from ultralytics import YOLO

checks = {
    "runs/segment/train/weights/best.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)", "https://ultralytics.com/images/bus.jpg"),
    "runs/obb/train/weights/best.pt": ("dota8.yaml", "metrics/mAP50-95(B)", "https://ultralytics.com/images/boats.jpg"),
}
for weights, (data, key, image) in checks.items():
    model = YOLO(weights)
    gate = model.val(data=data, imgsz=320, plots=False, verbose=False).results_dict[key]
    onnx_model = YOLO(model.export(format="onnx", imgsz=320))
    result = onnx_model(image, imgsz=320, verbose=False)[0]
    print(f"{onnx_model.task:8s} {key} @320 = {gate:.3f} | ONNX: {result.verbose()}")

عدّل مسارات runs/... لتطابق المجلدات التي طبعتها عمليات التدريب (Results saved to ...). وباستخدام عمليات التدريب ذات الحقبة الواحدة من الدرسين 2 و7:

segment  metrics/mAP50-95(M) @320 = 0.377 | ONNX: 4 persons, 1 bus,
obb      metrics/mAP50-95(B) @320 = 0.832 | ONNX: 185 ships, 3 harbors,
النموذجمقياس القبولالقيمةimgszONNX
التجزئةmAP50-95 للقناع0.377320يُعاد تحميله بوصفه segment، ويعثر على الحافلة و4 أشخاص
obbmAP50-95 لـ OBB0.832320يُعاد تحميله بوصفه obb، ويعثر على 185 سفينة و3 مرافئ

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

ما الخطوة التالية

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

سجّل الدخول لحفظ التقدم