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

الوحدة 3 — الكشف ذو المرحلة الواحدة: YOLO وSSD

انتهت الوحدة السابقة إلى نتيجة عمليّة: عائلة R-CNN تُقدّم دقّة ممتازة لكنّها بطيئة جدًّا للتطبيقات الزمنية الحقيقية. لتحليل فيديو كاميرا التقاطع بسرعة 30 إطارًا في الثانية على جهاز متواضع، نحتاج إلى مقاربة أخرى: كواشف ذات مرحلة واحدة تنتج التنبّؤات مباشرة من الشبكة بلا مرحلة اقتراح.

المبدأ الأساسي: تنبّؤات كثيفة على شبكة

الفكرة الجوهرية بسيطة: نُقسّم الصورة إلى شبكة خلايا، ونجعل كلّ خليّة مسؤولة عن التنبّؤ بالأجسام التي يقع مركزها فيها. لكلّ خليّة، تُنتج الشبكة عدّة تنبّؤات مباشرةً:

  • إحداثيات صناديق: إزاحة نسبةً إلى الخليّة، وعرض وارتفاع
  • درجة ثقة تُقدّر احتمال احتواء الخليّة على جسم
  • توزيع احتمالي على الأصناف

لا مرحلة اقتراح، لا شبكتان منفصلتان، لا حساب مضاعف. مرور أمامي واحد على الصورة يُعطي كلّ التنبّؤات دفعةً واحدة. هذا ما يعطي هذه العائلة اسمها الشائع: «تنظر مرّة واحدة فقط» (You Only Look Once).

YOLO: تاريخ من التبسيط

YOLOv1 الذي طرحه Joseph Redmon في 2016 قسّم الصورة إلى شبكة 7×7، ولم يستخدم مراسي. كان سريعًا لكنّه ضعيفًا على الأجسام الصغيرة والمزدحمة، وهذا بالضبط ما نواجهه على تقاطع طرق مزدحم عند ساعة الذروة.

طرح YOLOv2 المراسي (سنعود إليها في الوحدة 4)، وYOLOv3 هرم السمات على ثلاث مقاييس متعدّدة لالتقاط الأجسام بأحجامها المختلفة. YOLOv4 وYOLOv5 حسّنا الأداء عبر تقنيات تدريب أفضل: تكثيف Mosaic، وMixUp، وضبط أنيق للأوزان.

اليوم، YOLOv8 من Ultralytics هو المرجع العملي. أضاف ثلاث فوائد ملموسة: بلا مراسي (anchor-free) — التنبّؤ المباشر لموقع الجسم دون مراسي مُعرَّفة سلفًا، ما يُبسّط التدريب؛ فصل رؤوس التصنيف والصندوق لخفض التداخل بين المهمّتين؛ ودعم متكامل للتقطيع والتصنيف في المكتبة نفسها.

يُقدّم YOLOv8-n (النسخة nano) قرابة 100 إطار في الثانية على GPU متوسّط، وهو ما يُغطّي حاجات المشروع الزمنية بسهولة.

from ultralytics import YOLO

# تحميل النموذج المدرب مسبقا على COCO
model = YOLO("yolov8n.pt") # nano: اسرع وأخف
# model = YOLO("yolov8m.pt") # medium: توازن جيد
# model = YOLO("yolov8l.pt") # large: دقة اعلى

# كشف على صورة من كاميرا التقاطع
results = model(
"carrefour_10h32.jpg",
conf=0.5, # عتبة الثقة
iou=0.45, # عتبة NMS (الوحدة 4)
classes=[0, 2, 5], # مشاة، سيارة، حافلة في COCO
)

# نقرا اول نتيجة (صورة واحدة)
result = results[0]
boxes = result.boxes.xyxy # (N, 4)
scores = result.boxes.conf # (N,)
labels = result.boxes.cls # (N,)

print(f"عدد الاجسام المكتشفة: {len(boxes)}")

SSD: مقاييس متعدّدة على طبقات مختلفة

Single Shot MultiBox Detector (Liu et al.، 2016) طبّق فكرة قريبة، لكنّه اختار الكشف على مقاييس متعدّدة من طبقات مختلفة للشبكة. الطبقات المبكرة، ذات الدقّة العالية، تكشف الأجسام الصغيرة. والطبقات العميقة، ذات الدقّة المنخفضة والحقل الاستقبالي الواسع، تكشف الأجسام الكبيرة.

هذا التصميم يعالج مباشرة تحدّي مشروعنا: مُشاة صغير في أعمق الصورة مقابل حافلة تحتلّ ربع الإطار. SSD كان أوّل من عالج هذا صراحةً، وطُبّق لاحقًا في YOLOv3 وما بعده باسم Feature Pyramid Network (FPN).

RetinaNet وFocal Loss: مشكلة عدم توازن الأصناف

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

طرح RetinaNet (Lin et al.، 2017) Focal Loss، خسارة معدّلة تُخفض وزن الأمثلة السهلة وتُبرز الصعبة:

Lfocal=α(1pt)γlog(pt)\mathcal{L}_{\text{focal}} = -\alpha (1 - p_t)^{\gamma} \log(p_t)

حيث ptp_t احتمال النموذج للصنف الصحيح. حين يكون التنبّؤ صائبًا وواثقًا (pt1p_t \approx 1)، العامل (1pt)γ(1 - p_t)^{\gamma} يُقارب الصفر، فيصير إسهام هذا المثال في الخسارة مهملًا. أمّا الأمثلة الصعبة، حيث ptp_t صغير، فتحتفظ بوزن كامل تقريبًا.

القيمة γ=2\gamma = 2 هي الأكثر استعمالًا. يُحوّل هذا التعديل كواشف المرحلة الواحدة إلى منافسين حقيقيين لعائلة R-CNN على الدقّة، دون فقدان مزيّة السرعة.

متى نختار مرحلة واحدة ومتى مرحلتين؟

المعيارمرحلة واحدة (YOLO، SSD)مرحلتان (Faster R-CNN)
السرعة60 إلى 100+ FPS15 إلى 20 FPS
الدقّة العامّةجيّدةممتازة
الأجسام الصغيرةمتوسّطة (تحسّن مع FPN)جيّدة
الأجسام المزدحمةحسّاسة لعتبة NMSجيّدة
النشر على أجهزة الحافةممتازصعب
الاستهلاك الحسابيمنخفضمرتفع

بالنسبة لمشروعنا — عدّ السيّارات والمُشاة على تقاطع طرق بكاميرا ثابتة — الاختيار يميل بوضوح نحو YOLOv8. سنستخدمه في المشروع الختامي بالوحدة 10.

لا تُقارن نموذجين على ورق واحد

جدول المفاضلة أعلاه تقريبي، وأرقام السرعة والدقّة تتغيّر بحسب حجم النموذج، ودقّة الدخل، وعتبة NMS، والأجهزة. حين تختار بين نموذجين حقيقيين لمشروع محدّد، شغّل الاثنين على بياناتك أنت بالإعدادات نفسها، وقس السرعة على جهاز النشر لا على GPU تدريبك. أوراق البحث تُبلّغ عن مقاييس COCO على GPU مختبرية عالية الأداء، وهي غالبًا بعيدة عن واقع النشر بأمر مقدار.

في الخلاصة

  • الكواشف ذوات المرحلة الواحدة تُنتج التنبّؤات مباشرة من الشبكة على شبكة خلايا، بلا مرحلة اقتراح مستقلّة.
  • تطوّرت عائلة YOLO من v1 إلى v8، بإضافة المراسي ثم إلغائها، والهرم متعدّد المقاييس، وفصل الرؤوس، وتقنيات تدريب أفضل.
  • SSD أدخل الكشف على مقاييس متعدّدة من طبقات مختلفة، وRetinaNet حلّ مشكلة عدم توازن خلفية/جسم بـFocal Loss.
  • ذوات المرحلة الواحدة أسرع بأمر مقدار وتُلائم النشر في الزمن الحقيقي وعلى أجهزة الحافة؛ ذوات المرحلتين تبقى أدقّ على الأجسام الصغيرة المزدحمة.

الوحدة التالية: المراسي وقمع غير الحدّ الأقصى (NMS) والعتبات — الآليات الدقيقة التي تُحوّل عشرات الآلاف من التنبّؤات الخام إلى قائمة نظيفة من الكشوف.