التقييم والنشر (Evaluation & Deployment)
ما مدى جودة نموذجك فعلياً؟
كل توقع يخرج من النموذج يقع في واحدة من أربع فئات. مثال: اكتشاف “سيارة”
| Prediction: سيارة | Prediction: ليست سيارة | |
| الحقيقة: سيارة | ✅ إيجابي صحيح (TP) اكتشاف صحيح |
❌ سلبي خاطئ (FN) سيارة تم تفويتها |
| الحقيقة: ليست سيارة | ⚠️ إيجابي خاطئ (FP) إنذار خاطئ |
✅ سلبي صحيح (TN) رفض صحيح (بقعة فارغة) |
كاميرا عند مدخل موقف سيارات تصنف كل إطار كـ سيارة موجودة أو لا يوجد شيء:
بيانات الاختبار: 24 ساعة، 10,000 إطار (إطار كل 9 ثوانٍ تقريباً)
| الحالة | العدد | النسبة |
|---|---|---|
| سيارة موجودة | 500 | 5% |
| بقعة فارغة | 9,500 | 95% |
في معظم الأوقات، الموقف يكون فارغاً.
تخيل نموذجاً “كسولاً” يتوقع دائماً “فارغ” مهما رأى:
\[Accuracy (الدقة) = \frac{9{,}500}{10{,}000} = 95\%\]
95% دقة! — ومع ذلك لم يكتشف سيارة واحدة. هذه هي مشكلة اختلال توازن البيانات (Class Imbalance).
لفهم دقة النموذج، نستخدم أربعة مصطلحات أساسية تصف “إصابته” أو “خطأه”:
| المصطلح | المعنى البسيط | مثال كاميرا الأمان (لص) | النتيجة |
|---|---|---|---|
| True Positive (TP) | صيد صحيح | الكاميرا رصدت شخصاً، وطلع فعلاً “لص”. | نجاح! ✅ |
| False Positive (FP) | إنذار خاطئ | الكاميرا دقت جرس الإنذار، لكن طلع “قطة”. | إزعاج 📣 |
| False Negative (FN) | صيد ضائع | اللص دخل البيت، والكاميرا لم ترسل أي تنبيه. | خطر! 🙈 |
| True Negative (TN) | تجاهل صحيح | لم يمر أحد، والكاميرا بقيت هادئة. | أمان 💤 |
هي مجرد “جدول” يجمع كل الحالات السابقة لنعرف أين يقع الخلل الأكبر في النموذج.
لماذا نهتم؟ - في السيارات ذاتية القيادة: الـ FN (عدم رؤية سيارة أمامك) أخطر بكثير من الـ FP. - في فلترة الرسائل المزعجة (Spam): الـ FP (حذف إيميل مهم) أسوأ من الـ FN.
| الواقع: إيجابي (لص) | الواقع: سلبي (فارغ) | |
|---|---|---|
| توقع: إيجابي | TP (صيد صحيح) | FP (إنذار كاذب) |
| توقع: سلبي | FN (صيد ضائع) | TN (تجاهل صحيح) |
ماذا لو كان النموذج يكتشف كل سيارة، ولكنه “مفرط الحساسية” (يرى أشباحاً)؟
\[\frac{100\% + 80\%}{2} = \mathbf{90\%}\]
90% تبدو رائعة — ولكنها تخفي 1,900 إنذار خاطئ داخل الرقم.
فخ الـ TN: الـ 7,600 سلبي صحيح (تجاهل البقع الفارغة بشكل صحيح) هي التي رفعت الدقة بشكل خادع بينما الإنذارات الخاطئة تغرق نظامك.
مقياسان يتجاهلان “السلبيات الصحيحة” تماماً (البقع الفارغة التي تم تجاهلها بنجاح):
لدينا 500 سيارة حقيقية. كيف سيتعامل معها هذان النموذجان؟
يصيح على كل شيء — لا يفوت سيارة أبداً
لا يتحدث إلا عندما يكون متأكداً جداً
حرك المنزلق وشاهد كيف يتأثر أداء النموذج بتغيير “عتبة الثقة”
النموذج يعطي درجات احتمالية، وليس قرارات نهائية:
“أنا متأكد بنسبة 72% أن هذه سيارة.”
نحن من نقرر التصنيف النهائي:
top1)رفع أو خفض عتبة الثقة يغير التوازن:
0.80)صارم — لا يمر إلا “المتأكد منه”
↑ ضبط (Precision) عالي (إنذارات خاطئة أقل)
↓ استدعاء (Recall) منخفض (تفويت سيارات أكثر)
0.20)متساهل — يمسك كل شيء
↑ استدعاء (Recall) عالي (تفويت أقل)
↓ ضبط (Precision) منخفض (إنذارات خاطئة أكثر)
ما هو الرقم الوحيد الذي يجمع الاثنين معاً؟
\[F_1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}\]
وجود صفر في أي من المقياسين يسحب Score الكلية للأسفل — لا يمكنك الاختباء وراء رقم واحد قوي.
F1 Score كشف عيب النموذج (أ): الـ 1,900 إنذار خاطئ رفعت الاستدعاء ولكنها دمرت الضبط — F1 Score = 34.4%.
تقوم Ultralytics بحفظ رسوم F1_curve.png و R_curve.png في نتائج التدريب تلقائياً.
المقاييس مثل الدقة و F1 رائعة للمهندسين، ولكن الإدارة تتحدث لغة واحدة: المال.
السيناريو: مصنع رقمي ينتج لوحات دوائر إلكترونية متطورة. نقوم بنشر نموذج YOLO لاكتشاف “اللحام المعيب” قبل شحن اللوحات للعملاء.
كل توقع في مصنعنا الرقمي له نتيجة مالية ملموسة:
إذا اختبرنا نموذجنا على دفعة مكونة من 10,000 لوحة (حيث 5% منها معيبة فعلاً):
| Prediction: معيبة | Prediction: سليمة | |
| الحقيقة: معيبة | ✅ TP التكلفة: 0$ |
❌ FN (تفويت) التكلفة: 500$ لكل واحدة |
| الحقيقة: سليمة | ⚠️ FP (إنذار كاذب) التكلفة: 25$ لكل واحدة |
✅ TN التكلفة: 0$ |
إجمالي الخسارة المالية = \((FN \times \$500) + (FP \times \$25)\)
ماذا لو لم نستخدم الذكاء الاصطناعي أصلاً؟ لنلقِ نظرة على الأثر المالي لأبسط استراتيجيتين “تقليديتين”:
افترض أن كل اللوحات سليمة
افترض أن كل اللوحات معيبة
الخلاصة: حتى النموذج “البسيط” يوفر للشركة مئات الآلاف من الدولارات في كل دفعة. والآن دعونا نرى كم يمكننا توفيره أكثر عبر التحسين.
تذكر كيف يوازن F1 Score بين الضبط والاستدعاء؟ عندما يتعلق الأمر بالمال، يتغير الميزان. تفويت عيب واحد (FN) أغلى بـ 20 مرة من الإنذار الخاطئ (FP).
عتبة متوازنة (conf=0.35)
عتبة متساهلة (conf=0.20)
عبر خفض العتبة وقبول القليل من الإنذارات الخاطئة، وفرنا للشركة قرابة 30,000$ إضافية في كل دفعة. لقد قمنا بالتحسين من أجل مقياس العمل التجاري، وليس مقياس تعلم الآلة فقط.
تماماً كما رسمنا منحنى F1، يمكننا رسم منحنى التكلفة لإيجاد العتبة المثالية للنشر.
الآن حان دورك لتلعب دور قائد الأعمال!
labs/04a_roi_evaluation.ipynbملخص السيناريو:
كل المقاييس التي رأيناها حتى الآن (\(F1\), \(ROI\), \(Precision\)) تتطلب منا اختيار عتبة أولاً.
مفيدة عند النشر النهائي. “عند عتبة 0.45، كم سيكون ربحي؟”
مفيدة للمقارنة بين النماذج (Benchmarking). “هل هذا النموذج أفضل جوهرياً من النموذج السابق؟”
الخطوة 1: الجمع نأخذ كل توقع “سيارة” قام به النموذج عبر كامل مجموعة الاختبار.
الخطوة 2: الفرز نرتبها من أعلى درجة ثقة (مثلاً \(0.99\)) إلى أقل درجة (مثلاً \(0.10\)).
الخطوة 3: الحساب نحسب الضبط والاستدعاء عند كل خطوة في تلك القائمة المرتبة.
متوسط الضبط (AP) هو ببساطة المساحة الموجودة تحت منحنى الضبط والاستدعاء (PR)!
الضبط والاستدعاء يقيسان ما إذا كان التصنيف صحيحاً. أما في اكتشاف الكائنات، يجب على النموذج أيضاً تحديد المكان الصحيح.
Prediction الواثق الموضوع في المكان الخاطئ لا يزال توقعاً خاطئاً.
هنا يأتي دور التقاطع فوق الاتحاد (Intersection over Union - IoU).
ما مدى دقة تداخل المربع المتوقع مع المربع الحقيقي (Ground Truth)؟
قاعدة عامة: يعتبر Prediction “إيجابياً صحيحاً” (TP) إذا كان الـ IoU أكبر من 0.50.
يجب أن يكون Prediction دقيقاً في المكان (\(IoU \ge 0.5\)) ليُحسب كـ إيجابي صحيح (TP).
ماذا يحدث عندما يكون \(IoU < 0.5\)؟
يؤلم درجتك مرتين:
توقع واحد سيء المكان = يُعاقب النموذج كأنه اكتشاف إضافي خاطئ و كائن ضائع في نفس الوقت.
سؤال شائع: “ماذا لو توقع النموذج صناديق متعددة لنفس الشيء تماماً؟”
القاعدة: حقيقة واحدة = TP واحد فقط
بمجرد حصولنا على AP لكل فئة (سيارات، مشاة، أشجار، إلخ)، نأخذ ببساطة المتوسط الحسابي لها.
\[mAP = \frac{AP_{cars} + AP_{pedestrians} + AP_{trees} + ...}{Total\ Number\ of\ Classes}\]
في التجزئة (Segmentation)، نقوم بتقييم مدى تداخل البكسلات، وليس فقط مربعات الإحاطة.
\[ \begin{aligned} \text{mIoU} &= \frac{Area\ of\ Overlap}{Area\ of\ Union} \\[12pt] &= \mathbf{\frac{TP}{TP + FP + FN}} \end{aligned} \]
في Ultralytics، يعتبر Mask mAP هو المقياس الأساسي لمهام التجزئة، ويتم حسابه باستخدام عتبات IoU على مستوى البكسل.
المقياس الأكثر شيوعاً في الذكاء الاصطناعي الطبي. وهو متطابق رياضياً مع F1 Score على مستوى البكسل.
\[ \begin{aligned} \text{Dice} &= \frac{2 \times Area\ of\ Overlap}{Area\ of\ GT + Area\ of\ Pred} \\[12pt] &= \mathbf{\frac{2TP}{2TP + FP + FN}} \end{aligned} \]
لماذا معامل دايس؟ لأنه أفضل للكائنات الصغيرة جداً (مثل الأورام في الصور الطبية) ويوفر عقوبة أكثر توازناً للأخطاء.
نستخدم وضع val لتقييم النموذج المدرب. تقوم YOLO تلقائياً بإنشاء رسوم بيانية مثل (confusion_matrix.png, PR_curve.png) في مجلد runs/detect/val.
مرجع التوثيق: رؤى تقييم النموذج
val()عند تشغيل model.val()، تحصل على كائن مقاييس يحتوي على جميع الأرقام الرئيسية:
from ultralytics import YOLO
model = YOLO("best.pt")
metrics = model.val(data="data.yaml")
# الوصول للمقاييس الرئيسية:
print(f"mAP@0.5: {metrics.box.map50}" # عتبة IoU متساهلة
print(f"mAP@0.5-0.95: {metrics.box.map}" # متوسط صارم عبر 10 عتبات IoU
print(f"Precision: {metrics.box.mp}" # الضبط الإجمالي
print(f"Recall: {metrics.box.mr}" # الاستدعاء الإجماليمرجع التوثيق: نتائج التحقق
يمكنك الآن قراءة نتائج التحقق — ولكن ماذا تفعل عندما تبدو الأرقام سيئة؟
الأسباب الأكثر شيوعاً هي:
دعونا نمر على كل واحدة منها.
كيف نمنع النموذج من تجاهل الفئات النادرة أثناء التدريب؟
هنا نقوم بـ “زيادة العينات” (Oversampling) للفئة الأقلية (السيارة) لجعلها قابلة للتعلم.
دليل تقني: موازنة الفئات مع YOLO
كل جولة تدريب تقع في مكان ما على هذا الطيف — معرفة أين تقع هي الخطوة الأولى لإصلاحها.
🔴 الإفراط (Overfitting)
النموذج يحفظ بيانات التدريب بدلاً من تعلم الأنماط العامة.
سعة النموذج أكبر بكثير من البيانات المتاحة.
🟢 التعميم (Just Right)
النموذج يعمم الأنماط على البيانات الجديدة.
هذا هو الهدف — ابقَ هنا.
🟠 عدم الكفاية (Underfitting)
النموذج لم يتعلم الأنماط أبداً.
سعة النموذج قليلة جداً أو التدريب غير كافٍ.
يحفظ النموذج بيانات التدريب بدلاً من تعلم الأنماط العامة.
ماذا تلاحظ:
تنوع أكبر في البيانات (أفضل علاج)
مشاهد متنوعة لا يستطيع النموذج حفظها بسهولة.
التعزيز (Augmentation)
Mosaic, flip, blur — مفعلة افتراضياً في YOLO.
نموذج أصغر
مجموعة بيانات صغيرة؟ ابدأ بـ yolo11n أو yolo11s.
ابدأ بـ التعزيز + صبر (patience). إذا استمر الإفراط، ارفع قيمة weight_decay.
لم يتعلم النموذج الأنماط — إما لأنه بسيط جداً، أو مقيد للغاية، أو لم يتم تدريبه كفاية.
ماذا تلاحظ:
الحالة المثالية:
استخدم هذا كمرجع عند قراءة منحنيات الخسارة الخاصة بك.
| ما تراه | المشكلة | الإجراءات |
|---|---|---|
| دقة التدريب >> دقة التحقق، خسارة التحقق ترتفع | 🔴 إفراط (Overfitting) | أضف تعزيزاً · زد weight_decay · اضبط patience |
| كلتا الدقتين منخفضة ومسطحة، الخسارة بالكاد تتحرك | 🟠 عدم كفاية (Underfitting) | نموذج أكبر · زيادة epochs · ارفع lr0 · قلل weight_decay |
| كلتا الخسارتين تتقاربان، الدقة ترتفع | 🟢 صحي (Healthy) | استمر في التدريب أو ابدأ النشر |
راقب كلا المنحنيين دائماً. دقة تدريب 99% لا تعني شيئاً إذا كان أداء التحقق فاشلاً.
يمكنك الآن تشخيص المشكلة — إليك الأدوات (الروافع) لإصلاحها.
| الأداة | ما تعالجه |
|---|---|
| تعزيز البيانات (Data Augmentation) | الإفراط، مجموعات البيانات الصغيرة، اختلاف ظروف التصوير |
| معدل التعلم (Learning Rate) | التدريب غير المستقر أو المتوقف |
| اضمحلال الوزن (Weight Decay) | الإفراط (منع النموذج من الحفظ) |
| التوقف المبكر (Early Stopping) | إهدار الموارد الحاسوبية، الإفراط |
المفهوم: زيادة تنوع بيانات التدريب اصطناعياً عبر تطبيق تحويلات على الصور الموجودة.
متى يساعد:
YOLO تدعم مكتبة Albumentations بشكل طبيعي لتحسين قوة النموذج:
import albumentations as A
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# تعريف تحويلات Albumentations مخصصة
custom_transforms = [
A.Blur(blur_limit=7, p=0.5),
A.RandomCrop(width=256, height=256),
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),
]
# تدريب النموذج مع التحويلات المخصصة
model.train(data="data.yaml", epochs=100, augmentations=custom_transforms)مرجع التوثيق: تكامل Albumentations
🔴 مرتفع جداً: قفزات/ضجيج. النموذج “يقفز” فوق الحل الأمثل.
🔵 منخفض جداً: خط مسطح. النموذج “خجول” جداً لدرجة لا تسمح له بالتعلم.
🟢 مناسب تماماً: انخفاض سلس وسريع نحو مستوى منخفض.
| الإعداد | التأثير |
|---|---|
| منخفض جداً | حفظ البيانات ← 🔴 إفراط (Overfitting) |
| مرتفع جداً | قيود زائدة ← 🟠 عدم كفاية (Underfitting) |
الآن بعد أن عرفت كيفية قراءة المنحنيات، فلنصلح نموذجاً!
labs/04b_evaluation_technical.ipynbالهدف: تعلم التمييز بين النموذج الذي “يحفظ” والنموذج الذي “يعمم”.
عندما تكون مقاييس التحقق لنموذجك قوية، فهذا يعني أنه جاهز للخطوة التالية — نقله إلى الإنتاج.
نقل النموذج إلى مرحلة الإنتاج.
ملف PyTorch .pt ممتاز للبحث، لكنه بطيء في الإنتاج. حول نموذجك إلى صيغ محسنة باستخدام وضع export!
مرجع التوثيق: التصدير
لا تحتاج إلى كود نشر معقد لاستخدام نماذجك المصدرة. تقوم واجهة Ultralytics البرمجية بتحميلها تماماً مثل ملف PyTorch .pt العادي!
مرجع التوثيق: Prediction بالنماذج المصدرة
ملخص الدورة
يُسعدني الإجابة على استفساراتكم ومناقشاتكم