الرؤية الحاسوبية2016متوسط10 دقيقة قراءة

SSD: كاشف متعدد الصناديق بتمريرة واحدة

SSD: Single Shot MultiBox Detector

Liu, W. · Anguelov, D. · Erhan, D. · Szegedy, C. · Reed, S. · Fu, C.-Y. · Berg, A. C. — ECCV

المشكلة

حتى عام 2015، كان كشف الكائنات الدقيق يمرّ بمرحلتين: الأولى توليد مناطق مرشَّحة (كما في Faster R-CNN)، والثانية تصنيف كل منطقة على حدة. هذا الأسلوب — «رشِّح ثم صنِّف» — كان دقيقاً لكنه بطيء جداً على التطبيقات الفورية كالقيادة الذاتية والمراقبة الأمنية. وفي الاتجاه المقابل، ظهرت كواشف تعمل بتمريرة واحدة مثل YOLO v1 وكانت سريعة، لكنها ضعيفة في رصد الأجسام الصغيرة لأنها تعتمد على خريطة سمات واحدة خشنة الدقة.

الإسهام

SSD: كاشف أحادي المرحلة يتنبّأ من عدة خرائط سمات بدقّات مكانية مختلفة في آنٍ واحد. تستخلص شبكة VGG-16 الأساسية السمات، ثم تتولّى ست خرائط سمات متدرّجة الحجم (من 38×38 نزولاً إلى 1×1) التنبؤ بصناديق الإحاطة عبر صناديق افتراضية بنسب أبعاد متنوّعة. تتنبّأ الشبكة بدرجات التصنيف وإزاحات الموضع لكل في تمريرة أمامية واحدة — دون حاجة إلى مرحلة ترشيح مناطق. يُثبِّت َ كلٌّ من وتوسيع البيانات المكثّف. حقّق SSD300 دقة 74.3% mAP على VOC2007 بسرعة 59 إطاراً في الثانية — أسرع من Faster R-CNN وأدقّ من YOLO.

الأثر

أثبت SSD أن الكواشف أحادية المرحلة قادرة على بلوغ دقة نظيراتها ثنائية المرحلة مع الحفاظ على سرعة الزمن الحقيقي. الفكرة التي أطلقها — كشف الأجسام الصغيرة من الطبقات المبكّرة عالية الدقة والأجسام الكبيرة من الطبقات العميقة منخفضة الدقة — صارت الأساس الذي بُنيت عليه شبكة هرم السمات (FPN) وRetinaNet. كل كاشف حديث بدءاً من YOLOv3 يعتمد على سمات متعددة المقاييس يعود أصلها إلى تصميم SSD.

تخيّل حارس أمن يراقب مبنى عبر ست شاشات، كل واحدة تعرض المشهد نفسه بمستوى تقريب مختلف. على الشاشة المقرَّبة يلمح محفظة سقطت على الأرض، وعلى الشاشة الواسعة يلاحظ شاحنة توصيل تدخل الموقف. لا يتفحّص شاشة ثم ينتقل للتالية — بل يمسح الشاشات الست دفعةً واحدة ويُبلّغ عن كل شيء في لحظة.

هذا هو SSD. الكواشف السابقة كانت كحارسٍ يطوف حول المبنى أولاً ليُعدّ قائمة بـ«المناطق المشبوهة» ()، ثم يعود ليتحقّق من كل واحدة. أما SSD فيتخطّى جولة الاستطلاع بالكامل — نظرة واحدة عبر الشاشات الست وكل جسم يُكتشف.

المشكلة: السرعة أم الدقة — هل لا بدّ من الاختيار؟

قبل ظهور SSD، كان ميدان منقسماً إلى مدرستين:

  • مثل Faster R-CNN تبدأ بتوليد مناطق مرشَّحة ثم تصنّف كل منطقة على حدة. دقيقة (73.2% mAP على VOC2007) لكنها بطيئة — 7 إطارات في الثانية فقط. كل جسم محتمل يحتاج مستقلة عبر المصنِّف.

  • مثل YOLO v1 تتنبّأ بكل شيء في تمريرة واحدة. سريعة (45 إطاراً في الثانية) لكنها تعاني مع الأجسام الصغيرة، لأن الصورة تُقسَّم إلى شبكة خشنة 7×7 — أي جسم أصغر من خلية في هذه الشبكة يكاد يكون مخفياً عن الكاشف.

المجتمع البحثي كان بحاجة إلى كاشف سريع ودقيق معاً. الفكرة المفتاحية التي جاء بها SSD: لا داعي للاختيار بين السرعة والدقة إذا تنبّأت على مقاييس متعددة في الوقت نفسه.

افتح في المختبر
قارن بين أسلوب المرحلتين (رشِّح ← صنِّف) وأسلوب SSD بتمريرة واحدة. لاحظ كيف يستغني SSD عن مرحلة الترشيح كلياً.
تستيقظ التجربة عند وصولك…

الفكرة المحورية: اكشف على كل مقياس

بنية SSD مكوَّنة من جزأين: (VGG-16 مدرَّبة مسبقاً على ImageNet) تستخلص السمات، ومجموعة طبقات التفافية مساعدة تُقلّص تدريجياً. تخيّلها كهرم من ست منصّات مراقبة على ارتفاعات مختلفة — كل منصّة تطلّ على المشهد بمستوى تقريب خاص بها:

  • Conv4_3 ‏(38×38) — دقة عالية و صغير ← ترصد الأجسام الصغيرة كالأكواب وأجهزة التحكم.
  • Conv7 ‏(19×19) — دقة متوسطة ← تلتقط الأجسام المتوسطة كالكراسي والشاشات.
  • Conv8_2 ‏(10×10)، Conv9_2 ‏(5×5) — دقة أقل ورؤية أعرض ← تكشف الأجسام الكبيرة كالطاولات والأشخاص.
  • Conv10_2 ‏(3×3)، Conv11_2 ‏(1×1) — أدنى دقة وأوسع مجال رؤية ← تتولّى الأجسام الكبيرة جداً وسياق المشهد ككل.

عند كل موقع في كل خريطة سمات، تضع الشبكة مجموعة من الصناديق الافتراضية (تُعرف أيضاً بـ) بنسب أبعاد مختلفة. لكل صندوق تتنبّأ الشبكة بشيئين: (1) احتمال انتمائه لكل فئة بما فيها «الخلفية»، و(2) أربع إزاحات (Δcx، Δcy، Δw، Δh) تُعدِّل الصندوق ليُحكِم الإطار حول الجسم الحقيقي.

افتح في المختبر
انقر على طبقات خرائط السمات المختلفة لترى كيف يتخصّص كل مقياس في حجم معيّن من الأجسام. كلما كبرت خريطة السمات، رصدت أجساماً أصغر.
تستيقظ التجربة عند وصولك…

الصناديق الافتراضية: قوالب جاهزة في كل موقع

التنبؤ بالصناديق من الصفر مهمة صعبة على الشبكة، لذلك ينطلق SSD من مجموعة صناديق افتراضية مُعدَّة سلفاً — بمنزلة قوالب جاهزة. عند كل موقع في خريطة السمات، يُرصِّف SSD عدة صناديق بنسب أبعاد مختلفة (1:1، 2:1، 1:2، 3:1، 1:3) إضافةً إلى مربّعين بمقياسين متقاربين. مهمة الشبكة ليست اختراع صناديق من لا شيء، بل تعديل هذه القوالب وإزاحتها لتنطبق على الأجسام بدقة أكبر.

كل خريطة سمات تستخدم مقياساً أساسياً مختلفاً لصناديقها. تتدرّج هذه المقاييس خطياً من 0.2 (لأدقّ خريطة) إلى 0.9 (لأخشنها)، فتُغطّي الخرائط الست معاً كامل نطاق أحجام الأجسام. بمعدل 4 إلى 6 صناديق في كل موقع عبر الخرائط الست، يُخرج SSD ما مجموعه 8,732 تنبؤاً — كلها في تمريرة أمامية واحدة.

sk=smin+smaxsminm1(k1),k[1,m]s_k = s_{\min} + \frac{s_{\max} - s_{\min}}{m - 1}(k - 1), \quad k \in [1, m]
معادلة مقياس الصندوق الافتراضي — كيف تتدرّج أحجام الصناديق عبر خرائط السماتs_min = 0.2، s_max = 0.9، m = عدد خرائط السمات. كل خريطة رقمها k تحصل على مقياس أساسي s_k. نسب الأبعاد {1، 2، 3، 1/2، 1/3} تحدّد العرض والارتفاع: w = s_k√a_r، h = s_k/√a_r.
افتح في المختبر
حرّك شريط المقياس وبدّل بين نسب الأبعاد لترى كيف تُغطّي الصناديق الافتراضية خلية الصورة.
تستيقظ التجربة عند وصولك…

جولة في البنية: من البكسلات إلى 8,732 تنبؤاً

يمرّ SSD بثلاث مراحل متتالية:

المرحلة الأولى — استخلاص السمات (الشبكة الأساسية VGG-16). الصورة المُدخلة (300×300) تعبر الطبقات الالتفافية في VGG-16 حتى Conv5_3. ثم تُحوَّل الطبقتان كاملتا الاتصال FC6 وFC7 إلى طبقات التفافية (عبر الاختزال)، فتُنتِجان أول خريطتَي سمات يُبنى عليهما التنبؤ. هذا التحويل هو ما يجعل SSD شبكة التفافية بالكامل — نظرياً لا يلزم حجم مُدخل ثابت.

المرحلة الثانية — الطبقات الالتفافية المساعدة. تُضاف أربعة أزواج من الطبقات الالتفافية بعد شبكة VGG. كل زوج يُنصِّف الأبعاد المكانية، فيتشكّل هرم من خرائط السمات: 10×10، 5×5، 3×3، 1×1. كلما صغرت الخريطة اتّسع حقل الاستقبال لكل موقع فيها، أي أنه يرى رقعة أكبر من الصورة الأصلية — كأنك تتراجع خطوة بخطوة لترى المشهد الأعرض.

المرحلة الثالثة — طبقات التنبؤ. عند كل خريطة من الخرائط الست، يُطبَّق مرشّح التفافي 3×3 لكل صندوق افتراضي، فيُنتِج (C+4) مخرجات: C درجة تصنيف و4 إزاحات . لا طبقات كاملة الاتصال، لا مقترحات مناطق، ولا إعادة عيّنة للسمات. الخطّ بأكمله شبكة تغذية أمامية واحدة.

افتح في المختبر
انقر على أي طبقة لتعرف دورها وأبعادها وعدد التنبؤات الصادرة عنها.
تستيقظ التجربة عند وصولك…

التدريب: المطابقة والتنقيب ودالة الخسارة

يقوم تدريب SSD على ثلاث آليات تعمل يداً بيد:

إستراتيجية المطابقة. يُطابَق كل حقيقي () مع الصندوق الافتراضي الذي يحقّق أعلى (IoU). بعدها، كل صندوق افتراضي متبقٍّ يتجاوز تقاطعه مع أي حقيقة أرضية عتبة 0.5 يُصنَّف هو أيضاً كعيّنة إيجابية. هذا يضمن أن كل جسم حقيقي يرتبط بمُتنبّئ واحد على الأقل، ويتيح أيضاً للصناديق المجاورة أن تتعلّم من الجسم ذاته.

التنقيب عن السلبيات الصعبة. مع 8,732 صندوقاً وعدد أجسام لا يتجاوز العشرات عادةً، الغالبية الساحقة من الصناديق هي «خلفية». لو دُرِّبت الشبكة على جميع السلبيات بالتساوي لطغت على الإيجابيات وتعلّم النموذج أن يقول «خلفية» لكل شيء. لذلك يرتّب SSD الصناديق السلبية حسب حجم خطئها في التصنيف ويختار الأعلى خسارة فقط، مع الحفاظ على نسبة 3:1 بين السلبيات والإيجابيات. بهذا يتركّز التدريب على أصعب الأخطاء بدل إهدار الطاقة على حالات بديهية.

. تُحوَّل كل صورة تدريبية عشوائياً: انعكاس أفقي، اقتصاص عشوائي بحدود IoU دنيا (0.1، 0.3، 0.5، 0.7، 0.9)، تشويهات لونية، وتوسيع عشوائي (تصغير الصورة داخل إطار أكبر). هذا التوسيع المكثّف حاسم لكشف الأجسام الصغيرة — فالاقتصاص العشوائي الذي يجعل جسماً صغيراً يملأ معظم الإطار يُعلّم الكاشف رؤيته وكأنه جسم أكبر.

L(x,c,l,g)=1N[Lconf(x,c)+αLloc(x,l,g)]L(x, c, l, g) = \frac{1}{N}\Big[L_{\text{conf}}(x, c) + \alpha \, L_{\text{loc}}(x, l, g)\Big]
خسارة تدريب SSD — التصنيف + التموضعN = عدد الصناديق الافتراضية المطابقة · L_conf = إنتروبيا متقاطعة بدالة softmax على درجات ثقة التصنيف · L_loc = خسارة Smooth L1 على إزاحات الصندوق (Δcx، Δcy، Δw، Δh) · α = 1 (يوازن بين الحدّين) · عندما N = 0 تُضبط الخسارة على صفر.

بعد التنبؤ: كبت غير الأقصى

مع 8,732 تنبؤاً لكل صورة، كثير من الصناديق ستتراكم على الجسم نفسه. (NMS) يتولّى تنظيف هذا التكرار: يبدأ بحذف كل صندوق أقل من 0.01، ثم لكل فئة يرتّب الصناديق المتبقية من الأعلى ثقةً إلى الأدنى، ويحذف تباعاً كل صندوق يتقاطع (IoU > 0.45) مع صندوق أعلى منه ثقةً. الصناديق التي تنجو هي الكشوفات النهائية. فكّر فيها كتصويت لجنة — حين يدّعي أكثر من صندوق أنه يحتوي الجسم نفسه، يُقبل رأي الأعلى ثقةً فقط.

افتح في المختبر
اضغط «كشف» لتظهر التنبؤات الخام، ثم «طبّق NMS» لتشاهد الصناديق المتداخلة تختفي.
تستيقظ التجربة عند وصولك…

النتائج: دقة بسرعة الزمن الحقيقي

حقّق SSD المعادلة الصعبة — السرعة والدقة معاً — وسدّ الفجوة التي ظلّت تُعرِّف هذا الميدان:

SSD300 (مُدخل 300×300): دقة 74.3% mAP على VOC2007 بسرعة 59 إطاراً في الثانية على معالج Titan X. أي ما يعادل دقة Faster R-CNN لكن بسرعة تفوقها ثمانية أضعاف.

SSD512 (مُدخل 512×512): دقة 76.8% mAP على VOC2007 بسرعة 22 إطاراً في الثانية. التضحية بقدر من السرعة مقابل دقة وضوح أعلى حسّنت كشف الأجسام الصغيرة بوضوح.

على مجموعة COCO، حقّق SSD512 دقة 26.8% mAP — متفوّقاً على Faster R-CNN ‏(21.9%) وION ‏(23.6%) مع بقائه في نطاق الأداء الفوري. دراسات الحذف التجريبي أكّدت أن التنبؤ هو العامل الأكثر تأثيراً: استخدام ست خرائط سمات بدل واحدة رفع mAP من 62.4% إلى 74.3%.

افتح في المختبر
قارن إصدارات SSD مع Faster R-CNN وYOLO على محور المفاضلة بين السرعة والدقة.
تستيقظ التجربة عند وصولك…

الفكرة نفسها في شيفرة برمجية

رأس التنبؤ في SSD — استخراج الصناديق والفئات من خريطة السماتpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import torch
import torch.nn as nn

class SSDPredictionHead(nn.Module):
    """لكل خريطة سمات، يتنبّأ بدرجات التصنيف + إزاحات الصناديق
    لكل صندوق افتراضي في كل موقع مكاني."""

    def __init__(self, in_channels, num_classes, num_boxes):
        super().__init__()
        # التفاف 3×3: تنبؤ بدرجات التصنيف لكل صندوق افتراضي
        self.cls_conv = nn.Conv2d(
            in_channels,
            num_boxes * num_classes,   # مثلاً: 6 صناديق × 21 فئة
            kernel_size=3, padding=1
        )
        # التفاف 3×3: تنبؤ بأربع إزاحات (dx, dy, dw, dh) لكل صندوق
        self.loc_conv = nn.Conv2d(
            in_channels,
            num_boxes * 4,             # مثلاً: 6 صناديق × 4 إزاحات
            kernel_size=3, padding=1
        )

    def forward(self, feature_map):
        # feature_map: (دفعة، قنوات، ارتفاع، عرض)
        cls = self.cls_conv(feature_map)  # (دفعة، صناديق×فئات، H, W)
        loc = self.loc_conv(feature_map)  # (دفعة، صناديق×4، H, W)
        return cls, loc

# يُطبَّق هذا الرأس على كل واحدة من خرائط السمات الست:
# Conv4_3 (38×38، 4 صناديق) + Conv7 (19×19، 6 صناديق) + ...
# المجموع: 38²×4 + 19²×6 + 10²×6 + 5²×6 + 3²×4 + 1²×4 = 8732 صندوقاً

لماذا غيّر الكشف متعدد المقاييس قواعد اللعبة

  1. 2014

    R-CNN

    أول كاشف كائنات يعتمد التعلّم العميق. استخدم البحث الانتقائي لتوليد نحو 2,000 منطقة مرشَّحة، ثم صنّف كلاً منها بشبكة التفافية. دقيق لكنه بطيء جداً — 47 ثانية للصورة الواحدة.

  2. 2015

    Faster R-CNN

    استبدل البحث الانتقائي بشبكة اقتراح مناطق (RPN) تتشارك السمات مع الكاشف. بلغ دقة 73.2% mAP على VOC2007 لكنه لم يتجاوز 7 إطارات في الثانية.

  3. 2015

    YOLO v1

    أول كاشف أحادي المرحلة — تمريرة أمامية واحدة بلا ترشيح مناطق. بلغ 45 إطاراً في الثانية لكن بدقة 63.4% mAP فقط، ويعاني مع الأجسام الصغيرة بسبب شبكته الخشنة 7×7.

  4. 2016

    SSD

    سدّ الفجوة: التنبؤ متعدد المقاييس من 6 خرائط سمات وفّر السرعة (59 إطاراً في الثانية) والدقة (74.3% mAP) معاً. أثبت أن الكاشف أحادي المرحلة قادر على بلوغ جودة ثنائي المرحلة.

  5. 2017

    شبكة هرم السمات (FPN)

    أعطت فكرة SSD متعددة المقاييس إطاراً رسمياً بإضافة مسارات هابطة مع وصلات جانبية، تُثري السمات منخفضة المستوى بالمعلومات الدلالية العميقة.

  6. 2017

    RetinaNet

    جمعت بين FPN وخسارة التركيز البؤري — دالة خسارة تُقلّل وزن السلبيات السهلة تلقائياً، فاستبدلت التنقيب اليدوي عن السلبيات الصعبة في SSD بحلّ أنظف.

تصميم SSD متعدد المقاييس أصبح المرجع الذي يحتذي به الميدان. FPN طوّرت الفكرة بإعادة ضخّ المعلومات الدلالية نزولاً إلى الطبقات الدقيقة، وRetinaNet عالجت مشكلة بأناقة أكبر عبر خسارة التركيز البؤري. لكن المبدأ الجوهري — التنبؤ على دقّات مكانية متعددة — يبقى المساهمة الأبرز لـ SSD في هذا الميدان.

المرجعLiu, Anguelov, Erhan, Szegedy, Reed, Fu, Berg. SSD: Single Shot MultiBox Detector. ECCV, 2016.

مصطلحات هذه الورقة