الرؤية الحاسوبية2015متوسط12 دقيقة قراءة
Fast R-CNN: اكتشاف أجسام أسرع بمعمارية موحّدة
Fast R-CNN
Girshick, R. — ICCV
المشكلة
في عام 2014 حققت R-CNN نتائج دقيقة في اكتشاف الأجسام، لكنها كانت بطيئة إلى حدٍّ غير عملي: كانت تُمرِّر كل مقترح منطقة — ونتحدث عن نحو ألفَي مقترح لكل صورة — عبر الشبكة الالتفافية بشكل مستقل، ثم تُخزِّن السمات المستخرجة على القرص، ثم تُدرِّب ثلاث مراحل كلٌّ منها منفصلة عن الأخرى: استخراج السمات، ثم مصنِّفات SVM، ثم انحدار صناديق الإحاطة. كان يستغرق 84 ساعة، على صورة واحدة يحتاج 47 ثانية. جاءت SPPnet وحسّنت السرعة بمشاركة الحوسبة الالتفافية، لكن طبقة تجميع الهرم المكاني فيها كانت تقطع تدفق التدرُّجات فلا تصل إلى الطبقات الالتفافية المبكرة، وبالتالي لم يكن ممكناً ضبط الشبكة الالتفافية الأساسية. الميدان كان بحاجة إلى بنية تجمع السرعة والتدريب الشامل من البداية إلى النهاية.
الإسهام
قدّم Fast R-CNN معمارية موحّدة تُدرَّب في مرحلة واحدة لاكتشاف الأجسام. الفكرة: مرِّر الصورة كاملةً عبر شبكة التفاف واحدة لتحصل على خريطة سمات مشتركة، ثم استخدم طبقة (RoI Pooling) لاستخراج تمثيل ثابت الحجم من كل مقترح منطقة. رأسا إخراج يعملان بالتوازي — مصنِّف softmax ومُنحدِر صندوق إحاطة — يُدرَّبان معاً بدالة خسارة متعددة المهام. الميزة الجوهرية أن جميع الطبقات، بما فيها الشبكة الالتفافية الأساسية، تُضبط بالكامل عبر الانتشار العكسي. النتيجة: تدريب أسرع 9 مرات من R-CNN، واستدلال أسرع 213 مرة، ودقة أعلى على PASCAL VOC 2012 (من 62.4% إلى 68.4% mAP).
الأثر
أثبت Fast R-CNN أن بالإمكان تدريب نظام اكتشاف أجسام كامل في مرحلة واحدة مع مشاركة السمات الالتفافية بين كل المقترحات — وهو مبدأ تبنّته كل معماريات الاكتشاف التي جاءت بعده. طبقة تجميع منطقة الاهتمام صارت الوسيط المعياري بين مقترحات المناطق ورؤوس ، ثم طُوِّرت لاحقاً إلى RoIAlign في Mask R-CNN. دالة الخسارة المشتركة التي تجمع التصنيف وتحديد الموقع أصبحت الإعداد الافتراضي في كل كاشف ذي مرحلتين. والأهم من ذلك أن Fast R-CNN كشف بوضوح أن هو عنق الزجاجة الأخير، فمهّد الطريق مباشرةً لشبكة مقترح المناطق في Faster R-CNN التي نقلت كامل خط المعالجة إلى .
تخيّل أن R-CNN مفتّش مبانٍ يدخل كل غرفة بنفسه، يُنصب كاميرا ويلتقط صورة، ثم يعود إلى مكتبه ليُحمّض الفيلم ويحلّل ما رآه. ألفا غرفة تعني ألفَي رحلة ذهاب وعودة — تخيّل كم يستغرق ذلك.
Fast R-CNN يعمل بمنطق مختلف تماماً: إنه مفتّش يملك طائرة مسيّرة يُحلّقها مرة واحدة فوق المبنى بأكمله، فيحصل على صورة جوية واحدة عالية الدقة. بعدها يستطيع تكبير أي غرفة يريدها من تلك الصورة نفسها — يقتطع ويصنّف ويقيس. تحليقة واحدة بدل ألفَي زيارة.
المشكلة: دقة عالية وبطء لا يُحتمل
اعتمدت R-CNN على ثلاث مراحل مستقلة تماماً، كل واحدة تُدرَّب بمعزل عن الأخرى:
- — تمرير كل مقترح من نحو ألفَي عبر بالكامل بعد قصّه وتغيير حجمه، ثم حفظ السمات الناتجة على القرص.
- التصنيف — تدريب مصنِّف SVM خطي مستقل لكل فئة من فئات الأجسام، يعمل على السمات المحفوظة.
- تنقيح — تدريب مُنحدِر منفصل لتعديل إحداثيات كل مقترح.
المشكلة الجوهرية في هذا التصميم ليست البطء وحده (84 ساعة للتدريب على VOC 2007) ولا الهدر في التخزين (مئات الغيغابايت من السمات)، بل أن المراحل الثلاث لا تتواصل: لا تستطيع مرحلة لاحقة تصحيح أخطاء مرحلة سبقتها. الالتفافي لم يكن يتلقى أي إشارة من مصنِّف SVM أو المُنحدِر، فالتعلّم الخاص بمهمة يتوقف عند حدود السمات المستخرجة ولا يتجاوزها.
الفكرة المحورية: لا تكرِّر ما يمكن مشاركته
العملية الأثقل حسابياً في أي شبكة التفافية هي الأولى — تلك التي تستخلص الحواف والأنسجة والأنماط. R-CNN كانت تُعيد تشغيل هذه الطبقات ألفَي مرة لكل صورة، مرة عن كل مقترح. لكن لحظة — كل المقترحات مقتطعة من الصورة نفسها، فلماذا لا نحسب السمات مرة واحدة ونتشاركها؟
هذا بالضبط ما يفعله Fast R-CNN: يُمرِّر الصورة كاملةً عبر الشبكة الالتفافية مرة واحدة فقط لينتج مشتركة. بعدها، لكل مقترح منطقة، يكفي أن نحدّد موقعه على تلك الخريطة ونقتطع السمات الخاصة به. الأمر أشبه برسم مخطط تفصيلي واحد لمبنى كامل: بدل أن تمسح كل غرفة من الصفر، تفتح المخطط وتكبّر الجزء الذي يهمك.
SPPnet (He وآخرون، 2014) طبّقت الفكرة ذاتها في مشاركة الحوسبة، لكن طبقة تجميع الهرم المكاني فيها كانت تقطع سلسلة فلا تصل إلى الطبقات الالتفافية. Fast R-CNN استبدلها بطبقة تجميع منطقة الاهتمام أبسط في تصميمها لكنها تسمح بـ الكامل عبر كل الطبقات.
تجميع منطقة الاهتمام: توحيد الأحجام المختلفة
مقترحات المناطق تأتي بأشكال وأحجام متباينة — الإنسان طويل ونحيل، والسيارة عريضة ومنخفضة — في حين أن في نهاية الشبكة تشترط مدخلاً بحجم ثابت. هنا يأتي دور تجميع منطقة الاهتمام لحلّ هذا التعارض.
الآلية بسيطة: لنفترض أن لدينا مقترح منطقة يقع على مساحة 21 × 14 خلية من خريطة السمات، ونريد إخراجاً بحجم 7 × 7. تُقسَم المنطقة إلى شبكة 7 × 7 من النوافذ الفرعية (كل نافذة نحو 3 × 2 خلية). داخل كل نافذة فرعية تُؤخذ القيمة الأكبر عبر . الناتج: سمات ثابتة الأبعاد 7 × 7 × C مهما كان شكل المنطقة الأصلية.
تخيّلها كـقالب يُضغط على خريطة السمات: أياً كان حجم المنطقة، يخرج دائماً ملخّص بنفس الأبعاد. من الناحية التقنية، هي نسخة مبسّطة بمستوى واحد من تجميع الهرم المكاني في SPPnet — لكن الفارق الجوهري أنها تسمح لـالتدرُّجات بالتدفق عكسياً عبر وصولاً إلى الطبقات الالتفافية، وهذا ما يفتح الباب أمام الشامل.
بنية Fast R-CNN
تسير المعمارية في ست خطوات متتابعة:
-
تُمرَّر الصورة كاملةً عبر عمود فقري التفافي مُدرَّب مسبقاً (مثل VGG16) حتى آخر طبقة التفافية، فتنتج خريطة سمات واحدة مشتركة.
-
تقترح البحث الانتقائي (وهي خارج الشبكة) نحو ألفَي منطقة مُرشَّحة على الصورة الأصلية.
-
يُسقَط كل مقترح على خريطة السمات، وتتولى طبقة تجميع منطقة الاهتمام استخراج سمات ثابت الحجم (مثلاً 7 × 7 × 512).
-
يمرّ هذا المتجه عبر طبقتين متصلتين بالكامل (fc6 وfc7، كلٌّ منهما 4096 وحدة مع و).
-
ينقسم الإخراج إلى رأسين يعملان بالتوازي:
- رأس تصنيف: بـ(K+1) فئة يُنتج احتمال كل فئة (K فئة أجسام + الخلفية).
- رأس : يُنتج 4 إزاحات لتنقيح صندوق الإحاطة لكل فئة.
-
يُدرَّب الرأسان معاً بـ** متعددة المهام** تجمع للتصنيف للانحدار.
النقطة الحاسمة أن هذه الخطوات الست تُشكِّل مساراً حوسبياً واحداً متصلاً وقابلاً للاشتقاق. التدرُّجات تتدفق من رأسَي الإخراج، عبر الطبقات المتصلة بالكامل، مروراً بطبقة تجميع منطقة الاهتمام، وصولاً إلى العمود الفقري الالتفافي — فتُحدَّث جميع دفعةً واحدة.
دالة خسارة واحدة لمهمتين
في R-CNN كان التصنيف وتحديد الموقع يُدرَّبان كلٌّ على حدة. Fast R-CNN يدمج المهمتين في دالة خسارة واحدة — وهذا من أهم ابتكارات الورقة.
لكل منطقة اهتمام يُخرج نتيجتين: توزيع احتمالي على K+1 فئة (بما فيها الخلفية)، وإزاحات لتنقيح صندوق الإحاطة لكل فئة . الفئة الصحيحة هي والإحداثيات المرجعية هي .
التفصيلة الذكية هنا هي المؤشّر : مقترحات الخلفية (الفئة 0) لا يوجد لها على الأرض، فخسارة الانحدار تُلغى لها تلقائياً ولا تُسهم إلا الأجسام الفعلية في خسارة تحديد الموقع. يتحكّم في التوازن بين المهمتين، والورقة تضعه عند أي وزن متساوٍ للتصنيف والانحدار.
خسارة Smooth L1: تدرُّجات مستقرة حتى مع أخطاء كبيرة
لمهمة انحدار صندوق الإحاطة، قدّم Fast R-CNN خسارة Smooth L1 — دالة تجمع محاسن L1 وL2 في تصميم واحد:
- حين يكون الخطأ صغيراً (|x| < 1)، تتصرف مثل L2: ناعمة وقابلة للاشتقاق، فتسمح بـ دقيق.
- حين يكون الخطأ كبيراً (|x| ≥ 1)، تتصرف مثل L1: تنمو خطياً لا تربيعياً، فلا تسمح لـ بتوليد تدرُّجات انفجارية.
لماذا هذا مهم؟ إزاحات صندوق الإحاطة قد تكون كبيرة جداً حين يكون المقترح بعيداً عن الحقيقة الأرضية. مع خسارة L2، تتحوّل هذه الإزاحات إلى تدرُّجات ضخمة تُزعزع التدريب بأكمله. خسارة Smooth L1 تُغطّي حجم التدرُّج عند 1 للأخطاء الكبيرة، فيظل التدريب مستقراً دون الحاجة إلى بشكل حادّ.
التدريب: كيف تُستغل مشاركة السمات لتسريع التعلّم
تفصيلة تدريبية تبدو صغيرة لكنها ذات أثر كبير: أخذ العيّنات الهرمي لبناء . الطريقة التقليدية تختار مناطق اهتمام عشوائياً من صور كثيرة، مما يعني حساب خريطة سمات مستقلة لكل صورة في الدفعة — هدر كبير. Fast R-CNN يعكس المنطق: يأخذ صورتين فقط لكل دفعة و64 منطقة اهتمام من كل صورة، بإجمالي 128 منطقة.
من هذه الـ128 منطقة، يكون 25% منها إيجابياً (أي أن نسبة مع صندوق حقيقي تساوي 0.5 أو أكثر) و75% سلبياً (IoU بين 0.1 و0.5). نسبة 1:3 هذه تضمن أن ترى الشبكة أمثلة خلفية كافية دون أن تطغى على أمثلة الأجسام.
الفائدة العملية واضحة: بما أن المناطق الـ64 من كل صورة تتشارك خريطة السمات نفسها، فإن التمريرة الأمامية المكلفة تحدث مرتين فقط لكل دفعة (مرة لكل صورة) بدلاً من 128 مرة. هذا يُسرِّع التدريب ويُقلّل استهلاك الذاكرة بشكل ملموس.
الفكرة ذاتها في شيفرة برمجية
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import torch
import torch.nn as nn
from torchvision.ops import roi_pool
class FastRCNN(nn.Module):
def __init__(self, backbone, num_classes=21):
"""
backbone: شبكة التفاف مدرَّبة مسبقاً (مثلاً VGG16 حتى conv5)
num_classes: K فئة أجسام + 1 خلفية
"""
super().__init__()
self.backbone = backbone # طبقات الالتفاف المشتركة
self.roi_pool = lambda feat, rois: roi_pool(
feat, rois, output_size=(7, 7), spatial_scale=1/16
)
self.fc6 = nn.Linear(512 * 7 * 7, 4096)
self.fc7 = nn.Linear(4096, 4096)
self.cls_head = nn.Linear(4096, num_classes) # درجات الفئات
self.box_head = nn.Linear(4096, num_classes * 4) # إزاحات الصندوق لكل فئة
def forward(self, image, rois):
# الخطوة 1: تمريرة CNN واحدة على الصورة كاملةً → خريطة سمات مشتركة
feat_map = self.backbone(image)
# الخطوة 2: تجميع منطقة الاهتمام → سمات ثابتة لكل مقترح
pooled = self.roi_pool(feat_map, rois) # (N_rois, 512, 7, 7)
# الخطوة 3: تسطيح → طبقات متصلة بالكامل
x = pooled.flatten(1) # (N_rois, 512*7*7)
x = torch.relu(self.fc6(x))
x = torch.relu(self.fc7(x))
# الخطوة 4: رأسا الإخراج الشقيقان
cls_scores = self.cls_head(x) # (N_rois, num_classes)
box_offsets = self.box_head(x) # (N_rois, num_classes * 4)
return cls_scores, box_offsetsالنتائج والسرعة
على PASCAL VOC 2007 يحقق Fast R-CNN مع VGG16 دقة 70.0% mAP مقابل 66.0% لـ R-CNN. وعلى VOC 2012 يصل إلى 68.4% مقابل 62.4%.
لكن الأرقام الأكثر إثارة تخصّ السرعة. زمن التدريب انخفض من 84 ساعة إلى 9.5 ساعة — أي تسريع 9 أضعاف. وزمن الاستدلال هبط من 47 ثانية للصورة إلى 0.32 ثانية (دون حساب توليد المقترحات) — تسريع 146 ضعفاً. حتى مع إضافة البحث الانتقائي (~ثانيتان)، يبلغ الزمن الإجمالي ~2.3 ثانية، أي تسريع بـ213 ضعفاً مقارنةً بـ R-CNN.
كذلك يتفوّق Fast R-CNN على SPPnet: تدريب أسرع 3 مرات واختبار أسرع 10 مرات مع دقة أعلى، والفضل يعود إلى قدرته على ضبط جميع بلا استثناء.
عنق الزجاجة المتبقي: البحث الانتقائي
عالج Fast R-CNN مشكلتَي التدريب ومشاركة السمات، لكنه ترك قطعة واحدة خارج : البحث الانتقائي. هذه الخوارزمية تعمل على المعالج المركزي وتستغرق نحو ثانيتين لكل صورة — أي أكثر من زمن استدلال الشبكة العصبية بأكملها (0.32 ثانية). بعبارة أخرى، البحث الانتقائي وحده يستهلك 86% من زمن الاختبار.
هذا الرقم رسم الطريق نحو الخطوة التالية بوضوح: ماذا لو استبدلنا البحث الانتقائي بشبكة عصبية صغيرة تقترح المناطق مباشرةً على وحدة معالجة الرسوميات؟ هذا ما فعلته شبكة مقترح المناطق (RPN) في Faster R-CNN التي نُشرت بعد شهر واحد فقط، بمشاركة Girshick نفسه.
الأثر الدائم
ترك Fast R-CNN ثلاثة مبادئ صارت بمثابة قواعد ذهبية لكل كاشف أجسام جاء بعده:
مشاركة خريطة السمات. لا تُعِد الحساب نفسه مرتين. مرِّر الصورة عبر الشبكة الالتفافية مرة واحدة وأعد استخدام الناتج لكل المقترحات. هذا المبدأ موجود اليوم في كل كاشف حديث — من Faster R-CNN إلى YOLO إلى DETR.
التدريب المشترك للمهام. التصنيف وتحديد الموقع يتحسّنان حين يُدرَّبان معاً بـدالة خسارة واحدة. هذا الأسلوب أصبح الإعداد الافتراضي في جميع معماريات الاكتشاف.
التدريب الشامل من البداية إلى النهاية. كل مكوّن في النظام يجب أن يكون قابلاً للاشتقاق حتى تستطيع التدرُّجات تحسين السلسلة بأكملها. وحين يقطع مكوّن ما تدفق التدرُّجات — كتجميع SPPnet أو البحث الانتقائي — يصبح تلقائياً الهدف الأول للابتكار التالي.
2014
R-CNN
أول من وظّف الشبكات الالتفافية في اكتشاف الأجسام. كانت تعالج كل مقترح منطقة على حدة — دقيقة لكن بطيئة جداً (47 ثانية لكل صورة).
2014
SPPnet
شاركت الحوسبة الالتفافية بين المقترحات باستخدام تجميع الهرم المكاني، لكن التدرُّجات لم تكن تصل إلى الطبقات الالتفافية عبر طبقة التجميع.
2015
Fast R-CNN
معمارية موحّدة بتجميع منطقة الاهتمام وخسارة متعددة المهام. كل الطبقات تُضبط من البداية إلى النهاية. تدريب أسرع 9× واستدلال أسرع 213× مقارنةً بـ R-CNN.
2015
Faster R-CNN
استبدل البحث الانتقائي بشبكة مقترح المناطق (RPN) فانتقل خط المعالجة بالكامل إلى وحدة معالجة الرسوميات. اكتشاف شبه لحظي بمعدل 5 إطارات/ثانية.
2017
Mask R-CNN
أضاف فرع أقنعة إلى Faster R-CNN لتجزئة النُّسَخ، واستبدل تجميع منطقة الاهتمام بـRoIAlign للحصول على دقة دون مستوى البكسل.
المرجعGirshick, R.. Fast R-CNN. ICCV, 2015.
مصطلحات هذه الورقة
- رصد وتحديد الكائناتObject Detection
- تجميع منطقة الاهتمامRoI Pooling
- من طرف إلى طرفend-to-end
- مربع الإحاطةBounding Box
- التعلّم متعدد المهامMulti-Task Learning
- خريطة السماتFeature Map
- البحث الانتقائيSelective Search
- خسارة Smooth L1Smooth L1 Loss
- الشبكة العصبية الالتفافيةConvolutional Neural Network (CNN)
- الطبقة كاملة الاتصالFully Connected Layer
- سوفت ماكسSoftmax
- التحديث التراجعيBackpropagation
- الضبط الدقيقFine-Tuning