الرؤية الحاسوبية2015متوسط10 دقيقة قراءة
الشبكات الالتفافية الكاملة للتجزئة الدلالية
Fully Convolutional Networks for Semantic Segmentation
Long, J. · Shelhamer, E. · Darrell, T. — CVPR
المشكلة
شبكات مثل VGG وAlexNet تأخذ صورة كاملة وتُخرج تصنيفاً واحداً — «قطة» أو «كلب» — وانتهى الأمر. لكن تطبيقات كثيرة تحتاج أكثر من ذلك: السيارة ذاتية القيادة مثلاً يجب أن تعرف لكل بكسل هل هو طريق أم مشاة أم سماء. قبل هذه الورقة، كان الحل هو تقطيع الصورة إلى رقع صغيرة كل رقعة على حدة، وهو أسلوب بطيء جداً ويضيّع السياق. أو اللجوء إلى خطوط معالجة يدوية مُفكّكة لا يمكن تدريبها ككتلة واحدة من البداية إلى النهاية.
الإسهام
FCN تأخذ أي شبكة تصنيف جاهزة (AlexNet أو VGG أو GoogLeNet) وتحوّلها إلى شبكة التفافية بالكامل تُنتج خريطة تنبؤ كثيفة بالحجم نفسه للصورة الأصلية. الخطوة الأولى: استبدال الطبقات كاملة الاتصال بالتفافات 1×1 حتى تقبل الشبكة أي حجم مدخل. الخطوة الثانية: رفع دقة الخرج الخشن بالتفافات منقولة مُتعلَّمة. الخطوة الثالثة: وصلات تخطّي تدمج التفاصيل المكانية الدقيقة من الطبقات المبكرة مع الفهم الدلالي العميق، فتتحسّن حدود من خطوة 32 بكسل (FCN-32s) إلى 8 بكسلات فقط (FCN-8s).
الأثر
هذه الورقة أسّست نمط -فاكّ الترميز ، وهو النمط الذي ورثته عملياً كل بنية تجزئة حديثة: U-Net وDeepLab وMask R-CNN وSegNet كلها امتدادات مباشرة لهذا العمل. أثبتت الورقة أن شبكات التصنيف المُدرَّبة مسبقاً يمكن تحويلها لمهام على مستوى البكسل، فصار نقل التعلُّم هو نقطة البداية الطبيعية لأي مشروع تجزئة. على مجموعة PASCAL VOC 2012 حققت FCN-8s نسبة 62.2% في معدّل IoU متجاوزةً أفضل النتائج السابقة بفارق كبير، مع سرعة تفوق الأساليب الرقعية بـ 286 ضعفاً.
تخيّل أن شبكة التصنيف تعمل كـقمع: تصبّ الصورة من أعلاه فلا يخرج من أسفله إلا قطرة واحدة — تسمية الصورة. كل التفاصيل المكانية تضيع في الطريق.
تقلب هذا القمع إلى مكبّر صوت: بعد مرحلة الضغط، تُعيد توسيع الإشارة حتى تعود بحجم الصورة الأصلية، فيحصل كل بكسل على تصنيفه الخاص. والأهم من ذلك: بربط الفوهة العريضة للقمع بجرس المكبّر عبر وصلات التخطّي، تستعيد الشبكة التفاصيل الدقيقة التي فُقدت أثناء الضغط.
المشكلة: المُصنِّفات تتخلّص من معلومات الموقع
بحلول 2014 كانت الشبكات الالتفافية العميقة مثل AlexNet وVGG قد حسمت مسألة التصنيف. لكنّ التصنيف يجيب عن سؤال واحد فقط: «ماذا في الصورة؟»، ولا يقول لك «أين يقع كل شيء؟». تحتاج الإجابتين معاً: كل بكسل يجب أن يحمل تصنيفاً خاصاً به.
الأسلوب الذي كان سائداً وقتها هو التصنيف بالرقع: تقتطع رقعة صغيرة حول كل بكسل، تمرّرها على ، ثم تكرّر العملية لكل بكسل في الصورة. المشكلة؟ بطء شديد وهدر للسياق — كل رقعة تعمل بمعزل عن جاراتها. وكانت هناك أساليب أخرى تعتمد على بكسلات فائقة مصنوعة يدوياً أو معالجة لاحقة بحقول عشوائية شرطية (CRF)، لكنها أنتجت خطوط معالجة مُفكّكة لا يمكن تدريبها ككتلة واحدة من البداية إلى النهاية.
الفكرة المحورية: التفاف كامل = أي حجم يدخل، الحجم نفسه يخرج
شبكات التصنيف تنتهي بما يُعرف بـ، وهذه الطبقات تفرض حجم مدخل ثابتاً (مثلاً 224×224) وتُخرج متجهاً بطول محدّد. المشكلة أنها تمحو البنية المكانية تماماً — تتعامل مع كل عصبون وكأنه مرتبط بكل مخرج بالتساوي، بغض النظر عن موقعه في الصورة.
هنا جاءت فكرة FCN الجوهرية: استبدل كل طبقة كاملة الاتصال بالتفاف 1×1. ما يفعله 1×1 هو تطبيق تركيبة خطية مُتعلَّمة عند كل موضع مكاني على حدة. النتيجة؟ الخرج لم يعد متجهاً واحداً، بل أصبح — خريطة حرارية تُظهر درجات التصنيف في كل موقع. ولأن الالتفافات لا تهتم بحجم المدخل، صارت الشبكة تقبل صوراً بأي أبعاد وتُنتج خرجاً بأبعاد مقابلة.
تخيّل الأمر هكذا: الطبقة كاملة الاتصال كأنها شخص يقرأ مقالاً كاملاً ثم يكتب جملة ملخّصة واحدة. أما الالتفاف 1×1 فهو كمُدقّق يمرّ فقرةً فقرة ويكتب ملاحظة في الهامش عند كل فقرة — الأوزان نفسها تُطبَّق في كل موضع.
فاكّ الترميز: التوسيع رجوعاً إلى الدقة الكاملة
بعد مرور الصورة بالطبقات الالتفافية في VGG أو AlexNet، تكون خريطة السمات أصغر بـ 32 مرة من المدخل (مثلاً 7×7 من صورة 224×224) بسبب عمليات المتكررة. المطلوب الآن هو توسيع هذه الخريطة الخشنة لتعود بحجم الصورة الأصلية — بكسلاً ببكسل.
الأداة التي تستخدمها FCN لذلك هي (ويُسمّى أيضاً فك الالتفاف). الفكرة بسيطة: الالتفاف العادي يأخذ عدة بكسلات ويُنتج منها بكسلاً واحداً (تقليص). الالتفاف المنقول يعكس الاتجاه: يأخذ بكسلاً واحداً ويوزّعه على عدة بكسلات في الخرج (توسيع). عملياً، يُدرج أصفاراً بين قيم المدخل ثم يُطبّق مرشّحاً مُتعلَّماً، فينشر كل تنبؤ خشن ويمزجه على مساحة مكانية أوسع.
النقطة الجوهرية: أوزان هنا مُتعلَّمة وليست مصمّمة يدوياً. الشبكة تكتشف بنفسها أفضل طريقة للإقحام بين التنبؤات الخشنة بما يستعيد أكبر قدر من التفاصيل المكانية.
وصلات التخطّي: استعادة التفاصيل الدقيقة
لو اكتفينا برفع دقة الطبقة الأخيرة مباشرةً (FCN-32s)، ستكون النتيجة تجزئة «لطخية» غير دقيقة — الحواف مشوّشة والأجسام الصغيرة تختفي. السبب واضح: التقليص 32 مرة يُضيّع كثيراً من التفاصيل المكانية. لكن الطبقات المبكرة في الشبكة لا تزال تحتفظ بتلك التفاصيل — pool3 فيها 8 بكسلات فقط، وpool4 فيها خطوة 16 بكسلاً.
هنا تأتي الفكرة الثانية في الورقة: وصلات التخطّي التي تدمج التنبؤات العميقة الخشنة مع الطبقات الأقل عمقاً والأغنى مكانياً:
-
FCN-32s — رفع دقة الطبقة الأخيرة 32 مرة مباشرةً. سريع لكنه خشن.
-
FCN-16s — دمج التنبؤ النهائي بعد رفع دقته مرتين مع سمات pool4، ثم رفع الدقة 16 مرة. الحواف تتحسّن بشكل ملحوظ.
-
FCN-8s — إضافة سمات pool3 أيضاً. ثلاثة تيارات تُدمج معاً، والحدود تصبح حادة بما يكفي للاستخدام العملي.
الصورة الذهنية هنا: الطبقات العميقة تعرف ماذا يوجد في الصورة (رؤية بانورامية من بعيد)، بينما الطبقات السطحية تعرف أين بالضبط تقع الحدود (رؤية مُكبَّرة مفصّلة). دمج الاثنين يُنتج تجزئة دقيقة في الهوية والموقع معاً.
تجميع القطع معاً: بنية FCN الكاملة
بنية FCN الكاملة تتكوّن من مسارين متكاملين:
المُرمِّز () يبدأ من شبكة تصنيف مُدرَّبة مسبقاً — VGG-16 هي الخيار الافتراضي — بعد حذف طبقاتها كاملة الاتصال. خمس مجموعات من التفاف + تجميع تُقلّص الدقة المكانية من H×W إلى H/32 × W/32، وفي كل مرحلة تبني الشبكة تمثيلات أكثر تجريداً. هذا المُرمِّز يبدأ بأوزان مُدرَّبة على ImageNet — وهذا هو الذي يمنح الشبكة انطلاقة قوية بدل البدء من الصفر.
() يأخذ السمات العميقة الخشنة ويُعيد بناء تنبؤات على مستوى البكسل. أولاً، التفافان 1×1 يحلّان محلّ fc6 وfc7 من VGG ويُنتجان خريطة بـ C قناة (قناة لكل فئة). ثم التفافات منقولة ترفع الدقة إلى حجم المدخل الأصلي، مع وصلات تخطّي اختيارية تدمج سمات pool3 وpool4 أثناء الطريق.
الشبكة بأكملها تُدرَّب من البداية إلى النهاية بـ لكل بكسل: التوزيع المُتنبَّأ به عند كل بكسل يُقارَن بتسميته الحقيقية، و يُمرّر عبر فاكّ الترميز والمُرمِّز معاً.
الفكرة نفسها في الكود
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import torch
import torch.nn as nn
class FCN8s(nn.Module):
"""حوّل VGG-16 إلى مُجزّئ التفافي كامل."""
def __init__(self, n_classes=21):
super().__init__()
# --- المُرمِّز: كتل VGG-16 الالتفافية (مُدرَّبة مسبقاً) ---
# pool1-pool5 تقلّص الأبعاد المكانية بمعامل 2× لكل منها → إجمالي 32×
self.block1 = vgg_block(3, 64, 2) # /2
self.block2 = vgg_block(64, 128, 2) # /4
self.block3 = vgg_block(128, 256, 3) # /8 ← مصدر تخطّي
self.block4 = vgg_block(256, 512, 3) # /16 ← مصدر تخطّي
self.block5 = vgg_block(512, 512, 3) # /32
# --- استبدال الطبقات كاملة الاتصال بالتفافات 1×1 ---
self.fc6 = nn.Conv2d(512, 4096, 1) # كانت: nn.Linear(25088, 4096)
self.fc7 = nn.Conv2d(4096, 4096, 1) # كانت: nn.Linear(4096, 4096)
self.score = nn.Conv2d(4096, n_classes, 1)
# --- إسقاطات وصلات التخطّي ---
self.score_pool4 = nn.Conv2d(512, n_classes, 1)
self.score_pool3 = nn.Conv2d(256, n_classes, 1)
# --- فاكّ الترميز: التفافات منقولة مُتعلَّمة ---
self.up2x = nn.ConvTranspose2d(n_classes, n_classes, 4, stride=2, padding=1)
self.up4x = nn.ConvTranspose2d(n_classes, n_classes, 4, stride=2, padding=1)
self.up8x = nn.ConvTranspose2d(n_classes, n_classes, 16, stride=8, padding=4)
def forward(self, x):
p1 = self.block1(x) # H/2
p2 = self.block2(p1) # H/4
p3 = self.block3(p2) # H/8 — سمات دقيقة
p4 = self.block4(p3) # H/16 — سمات متوسطة
p5 = self.block5(p4) # H/32 — سمات خشنة غنية دلالياً
s = self.score(self.fc7(self.fc6(p5))) # درجات خشنة
# دمج التخطّي: عميق + متوسط + دقيق
s = self.up2x(s) + self.score_pool4(p4) # مستوى FCN-16s
s = self.up4x(s) + self.score_pool3(p3) # مستوى FCN-8s
s = self.up8x(s) # عودة إلى الدقة الكاملة
return s # (B, n_classes, H, W)التدريب: حين يلتقي نقل التعلُّم بالإشراف الكثيف
استراتيجية FCN تقوم على فكرتين قويتين:
نقل التعلُّم من التصنيف. المُرمِّز لا يبدأ من الصفر، بل ينطلق من أوزان VGG-16 المُدرَّبة مسبقاً على 1.2 مليون صورة من ImageNet. هذه الأوزان تحمل سمات هرمية غنية — حواف وملامس وأجزاء وأجسام — تنتقل بسلاسة إلى مهمة التجزئة. ما يُتعلَّم من الصفر هو فاكّ الترميز وإسقاطات التخطّي فقط.
دالة خسارة الإنتروبيا المتقاطعة لكل بكسل. كل بكسل يُسهم في باستقلالية، فتحصل الشبكة على إشراف كثيف من عشرات الآلاف من البكسلات المُسمّاة في كل صورة. قارن هذا بالتصنيف العادي الذي لا يوفّر سوى تسمية واحدة للصورة كلها.
التدريب تمّ على مراحل: أولاً FCN-32s بدون وصلات تخطّي، ثم FCN-16s بإضافة تخطّي pool4، ثم FCN-8s بإضافة تخطّي pool3. كل مرحلة تنطلق من أوزان المرحلة السابقة، وهذا التدرّج يُثبّت عملية التدريب — يتعلّم التنبؤ الخشن أولاً ثم يُصقل تدريجياً. 10⁻⁴ مع و مرتفع (0.9)، والطبقات الجديدة تحصل على معدّل تعلُّم أعلى بـ 20 ضعفاً لأنها تبدأ من الصفر.
النتائج وقصة تحسين الخطوة
الانتقال من FCN-32s إلى FCN-8s يحكي قصة تحسّن واضحة خطوةً بخطوة:
-
FCN-32s: معدّل يبلغ 59.4% على PASCAL VOC 2011. الشبكة تلتقط هوية الأجسام لكن الحدود خشنة — الحواف قد تنحرف حتى 16 بكسلاً.
-
FCN-16s: المعدّل يرتفع إلى 62.4%. إضافة سمات pool4 تُحسّن الحواف بشكل ملحوظ، والأجسام الصغيرة تبدأ بالظهور.
-
FCN-8s: المعدّل يصل إلى 62.7%. إضافة pool3 تُصقل الحدود أكثر. الفرق بين 32s و8s يظهر بوضوح عند حواف الأجسام والبنى الرفيعة.
على PASCAL VOC 2012 حققت FCN-8s نسبة 62.2% في معدّل IoU — قفزة كبيرة مقارنةً بأفضل النتائج السابقة. و يعمل بسرعة ~0.2 ثانية لكل صورة، مقابل نحو دقيقة كاملة في الأساليب الرقعية — أي تسريع بـ 286 ضعفاً.
لماذا غيَّرت هذه الورقة المشهد
2012
AlexNet — الشبكات الالتفافية تحسم التصنيف
الشبكات الالتفافية العميقة المُدرَّبة على ImageNet أثبتت أن السمات المُتعلَّمة تتفوق بوضوح على المصمَّمة يدوياً. التصنيف حُسم — لكن التجزئة بقيت تعتمد على أساليب الرقع البطيئة.
2014
VGG — الأعمق أفضل
أظهرت VGG-16/19 أن مجرّد تكديس التفافات 3×3 بعمق أكبر يرفع أداء التصنيف. بنيتها النظيفة والمنتظمة جعلتها المرشح المثالي لتحويلها إلى شبكة التفافية كاملة في FCN.
2015
FCN — بكسلات تدخل، بكسلات تخرج
هذه الورقة. أثبتت أن المُصنِّفات يمكن أن تتحوّل إلى مُنبئات كثيفة بثلاثة تعديلات: التفافات 1×1، والتفافات منقولة، ووصلات تخطّي.
2015
U-Net — المُرمِّز-فاكّ الترميز المتماثل
طوّر Ronneberger وزملاؤه وصلات التخطّي من FCN إلى بنية متماثلة تستخدم الربط (concatenation) بدل الجمع، فهيمنت على تجزئة الصور الطبية وأصبحت الأكثر استشهاداً في مجال التجزئة.
2017
DeepLab v2 — التفافات مُوسَّعة
بدل التقليص ثم رفع الدقة، تُوسّع الالتفافات المُوسَّعة (dilated) حقل الاستقبال دون التضحية بالدقة المكانية — مسار بديل مُستوحى من فكرة FCN الأساسية.
2017
Mask R-CNN — تجزئة الأمثال
أضافت فرعاً التفافياً كاملاً إلى Faster R-CNN ليتنبّأ بقناع بكسلي لكل جسم مكتشَف. بهذا انتقلت فكرة التنبؤ الكثيف من FCN من مستوى المشهد إلى مستوى الأجسام المفردة.
2021
SegFormer — المحوِّلات تدخل التجزئة
استبدلت المُرمِّز الالتفافي بعمود فقري قائم على المحوِّلات، لكنها حافظت على فلسفة فاكّ الترميز نفسها من FCN: سمات هرمية، ودمج متعدد المقاييس، وخرج كثيف.
ما تركته FCN ليس شبكة بعينها — بل نمط تصميم. الفكرة بأن شبكات التصنيف تحتوي معلومات مكانية تستحق الاسترداد، وأن وصلات التخطّي قادرة على سدّ الفجوة بين الفهم الدلالي والدقة المكانية — هذه الفكرة أعادت رسم ملامح مجال التنبؤ الكثيف بأكمله. في كل مرة يُخرج فيها نموذج خريطة لكل بكسل — سواء لـالتجزئة أو تقدير العمق أو التدفق البصري أو رفع الدقة الفائق — فهو يستند بشكل أو بآخر إلى ما قدّمته هذه الورقة.
المرجعLong, Shelhamer, Darrell. Fully Convolutional Networks for Semantic Segmentation. CVPR, 2015.
مصطلحات هذه الورقة
- التجزئة الدلالية للصورةSemantic Segmentation
- الشبكة الالتفافية الكاملةFully Convolutional Network (FCN)
- التنبؤ الكثيفDense Prediction
- التفاف معكوسDeconvolution
- رفع الدقةUpsampling
- الاتصال التجاوزيSkip Connection
- خريطة السماتFeature Map
- التجميع المكانيPooling
- خطوة التخطّي الحسابيةStride
- الحقل الاستقبالي للعصبونReceptive Field
- نقل التعلمTransfer Learning
- الضبط الدقيقFine-Tuning