نوع العمل
هذا العمل هو مشروع تعلم آلي (Machine Learning)، وتحديداً ضمن مجال الرؤية الحاسوبية (Computer Vision)، يستخدم تقنيات التعلم العميق (Deep Learning) لتصنيف الصور (Image Classification). النموذج المصمم هو شبكة عصبية تلافيفية (Convolutional Neural Network - CNN)، وهو النوع الأكثر شيوعاً والأفضل أداءً في معالجة الصور.
ميزات العمل
تعدد الفئات: لا يميز فقط بين "مصاب" و"غير مصاب"، بل يصنف الصور إلى ثلاث فئات دقيقة:
COVID-19: مريض مصاب بفيروس كورونا.
Normal: شخص سليم.
Viral Pneumonia: مريض مصاب بالتهاب رئوي فيروسي (ليس كوفيد-19)، مما يساعد في التشخيص التفريقي.
معالجة البيانات المتقدمة: يستخدم ImageDataGenerator لـ:
توليد البيانات ديناميكياً: يحمل الصور من المجلدات بطريقة منظمة دون الحاجة إلى تحميلها كلها في الذاكرة مرة واحدة، مما يوفر الموارد.
زيادة البيانات (Data Augmentation): يقوم بتوليد نسخ جديدة من صور التدريب عن طريق تطبيق تحولات عشوائية (تدوير، قلب، تكبير/تصغير، إلخ). هذه التقنية حاسمة لمحاربة الفرط في التطبيق (Overfitting) وزيادة دقة النموذج من خلال تعليمه على التعرف على الصور من زوايا ومراحل مختلفة.
الهيكل القوي للنموذج: يستخدم بنية نموذجية قوية وشائعة للتعامل مع الصور:
طبقات التلافيف (Conv2D): لاستخراج الميزات من الصور (مثل الحواف، الأشكال، الأنماط).
طبقات التجميع (MaxPooling2D): لتقليل الأبعاد والحسابات، والتركيز على الميزات الأكثر أهمية.
طبقات التسطيح (Flatten) والتوصيل الكثيف (Dense): لتحويل الميزات ثنائية الأبعاد إلى مصفوفة واحدة وتنفيذ عملية التصنيف النهائي.
القابلية للحفظ وإعادة الاستخدام: النموذج المدرب يتم حفظه (model.save()) في ملف. هذا يعني أنه يمكنك لاحقاً:
تحميل النموذج دون الحاجة لإعادة التدريب.
استخدامه لصنع توقعات على بيانات جديدة (مثل صورة جديدة لأشعة سينية).
نشره في تطبيق أو موقع ويب.
طريقة التنفيذ
استيراد المكتبات (import):
* pandas, numpy: للتلاعب بالبيانات والعمليات الحسابية.
* matplotlib, seaborn: لرسم الرسوم البيانية والتخيل.
* tensorflow, keras: المكتبات الأساسية لبناء وتدريب نموذج التعلم العميق.
* os: للتفاعل مع نظام الملفات (مثل سرد المجلدات).
* ImageDataGenerator: أداة قوية لتحميل الصور وزيادة البيانات.
2. تحميل البيانات (df_train, df_test):
* تحديد مسارات المجلدات التي تحتوي على صور التدريب (train) والاختبار (test). كل مجلد يحتوي على ثلاث مجلدات فرعية (واحد لكل فئة: Covid، Normal، Viral Pneumonia).
3. استكشاف البيانات (os.listdir):
* سرد محتووى مجلدات التدريب والاختبار للتأكد من وجود الفئات الثلاثة بشكل صحيح. (['Covid', 'Normal', 'Viral Pneumonia']).
4. معالجة وزيادة البيانات (ImageDataGenerator):
* لتدريب (train_datagen): يتم تكوينه بمعلمات زيادة البيانات (rotation_range, width_shift_range, etc.) وإعادة قياس البكسل (rescale=1./255).
* للتحقق/الاختبار (test_datagen): يتم فقط إعادة قياس البكسل (rescale=1./255) دون زيادة البيانات، لأنه لا ينبغي التلاعب ببيانات الاختبار.
* إنشاء المولدات (flow_from_directory): تقوم هذه الدوال بتحميل الصور من المجلدات، وإعادة حجمها تلقائيًا إلى (target_size), وتجميعها في دفعات (batch_size), وتصنيفها تلقائيًا بناءً على اسم المجلد الفرعي.
5. بناء نموذج الشبكة العصبية (Sequential):
* الطبقات التلافيفية (Conv2D): تقوم باستخراج الميزات من الصور (مثل الحواف، الأشكال).
* طبقات التجميع (MaxPooling2D): تقلل الأبعاد والحسابات، وتساعد في جعل النموذج أكثر كفاءة.
* طبقة (Flatten): تحول المخرجات ثنائية الأبعاد من الطبقات التلافيفية إلى متجه أحادي البعد لتغذيته للطبقات الكثيفة.
* الطبقات الكثيفة (Dense): تقوم بعملية التصنيف النهائي. الطبقة الأخيرة تحتوي على 3 خلايا عصبية (واحد لكل فئة) وتستخدم softmax لإرجاع احتمالية انتماء الصورة إلى كل فئة.
6. تجميع النموذج (model.compile):
* المُحسّن (optimizer): adam، خوارزمية شائعة وفعالة لتحسين الأوزان أثناء التدريب.
* دالة الخسارة (loss): categorical_crossentropy، مناسبة لمشاكل التصنيف متعدد الفئات.
* المقاييس (metrics): accuracy، لمراقبة دقة النموذج أثناء التدريب والاختبار.
7. تدريب النموذج (model.fit):
* هنا يتم تدريب النموذج على بيانات التدريب (train_generator).
* يتم استخدام بيانات التحقق (validation_generator) لتقييم أداء النموذج بعد كل عصر (epoch) وضمان أنه لا يحفظ البيانات عن ظهر قلب (Overfitting).
* epochs=10 يعني أن النموذج سيرى مجموعة التدريب الكاملة 10 مرات.
8. حفظ النموذج (model.save):
* بعد انتهاء التدريب، يتم حفظ النموذج الكامل (بما فيه الهندسة المعمارية والأوزان) في ملف. هذا يسمح لك بمشاركته أو استخدامه لاحقًا للتنبؤ بصور جديدة دون الحاجة إلى كل هذا الكود