التحقق والتشخيص
تحقق من best.pt بمقارنته بقيمة أساسية، واقرأ مصفوفة الالتباس والأرقام لكل فئة وصور التنبؤ، وحوّلها إلى قائمة إصلاحات محددة.
يخبرك رقم واحد لـmAP بمدى أخطاء النموذج، لا بماهيتها. فالكائنات الصغيرة التي لم تُكتشف، والفئتان اللتان يخلط النموذج بينهما، والصناديق غير المحكمة، كلها تخفض mAP، ولكل منها إصلاح مختلف. إذا أخطأت في التشخيص، فقد تقضي أسبوعًا في جمع بيانات غير مناسبة.
في هذا الدرس، ستشغّل وضع التحقق على best.pt، وتقارنه بالقيمة الأساسية، وتقرأ مصفوفة الالتباس وصور التنبؤ حتى تتمكن من كتابة قائمة إصلاحات الجولة التالية. ويُعد دليل مقاييس الأداء مرجعًا تفصيليًا مكملًا.
عملي
مثال تطبيقي: التحقق من best.pt#
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt")
metrics = model.val(data="my_dataset/data.yaml")
print(f"precision {metrics.box.mp:.3f} recall {metrics.box.mr:.3f}")
print(f"mAP50 {metrics.box.map50:.3f} mAP50-95 {metrics.box.map:.3f}")مخرجات فعلية من val.py:
precision 0.970 recall 0.957
mAP50 0.977 mAP50-95 0.659تُحفظ المخططات في مجلد جديد runs/detect/val (ثم val-2، ...). ضع الأرقام إلى جانب القيمة الأساسية:
| النموذج | mAP50 | mAP50-95 |
|---|---|---|
yolo26n.pt مُسبق التدريب (من دون فئة للأقراص) | 0.001 | 0.0002 |
pills_v1 (10 حقب، imgsz 320، CPU) | 0.977 | 0.659 |
ما الذي تقوله الأرقام:
- الدقة الإيجابية 0.970، والاستدعاء 0.957: أداء متوازن؛ إنذارات كاذبة قليلة، وحالات فائتة قليلة.
- mAP50 0.977: مع اشتراط تداخل متساهل، يعثر النموذج على كل قرص دوائي تقريبًا.
- mAP50-95 0.659: مع اشتراط تداخل صارم، لا تكون كثير من الصناديق محكمة. وتشير فجوة بهذا الحجم إلى مشكلة في تحديد المواضع — ويمكن معالجتها بزيادة عدد العصور التدريبية، أو باستخدام
imgszأكبر، أو بتحسين دقة الوسوم — لا إلى نقص البيانات.
للاطلاع على كيفية المفاضلة بين الدقة الإيجابية والاستدعاء وmAP، راجع قراءة مقاييس الكشف بموضوعية.
اعرف الملف الذي يجيب عن كل سؤال#
| السؤال | الملف |
|---|---|
| ما الفئات التي يحدث بينها التباس، وما الفئات التي لا يُعثر عليها؟ | confusion_matrix_normalized.png |
| كيف توازن كل فئة بين الدقة الإيجابية والاستدعاء؟ | BoxPR_curve.png |
| ما عتبة الثقة التي ينبغي استخدامها عند النشر؟ | BoxF1_curve.png: تمثل ذروته نقطة انطلاق جيدة لـconf |
| كيف تبدو حالات الإخفاق؟ | val_batch0_labels.jpg مقابل val_batch0_pred.jpg |
| هل يعاني النموذج من فرط التكيّف؟ | results.png في مجلد التدريب |
اقرأ مصفوفة الالتباس#

تُعد مصفوفة الالتباس أداة التشخيص الأهم. في مخططات Ultralytics، تمثل الأعمدة الفئة الحقيقية والصفوف الفئة المتنبأ بها، مع إضافة صف وعمود background. يقسم الإصدار المُطبّع كل عمود على مجموعه، ليبيّن كل عمود الوجهة التي انتهت إليها كائنات تلك الفئة. يحتوي نموذج الأقراص الدوائية على فئة واحدة، لذا تدرّب على هذا المثال التوضيحي ذي الفئات الثلاث لمستودع (الأرقام للتوضيح):
| المتنبأ به ↓ / الحقيقي → | رافعة شوكية | شخص | منصة تحميل | الخلفية |
|---|---|---|---|---|
| رافعة شوكية | 0.78 | 0.03 | 0.18 | 0.45 |
| شخص | 0.04 | 0.91 | 0.00 | 0.20 |
| منصة تحميل | 0.10 | 0.00 | 0.65 | 0.35 |
| الخلفية | 0.08 | 0.06 | 0.17 | — |
- القطر الرئيسي: نسبة كل فئة التي كُشفت على نحو صحيح. منصة التحميل، بقيمة 0.65، هي الفئة الأضعف.
- خارج القطر الرئيسي: حالات الالتباس. تنبأ النموذج بأن 18% من منصات التحميل الحقيقية رافعات شوكية، وبأن 10% من الرافعات الشوكية منصات تحميل.
- صف الخلفية: حالات الإخفاق في الكشف. لم يُكتشف 17% من منصات التحميل مطلقًا.
- عمود الخلفية: الإيجابيات الكاذبة، أي الصناديق المرسومة في مساحة خالية. صُنّف 45% منها على أنها رافعات شوكية.
يرتبط كل نوع من الخلايا بإجراء تصحيحي:
| النمط | الحل |
|---|---|
| التباس بين فئتين | أضف أمثلة تميّز بينهما: رافعات شوكية تحمل منصات تحميل، ومنصات تحميل مكدسة بجوار رافعات شوكية. |
| ارتفاع قيمة صف الخلفية (حالات الإخفاق في الكشف) | أضف مزيدًا من الأمثلة على تلك الفئة، في الظروف التي لا يُكتشف فيها الكائن. |
| ارتفاع قيمة عمود الخلفية (الإنذارات الكاذبة) | أضف صورًا للخلفية من المشاهد التي تُحفّز هذه الإنذارات، مثل الممرات الخالية. |
اقرأ الأرقام لكل فئة#
عند وجود عدة فئات، يسجل سجل التحقق صفًا لكل فئة، ويحتوي metrics.box.maps على قيم mAP50-95 لكل فئة لاستخدامها في الشيفرة. نتابع مثال المستودع:
Class Images Instances Box(P R mAP50 mAP50-95)
all 50 102 0.78 0.71 0.74 0.51
forklift 30 45 0.85 0.78 0.81 0.58
person 40 50 0.92 0.88 0.91 0.64
pallet 5 7 0.58 0.48 0.51 0.31قيمة pallet أقل بكثير من قيم الفئات الأخرى، ولا تضم مجموعة التحقق سوى 7 حالات منها. فإما أن أداء النموذج ضعيف في كشف منصات التحميل، أو أن بيانات التحقق قليلة جدًا للحكم. وفي الحالتين، الخطوة نفسها مطلوبة: اجمع مزيدًا من صور منصات التحميل للتدريب والتحقق.
افحص حالات الإخفاق#
افتح val_batch0_labels.jpg وval_batch0_pred.jpg جنبًا إلى جنب. تعرض الفروق حالات الإخفاق على هيئة صور، وتكشف الأنماط بينها عن أسبابها: حالات إخفاق عند حافة الصورة، أو كائنات صغيرة، أو ظروف إضاءة معينة، أو كائنات متشابهة يسهل الخلط بينها. غالبًا ما يكون أثر أنماط مجموعة البيانات هذه أكبر من أثر ضبط المعلمات الفائقة.
في صور التحقق لنموذج الأقراص الدوائية، تحصل الأقراص الظاهرة بوضوح على درجات تقارب 1.0. أما الصناديق منخفضة الثقة، التي تتراوح درجاتها بين 0.3 و0.5 تقريبًا، فتتركز حول الأقراص المحجوبة جزئيًا تحت عبوة نفطة أخرى، وحول الأقراص المقطوعة عند حافة الصورة. لا يمكن معالجة ذلك بالضبط باستخدام conf؛ فهذه مسألة تتعلق بسياسة وضع الوسوم. هل ينبغي احتساب القرص المحجوب جزئيًا؟ حدّد القاعدة، وسجّلها، وطبّقها بالطريقة نفسها على كل صورة.
بعد ذلك، افتح results.png. ينبغي أن تنخفض خسارتا التدريب والتحقق معًا. إذا واصلت خسارة التدريب الانخفاض بينما ارتفعت خسارة التحقق، فالنموذج يعاني من فرط التكيّف؛ وإذا بقيت الخسارتان مرتفعتين، فهذا قصور في التكيّف. ويُعد التوازن بين الانحياز والتباين إطارًا لفهم الحالتين.

لعلاج فرط التكيّف، جرّب الحلول بهذا الترتيب وفقًا لمدى نجاحها: بيانات أكثر تنوعًا؛ أو عصور تدريبية أقل أو patience أكثر إحكامًا؛ أو زيادة البيانات (hsv_h، degrees، translate، scale، fliplr، mosaic، ...). إعدادات زيادة البيانات الافتراضية قوية بالفعل؛ فلا تغيّرها إلا لسبب، مثل تعطيل fliplr عندما يكون التمييز بين اليسار واليمين مهمًا.
حوّل النتائج إلى قائمة إجراءات تصحيحية#
عالج البيانات قبل ضبط المعلمات الفائقة، وغيّر شيئًا واحدًا في كل جولة لتعرف ما الذي أفاد. يتناول الضبط الدقيق الأول وحلقة التكرار جانب مجموعة البيانات من هذه الحلقة.
تجنّب هذه الأخطاء#
العَرَض: يحقق نموذج قيمة 0.659 في mAP50-95 ثم تنخفض فجأة إلى 0.403. السبب: دُرّب pills_v1 على imgsz=320 وتم التحقق منه باستخدام imgsz=640؛ فتظهر الأجسام أكبر بمرتين مما تعلمه النموذج. الحل: تحقّق وانشر باستخدام imgsz الذي استُخدم في التدريب، ولا تقارن التشغيلات إلا عند الحجم نفسه.
يُشغَّل التحقق باستخدام conf=0.001 ليتسنى تتبّع منحنى الدقة والاستدعاء كاملًا، ولهذا يعرض val_batch0_pred.jpg صناديق لن يعرضها تطبيقك مطلقًا. اختر عتبة النشر من BoxF1_curve.png، ثم افحصها باستخدام predict.
مع 23 صورة، تذبذبت دقة أحد عصور التدريب من 0.93 إلى 0.80 ثم عادت. قيّم الاتجاهات عبر العصور والتشغيلات، وزِد مجموعة التحقق قبل الوثوق بالفروق التي لا تتجاوز نقطة أو نقطتين.
عرض الحل
Baseline mAP50-95 0.0002 -> pills_v1 0.659 (mAP50 0.977), both at imgsz=320
Failures:
- Low-confidence boxes (about 0.3-0.5) on pills half-hidden under another pack.
- Low-confidence or missing boxes on pills cut off at the image edge.
Overfitting: none. val/box_loss flattened near 1.05; val/cls_loss spiked at epochs 4-6
and then fell to its lowest value (1.08) at epoch 10.
Fix list:
1. Write a labeling rule for partly hidden and edge pills, then relabel the val set to match.
2. Train longer and larger: epochs=50, imgsz=640 (mAP50-95 lags mAP50, so box tightness is the gap).
3. Add 20 frames with overlapping packs, labeled under the new rule.