انتقل إلى المحتوى الرئيسي

الوحدة 5 — مقاييس الكشف: IoU ومتوسّط الدقّة

الوحدات السابقة عرضت كواشف تُنتج صناديق. لكن كيف نعرف أنّ نموذجًا أفضل من آخر؟ في التصنيف كانت الإجابة بسيطة: الدقّة. في الكشف، لا يوجد جواب واحد؛ التنبّؤ ليس صحيحًا أو خاطئًا، بل قد يكون جزئيًا — الصندوق في الموضع الصحيح لكنّه أصغر بقليل، أو أزيح ثلاث بكسلات. هذه الوحدة تعرض المقاييس القياسية التي تُتيح المقارنة العادلة.

IoU: قياس التداخل بين صندوقين

IoU (Intersection over Union) هو حجر الأساس. رأيناه في الوحدة السابقة كأداة لـNMS؛ نراه هنا كأداة تقييم. الصيغة:

IoU(A,B)=ABAB\text{IoU}(A, B) = \frac{|A \cap B|}{|A \cup B|}

قيمته بين 0 و1، وتقيس مدى تطابق صندوقين. عتبة IoU الشائعة للاعتبار «صحيحًا» هي 0.5: تنبّؤ يتطابق مع صندوق حقيقي بـIoU ≥ 0.5 يُعدّ إيجابيًا حقيقيًا (True Positive)، وأقلّ من ذلك يُعدّ إيجابيًا كاذبًا (False Positive).

حساب IoU يدويًا

خذ صندوقًا حقيقيًا لسيّارة، وصندوقًا مُتنبَّأ به:

  • الحقيقي: A=(x1,y1,x2,y2)=(100,200,300,400)A = (x_1, y_1, x_2, y_2) = (100, 200, 300, 400)
  • المُتنبَّأ: B=(120,210,320,410)B = (120, 210, 320, 410)

مساحة كلّ منهما: (300100)×(400200)=200×200=40000(300 - 100) \times (400 - 200) = 200 \times 200 = 40000

التقاطع: نأخذ الحدود الأشدّ:

  • x1=max(100,120)=120x_1 = \max(100, 120) = 120
  • y1=max(200,210)=210y_1 = \max(200, 210) = 210
  • x2=min(300,320)=300x_2 = \min(300, 320) = 300
  • y2=min(400,410)=400y_2 = \min(400, 410) = 400

مساحة التقاطع: (300120)×(400210)=180×190=34200(300 - 120) \times (400 - 210) = 180 \times 190 = 34200

الاتّحاد: 40000+4000034200=4580040000 + 40000 - 34200 = 45800

IoU=34200458000,747\text{IoU} = \frac{34200}{45800} \approx 0{,}747

أعلى من 0.5، فالتنبّؤ يُعدّ صحيحًا بعتبة IoU = 0.5.

دقّة واسترجاع في سياق الكشف

لكلّ صنف على حدة، ولعتبة IoU مُحدّدة، نُصنّف كلّ تنبّؤ:

  • إيجابي حقيقي (TP): تنبّؤ يتطابق مع صندوق حقيقي بـIoU ≥ العتبة
  • إيجابي كاذب (FP): تنبّؤ بلا صندوق حقيقي مطابق (كشف خاطئ، أو تكرار لصندوق سبق تعيينه)
  • سلبي كاذب (FN): صندوق حقيقي بلا تنبّؤ يطابقه (جسم فاتنا)

ثم:

Precision=TPTP+FP,Recall=TPTP+FN\text{Precision} = \frac{TP}{TP + FP}, \qquad \text{Recall} = \frac{TP}{TP + FN}

الدقّة تُجيب: من بين ما توقّعتُ، كم كان صحيحًا؟ الاسترجاع يُجيب: من بين الأجسام الفعلية، كم كشفتُ؟

منحنى الدقّة-الاسترجاع وAP

عتبة الثقة تُغيّر عدد التنبّؤات المحفوظة، ومعها الدقّة والاسترجاع. برفعها نحصل على تنبّؤات أقلّ وأكثر ثقةً (دقّة أعلى، استرجاع أقلّ)؛ بخفضها نحصل على تنبّؤات كثيرة وأقلّ يقينًا (استرجاع أعلى، دقّة أقلّ). كلّ عتبة تُنتج نقطة على المستوي (استرجاع، دقّة)، ومجموع النقاط يُشكّل منحنى الدقّة-الاسترجاع.

متوسّط الدقّة (Average Precision، AP) هو المساحة تحت هذا المنحنى لصنف واحد. بين 0 و1. AP = 1 يعني كاشفًا مثاليًا: يحفظ كلّ الأجسام الحقيقية دون أيّ خطأ. AP = 0.5 يعني أداءً متوسّطًا.

في COCO يُحسب AP بأخذ متوسّط الدقّة على 101 نقطة استرجاع مُساواة (0، 0.01، 0.02، ...، 1)، وهو تحسين على النسخة القديمة بـ11 نقطة.

mAP: المتوسّط عبر الأصناف

mean Average Precision (mAP) هو متوسّط AP لجميع الأصناف. للحصول على رقم موحّد يُقارن نموذجين، نجمع AP لكلّ صنف ونقسم على عدد الأصناف.

عتبة IoU تُغيّر النتيجة بشدّة. صيغتان مُعياريتان في COCO:

  • mAP@0.5: عتبة IoU واحدة عند 0.5 (متسامحة). كانت المقياس الأشيع مع Pascal VOC.
  • mAP@0.5:0.95: متوسّط mAP على عشر عتبات IoU من 0.5 إلى 0.95 بخطوة 0.05. هذا هو المقياس الأساسي في COCO اليوم، ويُكافئ نماذج تُنتج صناديق أدقّ.

الفرق بين النموذجين يمكن أن يكون كبيرًا. نموذج بـmAP@0.5 = 0.65 وmAP@0.5:0.95 = 0.35 هو نموذج يكشف جيّدًا لكنّه غير دقيق في تحديد الموضع. نموذج آخر بـmAP@0.5 = 0.60 لكن mAP@0.5:0.95 = 0.45 هو أفضل عمليًا لتطبيق يحتاج إلى صناديق دقيقة (مثل قياس عرض السيّارة لتحديد ما إذا كانت شاحنة).

قراءة تقرير COCO كاملًا

عند تقييم نموذج بأداة COCO الرسمية، يُطبع تقرير كامل يُشبه:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.412
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.615
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.443
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.243
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.451
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.532
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.315
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.510
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.552

قراءة سطر بسطر تُنبّه إلى أشياء لا يراها النموذج على صورة واحدة:

  • الفارق الكبير بين small (0.243) وlarge (0.532) شائع جدًّا. الأجسام الصغيرة أصعب دائمًا: بكسلات قليلة، وضوضاء نسبية عالية، ومراسي غير ملائمة إن استُخدمت. مشروع عدّ المُشاة يُعاني هذا مباشرةً: المُشاة البعيد يكون «صغيرًا» بمعنى COCO (مساحة أقلّ من 32² بكسل).
  • الفارق بين AR@1 وAR@100 يُعطي فكرة عن جودة الترتيب: إن كانت AR@1 قريبة من AR@100، فأفضل تنبّؤات الكاشف عالية الجودة.
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval

# البيانات الحقيقية
coco_gt = COCO("annotations/instances_val.json")

# نتائج النموذج بصيغة COCO
coco_dt = coco_gt.loadRes("predictions.json")

evaluator = COCOeval(coco_gt, coco_dt, iouType="bbox")
evaluator.evaluate()
evaluator.accumulate()
evaluator.summarize() # يطبع التقرير اعلاه

# استخراج mAP الاساسي
map_50_95 = evaluator.stats[0]
map_50 = evaluator.stats[1]
print(f"mAP@0.5:0.95 = {map_50_95:.3f}")
print(f"mAP@0.5 = {map_50:.3f}")
اقرأ mAP دائمًا مع mAP@0.5 وmAP@0.5:0.95 معًا

مقياس واحد يُخفي دائمًا نصف الحقيقة. mAP@0.5 وحده يُغري بتفضيل نماذج تكشف الأجسام دون دقّة في الموضع؛ وmAP@0.5:0.95 وحده يُعاقب النماذج المفيدة عمليًا حين تكون دقّة البكسل غير حاسمة. أُفصّل الاثنين في أي تقرير للحكم، وأضف mAP على «small» إن كانت مشكلتك تضمّ أجسامًا بعيدة كمُشاة تقاطع الطرق في الأفق.

في الخلاصة

  • IoU يُقاس بنسبة التقاطع إلى الاتّحاد بين صندوقين، وعتبة 0.5 هي الحدّ الشائع لاعتبار تنبّؤ صحيحًا.
  • AP (Average Precision) هو المساحة تحت منحنى الدقّة-الاسترجاع لصنف واحد، عبر عتبات ثقة متغيّرة.
  • mAP@0.5 متسامح مع الموضع، وmAP@0.5:0.95 يُكافئ الدقّة في الموضع؛ اقرأ الاثنين معًا دائمًا.
  • تقرير COCO يُفصّل الأداء بحسب حجم الجسم (small، medium، large)؛ الأجسام الصغيرة تحتاج غالبًا إلى قرارات معمارية مختلفة (هرم سمات أعمق، دقّة دخل أعلى).

الوحدة التالية: التقطيع الدلالي مع U-Net وDeepLab، حيث ننتقل من الصناديق إلى تصنيف كلّ بكسل.