تقييم كل المهام وإطلاقها
حدّد بوابة لكل مهمة استنادًا إلى مقياسها عند حجم النشر، وتحقق من جميع المهام ضمن حلقة واحدة، وصدّر كل مهمة إلى ONNX مع التحقق من صحة التنبؤ.
لكل مهمة تعريفها الخاص للصحة: تداخل البكسلات، أو تشابه النقاط المفتاحية، أو IoU للمربعات المُدارة، أو إصابة من المرتبة الأولى، أو نسبة العمق. والفرق التي تعيد استخدام قائمة التحقق الخاصة بالكشف تطلق نماذج تجزئة تحكم عليها باستخدام mAP للمربعات، ونماذج وضعية تحكم عليها باستخدام مربعات لم تكن يومًا هي المنتج. وحتى النموذج الذي يجتاز بوابته قد يفشل بعد التصدير: في هذا الدرس، تعثر أوزان الوضعية نفسها على 5 أشخاص عند حجم إدخال وعلى 3 عند حجم آخر، كما تتضاعف مسافات نموذج العمق تقريبًا.
عملي
بوابة واحدة لكل مهمة#
| المهمة | اجعل معيار البوابة | مفتاح results_dict | سمة Python | يُقاس بواسطة |
|---|---|---|---|---|
| التجزئة | mAP50-95 للقناع | metrics/mAP50-95(M) | metrics.seg.map | IoU للبكسلات لكل كائن |
| الدلالية | mIoU (+ IoU لكل فئة) | metrics/mIoU | metrics.miou | IoU للبكسلات لكل فئة |
| الوضعية | mAP50-95 للوضعية | metrics/mAP50-95(P) | metrics.pose.map | OKS |
| obb | mAP50-95 لـ OBB | metrics/mAP50-95(B) | metrics.box.map | IoU للمربعات المُدارة |
| التصنيف | دقة top-1 | metrics/accuracy_top1 | metrics.top1 | صحة الفئة الأعلى ترتيبًا |
| العمق | δ1 (+ AbsRel) | metrics/delta1 | metrics.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 التي تنتج التنسيقات نفسها:

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

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

عالج جودة البيانات وعملية وضع التعليقات التوضيحية أولًا — ففحوصات التسميات من الدرسين 2 و6 هي أقل نقطة تكلفة للبدء — ولا تغيّر النموذج إلا بعد تنقية البيانات.
عرض الحل
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,| النموذج | مقياس القبول | القيمة | imgsz | ONNX |
|---|---|---|---|---|
| التجزئة | mAP50-95 للقناع | 0.377 | 320 | يُعاد تحميله بوصفه segment، ويعثر على الحافلة و4 أشخاص |
| obb | mAP50-95 لـ OBB | 0.832 | 320 | يُعاد تحميله بوصفه obb، ويعثر على 185 سفينة و3 مرافئ |
يستخدم كل فحص صورة من مجاله الخاص: يحصل نموذج OBB على صورة المرفأ الجوية، لا مشهد الشارع. يجتاز الصفان فحص التصدير؛ لكن أيًا من النموذجين غير جاهز للإطلاق، لأن التدريب لحقبة واحدة على أربع صور للتحقق لا يعدو كونه اختبارًا أوليًا، لا بوابة اعتماد.