Convolutional Neural Networks (CNN)
الرؤية الحاسوبية والتعامل مع الصور
دليل عربي مفصّل للمبتدئين يشرح كيف «ترى» الآلة الصور: من البكسل والقنوات اللونية، إلى الالتفاف والتجميع، ثم أشهر المعماريات (ResNet، YOLO)، Transfer Learning، كشف الأشياء، التجزئة، ومشاريع عملية — بأمثلة رقمية وتشبيهات من الحياة اليومية.
Image Processing Basics — أساسيات معالجة الصور
قبل أن نبني شبكة CNN، نحتاج أن نفهم كيف تُخزَّن الصورة في الحاسوب. الصورة ليست «صورة» بالمعنى البصري — بل هي جدول أرقام. والشبكة العصبية لا «ترى» — بل تُجرِي عمليات رياضية على هذه الأرقام.
Pixels — البكسلات
البكسل (Pixel = Picture Element) هو أصغر وحدة في الصورة — مربّع صغير جدًا. كل بكسل يحمل قيمة رقمية تمثل شدة اللون أو السطوع.
تخيّل صورة كلوحة فسيفساء: كل قطعة صغيرة = بكسل. لو اقتربت كثيرًا من شاشة التلفاز القديمة، ترى مربّعات RGB — هذه هي البكسلات. دقة الصورة = عدد البكسلات (مثل 1920×1080 = حوالي 2 مليون بكسل).
صورة صغيرة 4×4 = 16 بكسل. كل بكسل قيمة من 0 (أسود) إلى 255 (أبيض):
80, 120, 200, 255,
30, 60, 90, 110,
200, 180, 160, 140 ]
هذا المصفوفة 4×4 هي ما «يراه» الحاسوب. CNN ستمرّر filters على هذه الأرقام لاكتشاف أنماط (حواف، تدرّجات).
Channels — القنوات
القناة (Channel) = طبقة منفصلة من البيانات لكل بكسل. في صورة RGB، لكل بكسل 3 قيم: واحدة للأحمر، واحدة للأخضر، واحدة للأزرق. في صورة رمادية، قناة واحدة فقط.
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 إلى رمادي بمعادلة:
الأخضر يُponder أكثر لأن العين البشرية حسّاسة له. MNIST (أرقام مكتوبة بخط اليد) صور رمادية 28×28 — مثالي للمبتدئين.
| النوع | القنوات | مثال | حجم Tensor |
|---|---|---|---|
| Grayscale | 1 | MNIST، أشعة X | (28, 28, 1) |
| RGB | 3 | CIFAR-10، selfies | (32, 32, 3) |
| RGBA | 4 | PNG بشفافية | (H, W, 4) |
| Multi-spectral | 5+ | أقمار صناعية، طب | (H, W, N) |
قبل إدخال الصورة للشبكة، نقسم القيم على 255 لتصبح بين 0 و 1 — أو نستخدم mean/std (مثل ImageNet). بدون ذلك، التدريب بطيء أو لا يتقارب. مثال: img = img / 255.0
CNN Architecture — بنية الشبكة الالتفافية
لماذا لا نستخدم شبكة Fully Connected للصور؟ صورة 224×224×3 = 150,528 مدخل. طبقة واحدة → 1000 عصبون = 150 مليون وزن! CNN تحل المشكلة بثلاث أفكار: مشاركة الأوزان، التركيز المحلي، والتسلسل الهرمي.
Convolution — الالتفاف (مثال خطوة بخطوة)
الالتفاف = نافذة صغيرة (filter) تنزلق على الصورة، تُضرب قيمها بقيم البكسلات، ثم تُجمع. الناتج = Feature Map.
Filter 3×3 (كشف حواف عمودية):
[-1, 0, 1]
[-1, 0, 1]
منطقة 3×3 من الصورة (قيم brightness):
[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 الحواف العمودية يعطي قيمة عالية عندها ومنخفضة في الباقي.
Filters — المرشحات
Filter = مصفوفة أوزان يتعلّمها النموذج. الطبقات الأولى: حواف. العميقة: عيون، عجلات، وجوه.
مدخل 128×128×3 → مخرج 128×128×32 — 32 خريطة، كل واحدة تبحث عن نمط مختلف.
Kernels — النواة
Kernel = Filter (نفس المعنى غالبًا). الأحجام الشائعة: 3×3، 5×5، 7×7. Kernel أكبر = رؤية أوسع لكن parameters أكثر.
Feature Maps — خرائط الميزات
كل filter → feature map واحدة. 64 filter → 64 خريطة. التسلسل الهرمي:
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)
)
Pooling — التجميع
Pooling يُصغّر الصورة ويُبقي أهم المعلومات — «تلخيص» منطقة. يقلّل الحسابات ويُعطي translation invariance: القطة يمينًا أو يسارًا — النموذج يتعرّف عليها.
Max Pooling
نافذة 2×2 → نأخذ أكبر قيمة. الأكثر شيوعًا.
224×224 → MaxPool 2×2 → 112×112
Average Pooling
متوسط القيم في النافذة — أنعم، يحافظ على معلومات أكثر.
Global Pooling
GAP: متوسط كل feature map → متجه. 512 خريطة 7×7 → 512 رقم. يستبدل Flatten الكبير — ResNet يستخدمه.
| النوع | الفكرة | الاستخدام |
|---|---|---|
| Max Pooling | أقصى قيمة | الافتراضي |
| Average Pooling | متوسط | تنعيم |
| Global Pooling | متوسط الخريطة كاملة | قبل التصنيف |
CNN Layers — طبقات الشبكة بالتفصيل
كل طبقة لها hyperparameters تتحكم في شكل المخرجات. فهمها = الت debug واختيار البنية الصحيحة.
Padding — الحشو
نضيف أصفارًا (أو قيمًا) حول حواف الصورة قبل Conv. Same padding يحافظ على الحجم: 224×224 تبقى 224×224.
صورة 5×5، filter 3×3، بدون padding → 3×3 (تصغّر!). مع padding=1 → 5×5 (نفس الحجم).
Stride — الخطوة
Stride = كم بكسل يتحرك Filter. Stride=1 (بطيء، دقة عالية). Stride=2 (أسرع، تصغير مثل Pooling).
Flatten — التسطيح
بعد Conv+Pool، tensor 3D (مثل 7×7×512) → متجه 1D (25088). يربط CNN بـ Dense للتصنيف.
Dense Layers — الطبقات الكثيفة
في النهاية: Flatten → Dense(128) → ReLU → Dropout → Dense(num_classes) → Softmax. Dense = كل عصبون متصل بكل المدخلات.
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')
])
أشهر المعماريات — من 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-5 | Parameters | ملاحظة |
|---|---|---|---|---|
| LeNet-5 | 1998 | — | 60K | MNIST |
| AlexNet | 2012 | 15.3% | 60M | بداية الثورة |
| VGG-16 | 2014 | 7.3% | 138M | بسيطة |
| ResNet-50 | 2015 | 3.6% | 25M | الأكثر استخدامًا |
| EfficientNet-B0 | 2019 | ~3.3% | 5M | كفاءة عالية |
resnet = models.resnet50(weights='IMAGENET1K_V2')
efficient = models.efficientnet_b0(weights='IMAGENET1K_V1')
Transfer Learning — نقل التعلّم
تدريب ResNet على ImageNet (1.2M صورة) يأخذ أسابيع على GPU. Transfer Learning: نأخذ نموذجًا مُدرَّبًا مسبقًا ونُكيّفه لمهمتنا — دقة عالية ببيانات قليلة.
Feature Extraction — استخراج الميزات
نُجمّد (freeze) كل طبقات CNN المُدرَّبة — نستخدمها كـ «مستخرج ميزات» جاهز. نضيف Dense جديدة فقط للتصنيف.
- حمّل ResNet-50 مُدرَّب على ImageNet.
- Freeze كل الطبقات:
for p in model.parameters(): p.requires_grad = False - استبدل آخر Dense بـ Dense(2) — قطة/كلب.
- درّب الطبقة الأخيرة فقط — 10 epochs قد تكفي!
- دقة ~95%+ بـ 500 صورة فقط.
Fine Tuning — الضبط الدقيق
بعد Feature Extraction، نُ thaw (نُفعّل) آخر 1–3 blocks من CNN ونُدرّبها بـ learning rate صغير (0.0001). النموذج يُكيّف الميزات العامة (حواف، أشكال) لميزات مخصصة (أنواع سرطان، أنواع نباتات).
- بياناتك مختلفة عن ImageNet (أشعة، أقمار صناعية).
- Feature Extraction وحدها لا تكفي.
- لديك بيانات كافية (1000+).
for param in model.layer4.parameters():
param.requires_grad = True
optimizer = optim.Adam(
filter(lambda p: p.requires_grad, model.parameters()),
lr=1e-4
)
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 — كيف يعمل ببساطة؟
- صورة 640×640 → CNN backbone (مثل CSPDarknet).
- تُقسّم لـ grid (مثل 20×20).
- كل خلية تتنبأ: bounding box (x,y,w,h) + confidence + class probabilities.
- Non-Max Suppression: نحذف boxes متداخلة — نُبقي الأفضل.
- مخرج: «person 0.92 at [100,50,200,400]», «car 0.87 at [300,200,500,350]»
مقياس تداخل box التنبؤ مع box الحقيقي. IoU > 0.5 = «كشف صحيح». mAP (mean Average Precision) = مقياس أداء Detection على benchmark مثل COCO.
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 |
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
U-Net — لماذا U؟
مدخل: MRI دماغ 256×256. U-Net → mask 256×256 — كل بكسل: 0=خلفية، 1=tumor. Dice coefficient يقيس التداخل مع mask الطبيب — >0.85 ممتاز.
مشاريع عملية — من الفكرة إلى النموذج
أفضل طريقة للتعلّم: مشروع حقيقي. هذه أربعة مجالات شائعة مع خطوات عملية للمبتدئ.
Image Classification — تصنيف الصور
- البيانات: 60,000 صورة 32×32 — طائر، سيارة، قطة...
- Preprocessing: normalize، augmentation (flip, crop).
- النموذج: 3 Conv blocks + MaxPool + Dense — أو ResNet-18 transfer learning.
- التدريب: Adam, lr=0.001, 50 epoch, Early Stopping.
- النتيجة المتوقعة: CNN بسيط ~75%، ResNet transfer ~93%+.
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.
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-ray | ChestX-ray14 | DenseNet-121 + TL | AUC, Sensitivity |
| تجزئة tumor MRI | BraTS | U-Net 3D | Dice score |
| كشف diabetic retinopathy | EyePACS | EfficientNet | Quadratic Kappa |
OCR — التعرّف على النص في الصور
Optical Character Recognition: صورة فيها نص → نص رقمي. Pipeline حديث: Detection (أين النص؟) + Recognition (ماذا يقول؟).
- YOLO أو EAST — كشف منطقة اللوحة.
- Crop + تصحيح زاوية (perspective transform).
- CNN + CTC أو Transformer (CRNN) — قراءة الأحرف.
- مخرج: «ABC 1234»
أدوات جاهزة: Tesseract (كلاسيكي)، EasyOCR، PaddleOCR — CNN + RNN/Transformer داخليًا.
reader = easyocr.Reader(['ar', 'en'])
result = reader.readtext('document.jpg')
for bbox, text, conf in result:
print(f'{text} ({conf:.2f})')
- يوم 1–2: MNIST بـ CNN بسيط — افهم Conv+Pool.
- يوم 3–5: CIFAR-10 + Transfer Learning (ResNet).
- يوم 6–8: مشروعك: 2–3 فئات من صورك (هاتف).
- يوم 9–10: YOLO — كشف أشياء في فيديو.
- يوم 11–12: EasyOCR — قراءة نص عربي/إنجليزي.
- يوم 13–14: GitHub README + demo — وثّق مشروعك!