تخصصات التعلم العميق

الرؤية الحاسوبية والتعامل مع الصور

الدرس الثالث: الشبكات الالتفافية CNN — الرؤية الحاسوبية | دليل للمبتدئين
Deep Learning · الدرس 3

Convolutional Neural Networks (CNN)
الرؤية الحاسوبية والتعامل مع الصور

دليل عربي مفصّل للمبتدئين يشرح كيف «ترى» الآلة الصور: من البكسل والقنوات اللونية، إلى الالتفاف والتجميع، ثم أشهر المعماريات (ResNet، YOLO)، Transfer Learning، كشف الأشياء، التجزئة، ومشاريع عملية — بأمثلة رقمية وتشبيهات من الحياة اليومية.

✍ عبدالرحمن الرفاعي
9 محاور
CNN + YOLO
أمثلة + كود
01 المحور الأول

Image Processing Basics — أساسيات معالجة الصور

قبل أن نبني شبكة CNN، نحتاج أن نفهم كيف تُخزَّن الصورة في الحاسوب. الصورة ليست «صورة» بالمعنى البصري — بل هي جدول أرقام. والشبكة العصبية لا «ترى» — بل تُجرِي عمليات رياضية على هذه الأرقام.

Pixels — البكسلات

البكسل (Pixel = Picture Element) هو أصغر وحدة في الصورة — مربّع صغير جدًا. كل بكسل يحمل قيمة رقمية تمثل شدة اللون أو السطوع.

تشبيه: لوحة فسيفساء

تخيّل صورة كلوحة فسيفساء: كل قطعة صغيرة = بكسل. لو اقتربت كثيرًا من شاشة التلفاز القديمة، ترى مربّعات RGB — هذه هي البكسلات. دقة الصورة = عدد البكسلات (مثل 1920×1080 = حوالي 2 مليون بكسل).

مثال رقمي: صورة 4×4 رمادية

صورة صغيرة 4×4 = 16 بكسل. كل بكسل قيمة من 0 (أسود) إلى 255 (أبيض):

[ 0, 50, 100, 150,
80, 120, 200, 255,
30, 60, 90, 110,
200, 180, 160, 140 ]

هذا المصفوفة 4×4 هي ما «يراه» الحاسوب. CNN ستمرّر filters على هذه الأرقام لاكتشاف أنماط (حواف، تدرّجات).

Channels — القنوات

القناة (Channel) = طبقة منفصلة من البيانات لكل بكسل. في صورة RGB، لكل بكسل 3 قيم: واحدة للأحمر، واحدة للأخضر، واحدة للأزرق. في صورة رمادية، قناة واحدة فقط.

صورة RGB = 3 قنوات متراصة R — أحمر G — أخضر B — أزرق صورة ملونة شكل Tensor: (Height, Width, Channels) — مثل (224, 224, 3)
كل قناة مصفوفة 2D — دمجها يعطي اللون النهائي

RGB — الألوان الثلاثية

RGB = Red, Green, Blue. أي لون على الشاشة = مزيج من هذه الثلاث. القيمة 0–255 لكل قناة:

أبيض

R=255, G=255, B=255 — كل القنوات مضاءة.

أسود

R=0, G=0, B=0 — لا ضوء.

أحمر نقي

R=255, G=0, B=0.

بنفسجي

R=128, G=0, B=128 — أحمر + أزرق.

مثال: بكسل واحد

بكسل «سماء زرقاء فاتحة» قد يكون: R=135, G=206, B=235. CNN تتعلّم أن مجموعات من هذه القيم تمثل «سماء» أو «ماء» أو «عشب».

Grayscale — التدرج الرمادي

صورة Grayscale = قناة واحدة فقط. كل بكسل = سطوع من 0 (أسود) إلى 255 (أبيض). نحوّل RGB إلى رمادي بمعادلة:

Gray = 0.299×R + 0.587×G + 0.114×B

الأخضر يُponder أكثر لأن العين البشرية حسّاسة له. MNIST (أرقام مكتوبة بخط اليد) صور رمادية 28×28 — مثالي للمبتدئين.

النوعالقنواتمثالحجم Tensor
Grayscale1MNIST، أشعة X(28, 28, 1)
RGB3CIFAR-10، selfies(32, 32, 3)
RGBA4PNG بشفافية(H, W, 4)
Multi-spectral5+أقمار صناعية، طب(H, W, N)
Normalization — خطوة ضرورية

قبل إدخال الصورة للشبكة، نقسم القيم على 255 لتصبح بين 0 و 1 — أو نستخدم mean/std (مثل ImageNet). بدون ذلك، التدريب بطيء أو لا يتقارب. مثال: img = img / 255.0

02 المحور الثاني

CNN Architecture — بنية الشبكة الالتفافية

لماذا لا نستخدم شبكة Fully Connected للصور؟ صورة 224×224×3 = 150,528 مدخل. طبقة واحدة → 1000 عصبون = 150 مليون وزن! CNN تحل المشكلة بثلاث أفكار: مشاركة الأوزان، التركيز المحلي، والتسلسل الهرمي.

Convolution — الالتفاف (مثال خطوة بخطوة)

الالتفاف = نافذة صغيرة (filter) تنزلق على الصورة، تُضرب قيمها بقيم البكسلات، ثم تُجمع. الناتج = Feature Map.

حساب يدوي: filter كشف حواف عمودية

Filter 3×3 (كشف حواف عمودية):

Filter = [-1, 0, 1]
[-1, 0, 1]
[-1, 0, 1]

منطقة 3×3 من الصورة (قيم brightness):

Patch = [10, 50, 90]
[10, 55, 95]
[12, 52, 88]

الحساب: (-1×10)+(0×50)+(1×90)+(-1×10)+(0×55)+(1×95)+(-1×12)+(0×52)+(1×88) = 191

قيمة عالية = «حافة عمودية قوية هنا». نكرّر على كل موضع → feature map كاملة.

تشبيه: عدسة تبحث عن نمط

تمرّر عدسة 3×3 على الصورة وتسأل: «هل أرى خطًا عموديًا؟» Filter الحواف العمودية يعطي قيمة عالية عندها ومنخفضة في الباقي.

الالتفاف: Filter 3×3 على صورة Filter = ضرب عناصر متقابلة + جمع = قيمة في Feature Map
Filter يكتشف نمطًا — القيمة العالية = «وجدتُ النمط»

Filters — المرشحات

Filter = مصفوفة أوزان يتعلّمها النموذج. الطبقات الأولى: حواف. العميقة: عيون، عجلات، وجوه.

مثال: Conv2D(filters=32)

مدخل 128×128×3 → مخرج 128×128×32 — 32 خريطة، كل واحدة تبحث عن نمط مختلف.

Kernels — النواة

Kernel = Filter (نفس المعنى غالبًا). الأحجام الشائعة: 3×3، 5×5، 7×7. Kernel أكبر = رؤية أوسع لكن parameters أكثر.

output = (input - kernel + 2×padding) / stride + 1

Feature Maps — خرائط الميزات

كل filter → feature map واحدة. 64 filter → 64 خريطة. التسلسل الهرمي:

حوافأشكالأجزاءكائن كاملتصنيف
model = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Flatten(), nn.Linear(64*56*56, 10)
)
03 المحور الثالث

Pooling — التجميع

Pooling يُصغّر الصورة ويُبقي أهم المعلومات — «تلخيص» منطقة. يقلّل الحسابات ويُعطي translation invariance: القطة يمينًا أو يسارًا — النموذج يتعرّف عليها.

Max Pooling

نافذة 2×2 → نأخذ أكبر قيمة. الأكثر شيوعًا.

مثال 2×2
[1,3] [2,6] → max = 6

224×224 → MaxPool 2×2 → 112×112

Average Pooling

متوسط القيم في النافذة — أنعم، يحافظ على معلومات أكثر.

[1,3] [2,6] → avg = 3

Global Pooling

GAP: متوسط كل feature map → متجه. 512 خريطة 7×7 → 512 رقم. يستبدل Flatten الكبير — ResNet يستخدمه.

النوعالفكرةالاستخدام
Max Poolingأقصى قيمةالافتراضي
Average Poolingمتوسطتنعيم
Global Poolingمتوسط الخريطة كاملةقبل التصنيف
04 المحور الرابع

CNN Layers — طبقات الشبكة بالتفصيل

كل طبقة لها hyperparameters تتحكم في شكل المخرجات. فهمها = الت debug واختيار البنية الصحيحة.

Padding — الحشو

نضيف أصفارًا (أو قيمًا) حول حواف الصورة قبل Conv. Same padding يحافظ على الحجم: 224×224 تبقى 224×224.

بدون vs مع padding

صورة 5×5، filter 3×3، بدون padding → 3×3 (تصغّر!). مع padding=1 → 5×5 (نفس الحجم).

Stride — الخطوة

Stride = كم بكسل يتحرك Filter. Stride=1 (بطيء، دقة عالية). Stride=2 (أسرع، تصغير مثل Pooling).

stride=2 على 224×224 → 112×112

Flatten — التسطيح

بعد Conv+Pool، tensor 3D (مثل 7×7×512) → متجه 1D (25088). يربط CNN بـ Dense للتصنيف.

Dense Layers — الطبقات الكثيفة

في النهاية: Flatten → Dense(128) → ReLU → Dropout → Dense(num_classes) → Softmax. Dense = كل عصبون متصل بكل المدخلات.

# Keras
model = keras.Sequential([
layers.Conv2D(32, 3, activation='relu', padding='same'),
layers.MaxPooling2D(2),
layers.Conv2D(64, 3, activation='relu'),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
Conv + ReLU: استخراج ميزات — ReLU يضيف non-linearity.
BatchNorm: يُسرّع التدريب ويُثبّت — شائع بعد Conv.
05 المحور الخامس

أشهر المعماريات — من LeNet إلى EfficientNet

كل معمارية = «وصفة» لترتيب الطبقات. لا تحتاج بناءها من الصفر — استخدمها جاهزة من PyTorch (torchvision.models) أو TensorFlow.

LeNet-5 (1998)

يان LeCun — أرقام MNIST. Conv → Pool → Conv → FC. أول CNN ناجحة تجاريًا (شيكات بريدية).

AlexNet (2012)

ثورة ImageNet — 8 طبقات، ReLU، Dropout، GPU. خطأ 15%→26% أفضل من SVM. بدأ عصر DL.

VGG (2014)

طبقات 3×3 صغيرة متكررة — VGG16 (16 طبقة). بسيطة لكن parameters كثيرة (~138M).

GoogLeNet (2014)

Inception modules — filters متعددة الأحجام بالتوازي. 22 طبقة لكن parameters أقل من VGG.

ResNet (2015)

Skip connections — حل vanishing gradient. ResNet-50/101/152. معيار صناعي حتى اليوم.

DenseNet (2017)

كل طبقة تتصل بكل الطبقات التالية — إعادة استخدام ميزات، parameters أقل.

EfficientNet (2019)

موازنة depth/width/resolution — دقة عالية بparameters أقل. EfficientNet-B0 إلى B7.

GoogLeNet — Inception Module

فكرة Inception: «لا أعرف أي حجم filter أفضل — استخدم الكل!» في نفس الطبقة: 1×1، 3×3، 5×5 conv + MaxPool — ثم concat النتائج. 1×1 conv يقلّل channels قبل conv الكبيرة (bottleneck) — يوفر parameters.

ResNet — Skip Connection بالتفصيل

تشبيه: طريق مختصر

بدل أن تمرّ الإشارة بـ 50 طبقة (وتضعف)، ResNet يضيف مسارًا مختصرًا: output = F(x) + x. إذا F(x)≈0، الطبقة «تتخطى» — التدريب أسهل للشبكات العميقة جدًا (152+ طبقة).

المعماريةالسنةImageNet Top-5Parametersملاحظة
LeNet-5199860KMNIST
AlexNet201215.3%60Mبداية الثورة
VGG-1620147.3%138Mبسيطة
ResNet-5020153.6%25Mالأكثر استخدامًا
EfficientNet-B02019~3.3%5Mكفاءة عالية
from torchvision import models
resnet = models.resnet50(weights='IMAGENET1K_V2')
efficient = models.efficientnet_b0(weights='IMAGENET1K_V1')
06 المحور السادس

Transfer Learning — نقل التعلّم

تدريب ResNet على ImageNet (1.2M صورة) يأخذ أسابيع على GPU. Transfer Learning: نأخذ نموذجًا مُدرَّبًا مسبقًا ونُكيّفه لمهمتنا — دقة عالية ببيانات قليلة.

Feature Extraction — استخراج الميزات

نُجمّد (freeze) كل طبقات CNN المُدرَّبة — نستخدمها كـ «مستخرج ميزات» جاهز. نضيف Dense جديدة فقط للتصنيف.

مثال: 500 صورة قطط/كلاب
  1. حمّل ResNet-50 مُدرَّب على ImageNet.
  2. Freeze كل الطبقات: for p in model.parameters(): p.requires_grad = False
  3. استبدل آخر Dense بـ Dense(2) — قطة/كلب.
  4. درّب الطبقة الأخيرة فقط — 10 epochs قد تكفي!
  5. دقة ~95%+ بـ 500 صورة فقط.

Fine Tuning — الضبط الدقيق

بعد Feature Extraction، نُ thaw (نُفعّل) آخر 1–3 blocks من CNN ونُدرّبها بـ learning rate صغير (0.0001). النموذج يُكيّف الميزات العامة (حواف، أشكال) لميزات مخصصة (أنواع سرطان، أنواع نباتات).

متى Fine Tuning؟
  • بياناتك مختلفة عن ImageNet (أشعة، أقمار صناعية).
  • Feature Extraction وحدها لا تكفي.
  • لديك بيانات كافية (1000+).
# Fine-tuning آخر block
for param in model.layer4.parameters():
param.requires_grad = True
optimizer = optim.Adam(
filter(lambda p: p.requires_grad, model.parameters()),
lr=1e-4
)
بيانات قليلة (<500): Feature Extraction + augmentation.
بيانات متوسطة (500–5000): Fine-tune آخر block.
07 المحور السابع

Object Detection — كشف الأشياء

Classification يقول: «هذه صورة قطة». Detection يقول: «قطة عند (x=120, y=80) بحجم 200×150، وكلب عند (300, 200)». نحتاج: ماذا + أين.

R-CNN (2014)

Region Proposals → CNN لكل منطقة → SVM. دقيق لكن بطيء جدًا — ثوانٍ لصورة واحدة.

Fast R-CNN (2015)

CNN مرة واحدة على الصورة كاملة + ROI Pooling. أسرع 10× من R-CNN.

Faster R-CNN (2015)

RPN — Region Proposal Network تتعلّم اقتراح المناطق. End-to-end، ~5 FPS.

YOLO (2016+)

You Only Look Once — الصورة → grid، كل خلية تتنبأ boxes + classes. Real-time — 30–100+ FPS.

SSD (2016)

Single Shot Detector — multi-scale feature maps. توازن سرعة/دقة بين YOLO وFaster R-CNN.

YOLO — كيف يعمل ببساطة؟

مثال YOLOv8
  1. صورة 640×640 → CNN backbone (مثل CSPDarknet).
  2. تُقسّم لـ grid (مثل 20×20).
  3. كل خلية تتنبأ: bounding box (x,y,w,h) + confidence + class probabilities.
  4. Non-Max Suppression: نحذف boxes متداخلة — نُبقي الأفضل.
  5. مخرج: «person 0.92 at [100,50,200,400]», «car 0.87 at [300,200,500,350]»
IoU — Intersection over Union

مقياس تداخل box التنبؤ مع box الحقيقي. IoU > 0.5 = «كشف صحيح». mAP (mean Average Precision) = مقياس أداء Detection على benchmark مثل COCO.

# YOLO مع ultralytics — 3 أسطر!
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model('street.jpg') # كشف سيارات، مشاة، إشارات
النموذجالسرعةالدقةالاستخدام
Faster R-CNNبطيء (~5 FPS)عاليةبحث، دقة حرجة
SSDمتوسط (~20 FPS)جيدةموبايل، embedded
YOLOv8سريع (30–100 FPS)جيدة–عاليةReal-time، CCTV، رobotics
08 المحور الثامن

Segmentation — تجزئة الصورة

Detection يرسم مستطيل حول الكائن. Segmentation يُحدّد كل بكسل: «هذا بكسل قطة»، «هذا خلفية»، «هذا طريق». مهم في: طب، قيادة ذاتية، تحرير صور.

FCN (2015)

Fully Convolutional Network — أول segmentation end-to-end. يستبدل FC بـ Conv — مخرج heatmap بنفس حجم الصورة (تقريبًا).

U-Net (2015)

Encoder-Decoder + skip connections على شكل U. ممتاز للصور الطبية — بيانات قليلة.

Mask R-CNN (2017)

Faster R-CNN + branch لـ pixel mask لكل كائن. Instance segmentation — كل قطة mask منفصلة.

DeepLab (2018)

Atrous (dilated) conv — receptive field أكبر بدون تصغير. Semantic segmentation دقيق.

Semantic vs Instance Segmentation

Semantic: كل بكسل له class — «كل البكسلات الزرقاء = سماء». لا يُفرّق بين قطة1 وقطة2.
Instance: كل كائن mask منفصلة — «قطة1»، «قطة2»، «كلب1».

U-Net — لماذا U؟

U-Net: Encoder (تصغير) ← → Decoder (تكبير) Bottleneck Skip connections تنقل تفاصيل دقيقة من Encoder إلى Decoder
U-Net — شكل U مع جسور بين الطبقات المتقابلة
مثال طبي: تجزئة tumor

مدخل: MRI دماغ 256×256. U-Net → mask 256×256 — كل بكسل: 0=خلفية، 1=tumor. Dice coefficient يقيس التداخل مع mask الطبيب — >0.85 ممتاز.

09 المحور التاسع

مشاريع عملية — من الفكرة إلى النموذج

أفضل طريقة للتعلّم: مشروع حقيقي. هذه أربعة مجالات شائعة مع خطوات عملية للمبتدئ.

Image Classification — تصنيف الصور

مشروع: CIFAR-10 (10 فئات)
  1. البيانات: 60,000 صورة 32×32 — طائر، سيارة، قطة...
  2. Preprocessing: normalize، augmentation (flip, crop).
  3. النموذج: 3 Conv blocks + MaxPool + Dense — أو ResNet-18 transfer learning.
  4. التدريب: Adam, lr=0.001, 50 epoch, Early Stopping.
  5. النتيجة المتوقعة: CNN بسيط ~75%، ResNet transfer ~93%+.
# CIFAR-10 سريع — PyTorch
train_set = datasets.CIFAR10('./data', train=True, transform=transforms.ToTensor())
model = models.resnet18(weights='IMAGENET1K_V1')
model.fc = nn.Linear(512, 10) # 10 فئات

Face Recognition — التعرّف على الوجوه

Pipeline: Face Detection (MTCNN أو Haar) → Face Embedding (FaceNet, ArcFace) → مقارنة cosine similarity.

كيف Face ID يعمل؟

1. كشف الوجه في الكاميرا. 2. CNN (مثل FaceNet) تحوّل الوجه → متجه 128 رقم (embedding). 3. عند التسجيل: تُخزَّن embedding وجهك. 4. عند الفتح: embedding جديد vs المخزّن — إذا similarity > threshold → فتح.

مشروع مبتدئ

مجلد faces/person1/، faces/person2/ — 20 صورة لكل شخص. استخدم facenet-pytorch أو deepface. دقة ~95%+ بـ 20 صورة/شخص.

Medical Imaging — التصوير الطبي

أشعة X، MRI، CT — CNN + Transfer Learning. تحديات: بيانات قليلة، class imbalance، دقة حرجة.

المهمةالبياناتالنموذجالمقياس
كشف pneumonia من X-rayChestX-ray14DenseNet-121 + TLAUC, Sensitivity
تجزئة tumor MRIBraTSU-Net 3DDice score
كشف diabetic retinopathyEyePACSEfficientNetQuadratic Kappa
Data augmentation: rotate, flip — ضروري لبيانات طبية قليلة.
Class weights: إذا 95% سليم و5% مرض — وزّن Loss.

OCR — التعرّف على النص في الصور

Optical Character Recognition: صورة فيها نص → نص رقمي. Pipeline حديث: Detection (أين النص؟) + Recognition (ماذا يقول؟).

مثال: قراءة لوحة سيارة
  1. YOLO أو EAST — كشف منطقة اللوحة.
  2. Crop + تصحيح زاوية (perspective transform).
  3. CNN + CTC أو Transformer (CRNN) — قراءة الأحرف.
  4. مخرج: «ABC 1234»

أدوات جاهزة: Tesseract (كلاسيكي)، EasyOCR، PaddleOCR — CNN + RNN/Transformer داخليًا.

import easyocr
reader = easyocr.Reader(['ar', 'en'])
result = reader.readtext('document.jpg')
for bbox, text, conf in result:
print(f'{text} ({conf:.2f})')
خطة مشروعك الأول — 14 يومًا
  1. يوم 1–2: MNIST بـ CNN بسيط — افهم Conv+Pool.
  2. يوم 3–5: CIFAR-10 + Transfer Learning (ResNet).
  3. يوم 6–8: مشروعك: 2–3 فئات من صورك (هاتف).
  4. يوم 9–10: YOLO — كشف أشياء في فيديو.
  5. يوم 11–12: EasyOCR — قراءة نص عربي/إنجليزي.
  6. يوم 13–14: GitHub README + demo — وثّق مشروعك!
FAQ أسئلة

أسئلة شائعة عن CNN

CNN vs Fully Connected للصور؟
CNN دائمًا للصور — parameters أقل، translation invariant، hierarchical features. FC فقط للصور صغيرة جدًا (MNIST) أو بعد طبقات Conv.
كم filter أضع في Conv الأولى؟
ابدأ بـ 32، ثم 64، 128 في الطبقات التالية — pattern «double» شائع. للمبتدئين: استخدم ResNet/EfficientNet جاهز بدل التخمين.
Classification vs Detection vs Segmentation؟
Classification: «ماذا في الصورة؟» (قطة). Detection: «ماذا وأين؟» (قطة عند x,y). Segmentation: «أي بكسل لأي class؟» — mask لكل بكسل.
هل أحتاج GPU؟
MNIST/CIFAR على CPU. Transfer Learning وYOLO — GPU مُستحسن (Google Colab مجاني). ImageNet من الصفر — GPU قوي لأسابيع.
PyTorch أم TensorFlow لـ CNN؟
كلاهما ممتاز. PyTorch + torchvision للتعلّم والبحث. TensorFlow + Keras للإنتاج وTFLite للموبايل. المفاهيم متطابقة.
Overfitting على صور — ماذا أفعل؟
(1) Data augmentation. (2) Dropout. (3) Transfer Learning بدل training from scratch. (4) Early Stopping. (5) بيانات أكثر — الأهم!
ما الخطوة التالية بعد هذا الدرس؟
جرّب مشروع CIFAR-10 + YOLO. ثم الجزء الثالث عن Transformers وGANs. للرياضيات: الجبر الخطي وحساب التفاضل.