التعلم العميق وأستخداماته في الرؤية الحاسوبية - الجزء السابع
Deep Learning For Computer Vision-Part 7
تصنيف الصور
Image Classification
وهو أحد المواضيع المهمة والأساسية للرؤية الحاسوبية (Computer Vision) والذي تبتني عليه كثير من المواضيع الأخرى مثل موضوع كشف الأشياء (Object Detection) وكذلك موضوع ال (Segmentation). ويسمى هذا الموضوع (Image Classification) في مجال الرؤية الحاسوبية, وهو عبارة عن تصنيف كل صورة عن الأخرى تبعاً للشيء الذي تحويه كل صورة وإعطاء الصورة كاملة صنف الشيء الموجود داخلها.
إنَّ عملية التصنيف أما أن تكون مباشرة أي إعطاء صنف للصورة أو إعطاء مجموعة إحتمالات لمجموعة الأشياء المدخلة إلى النموذج ويكون الإحتمال الأكبر يمثل الصنف الذي تحويه الصورة فعلياً, والشكل التالي يمثل المعلومات الخارجة من أحد النماذج المدربة على القيام بتصنبف مجموعة من الصور على أساس صورة الحيوان الموجود فيها:
تطبيقات تستخدم التعلم العميق في تصنيف الصور
سوف نقوم بإنشاء مجموعة تطبيقات تستخدم أسلوب التعلم العميق في مجال تصنيف الصور, وسوف نبدأ بإنشاء تطبيق يقوم بتصنيف الصور التي تحتوي على أرقام مكتوبة بخط اليد.
التطبيق الأول - تصنيف الأرقام المكتوبة بخط اليد
الشكل التالي يوضح أمثلة لهذه الصور وبيانات التسمية (labels) الموجودة ضمن (MNIST dataset):
تنفيذ التطبيق بإستخدام مكتبة (Tensorflow):
السطر رقم (1): هو لإستدعاء مكتبة (tensorflow) كما مر بنا سابقاً.
السطر رقم (2): هو لإستدعاء الدالة المساعدة لتحميل البيانات (helper function) المسماة (datasets).
السطر رقم (4): هو لتحميل البيانات (MNIST) وتوزيعها على مجموعتين هما مجموعة بيانات التدريب وتتكون من بيانات الإدخال (x_train) وبيانات التسميات (Labels) أي (y_train), والمجموعة الثانية هي مجموعة بينات الإختبار وتتكون من (x_test) و (y_test).
السطر رقم (5): لتحويل بيانات التسمية الخاصة بالتدريب (y_train) إلى صيغة (One_hot encoder).
السطر رقم (6): لتحويل بيانات التسمية الخاصة بالإختبار (y_test) إلى صيغة (One_hot encoder).
إنَّ شكل بيانات التسمية (Labels) بعد تحويلها إلى صيغة (one_hot encoding) يمكن توضيحها في الشكل التالي:
دعونا الآن نتعرف على بعض خصائص هذه البيانات وذلك بكتابة الأكواد المناسبة لعرضها.
ذكرنا سابقاً إنَّ هذه البيانات تنقسم إلى (Training set & Testing set) ولكي يتم تقييم صحة التدريب وبشكل متكرر إثناء التدريب تؤخذ مجموعة صغيرة من بيانات التدريب لأجل إجراء عملية إختبار أولي للنموذج بعد كل دفعة تدريب (batch) لتقييم ماإذا كانت عملية التدريب تجري بالإتجاه الصحيح أم لا وعلى ضوء النتائج يتم تحديث القيم الغير خاضعة للتدريب (Hyperparameters). تسمى هذه المجموعة (Validation set).
المصفوفة الأولى خاصة بالصور (images) تتألف من (60000) صف من البياناتت وشكلها يكون
(60000, 28, 28).
المصفوفة الثانية خاصة بالتسميات (labels) لها (60000) من الصفوف وكذلك لها (10) من الأعمدة, أي أنها عبارة عن مصفوفة ذات أبعاد (60000 x 10).
3 – مجموعة الإختبار (Test set) والتي تضم (10000) من الصور (images) وكذلك تضم (10000) من التسميات (labels). كما هو الحال في مجموعة التدريب فإنَّ هذه المجموعة تحتوي على مصفوفتين هما:
مصفوفة الصور (images) ذات الأبعاد (10000, 28, 28),
ومصفوفة التسميات (labels) ذات الأبعاد (10000 x 10).
نقوم الآن بكتابة الكود المناسب لإظهار شكل المصفوفات وكما موضح في الشكل التالي:
كذلك نستطيع عرض نماذج من الصور التي تحويها مجموعة البيانات هذه لكي نتعرف على بعضها وكما في الكود التالي الذي يوضح الكود الخاص بعرض الصورة الأولى في مجموعة الإختبار (Testing set) وهي هنا تحتوي على الرقم (7), وكذلك قمنا بكتابة كود مناسب لعرض التسمية (label) لهذه الصورة :
شرح الكود:
السطر رقم (1) : قمنا بإختيار الصورة الأولى من مصفوفة الصور في مجموعة الإختبار (Testing set)
وأودعناها في المتغير (first_image).
السطر رقم (2): قمنا بإختيار التسمية الأولى من مصفوفة التسميات (Labels) في مجموعة الإختبار
(Testing set) وأودعنا بياناته في المتغير (first_label) حيث إنه يمثل التسمية للصورة التي إخترناها.
السطر رقم (3): تجهيز الصورة بإنشاء المحتوى الذي يضمها وقد إخترنا أن يتم عرضها بهيئة تدرج
رمادي (gray scale).
السطر رقم (4): لأجل عرض مستطيل داخل الصورة يضم داخله الليبل الخاص بالصورة, وقد إخترنا
اللون الأصفرلخلفية المستطيل وكذلك الإضاءة له (0.7) وكذلك حجم الخط (25).
بعد تنفيذ هذا الكود نحصل على الصورة الموضحة في الشكل التالي:
نبدأ الآن بكتابة الكود الخاص بالتطبيق وكما موضح أدناه:شرح الكود:
السطر رقم (3) والسطر رقم (4): لإستدعاء بعض الكلاسات التي تستخدم في إنشاء الطبقات المختلفة.
السطر رقم (5): إستدعاء الكلاس (Input) الذي نستخدمه في إنشاء طبقة الإدخال (Input layer) وكذلك لإستدعاء الكلاس (Model) الذي نستخدمه في بناء النموذج.
السطر رقم (6): إسندعاء الكلاس (Adam) الذي نستخدمه في إنشاء خوارزمية التحسين (Optimizer).
السطر رقم (1): لتحميل مجموعة البيانات نوع (MNIST) وهي مجموعة بيانات تمثل صور لأرقام من صفر إلى تسعة مكتوبة بخط اليد مع بيانات التسمية (Labels) لها. وكذلك يتم هنا عزل مجموعة بيانات التدريب عن مجموعة بيانات الإختبار.
السطر رقم (2) و السطر رقم (3): لتحويل نوع بيانات الصور من (Integer) إلى نوع (Float) لكل من مجموعة التدريب وكذلك مجموعة الإختبار.
السطر رقم (4) و السطر رقم (5): لإضافة بعد رابع لبيانات الصور لكل من التدريب والإختبار. حيث يصبح شكل بيانات صور التدريب (60000, 28, 28, 1) وشكل بيانات صور الإختبار (10000, 28, 28, 1). والرقم (1) الذي تمت إضافته يمثل العمق (Deep) لمصفوفة بيانات الصور الداخلة للنموذج والتي تبين إن هذه البيانات تمثل صور غير ملونة أي تدرج رمادي فقط لكي يفهمها النموذج.
السطر رقم (6) و السطر رقم (7): لتحويل بيانات التسمية (Labels) لكل من مجموعة التدريب وكذلك مجموعة الإختبار إلى صيغة (One_hot encoder), فمثلاً إذا كانت التسمية هي (2) فسوف تصبح حسب هذه الصيغة (0010000000), وإذا كانت (7) فسوف تصبح (0000000100) وهكذا لبقية الأرقام.
السطر رقم (1): للبدآ ببناء النموذج, حيث نبدأ بإنشاء طبقة الإدخال (Input layer) والتي تمثل نواة النموذج, وقد إستخدمنا الكلاس (Input) في إنشاء هذه الطبقة والذي قمنا بإستدعاءه سابقاً. وسوف نستخدم أسلوب (Keras functional API) في بناء النموذج.
السطر رقم (2): لإنشاء الطبقة الإلتفافية (Convolution layer) الأولى بإستخدام الكلاس (Conv2D) والذي قمنا بإستدعاءه سابقاً, حيث إخترنا لهذه الطبقة عدد (64) من الوحدات (Units or Neurons), وإخترنا دالة التنشيط (Activation function) لتكون (RELU).
السطر رقم (3): لإنشاء طبقة التجميع (Pooling layer) الأولى عن طريق الكلاس (MaxPool2D).
السطر رقم (4): لإنشاء الطبقة الإلتفافية (Convolution layer) الثانية بإستخدام الكلاس (Conv2D) , حيث إخترنا لهذه الطبقة عدد (128) من الوحدات (Units or Neurons), وإخترنا دالة التنشيط (Activation function) لتكون (RELU).
السطر رقم (5): لإنشاء طبقة التجميع (Pooling layer) الثانية عن طريق الكلاس (MaxPool2D).
السطر رقم (6):لإنشاء طبقة مسطحة (Flatten layer) وذلك بإستخدام الكلاس (Flatten) الذي قمنا بإستدعاءه سابقاً, وتحتوي هذه الطبقة على وحدات (Units) بعدد مجموع وحدات الطبقة التي قبلها.
السطر رقم (7): لإنشاء طبقة كثيفة (Dense layer) عن طريق الكلاس (Dense) ويوجد فيها (1024) من الوحدات.
السطر رقم (8): لإنشاء طبقة من نوع (Dropout layer) عن طريق الكلاس (Dropout) والغرض من هذه الطبقة هو للتقليل من ظاهرة ال(Overfitting) التي تحدث إثناء عملية تدريب النموذج, حيث تقوم هذه الطبقة بإهمال بعض الوحدات (Units) وحسب النسبة التي نختارها, وقد إخترنا نسبة (40%).
السطر رقم (9): لإنشاء طبقة الإخراج (Output layer) وهي من نوع الطبقات الكثيفة (Dense layer), حيث إخترنا لها (10) وحدات بعدد الأصناف أي عدد الأرقام التي سوف يقوم النموذج بعد عملية التدريب بتصنيفها. وإخترنا لها دالة التنشيط من نوع (Sigmoid).
السطر رقم (10): لإنشاء النموذج وذلك بعد إكتمال إنشاء الطبقات. وقد إستخدمنا الكلاس (Model) لهذا الغرض, حيث مررنا له طبقة الإدخال وكذلك طبقة الإخراج.
السطر رقم (11): لتهيئة النموذج لغرض التدريب وتجهيزه بما يحتاجه من أدوات, حيث إستخدمنا الدالة (Compile) وقمنا بتمرير خوارزمية حساب قيمة الفقد (Loss) وقد إخترنا خوارزمية (categorical_crossentropy) لهذا الغرض. كذلك مررنا لهذه الدالة خوارزمية التحسين (Optimizer) وقد إخترنا الخوارزمية نوع (Adam),وقد إخترنا معدل التعلم (Learning rate) ليكون (0.0001) وقد تم إختيار هذا الرقم بعد أن قمنا بعدة تجارب, وهذه الخوارزمية سنقوم بتوضيحها لاحقاً إن شاء ألله. كذلك إخترنا مقياس الدقة (Accuracy) لكي يظهر إثناء عملية التدريب.
السطر رقم (13): للبدأ بعملية التدريب, حيث إستخدمنا الدالة (fit) وقمنا بتمرير المعاملات التالية لها:
1 – بيانات صور التدريب (x_train).
2 – بيانات التسمية الخاصة بالتدريب (y_train).
3 – عدد مرات تكرار مجموعة بيانات التدريب والتي تسمى الحقب (Epochs).
4 – حجم دفعات بيانات التدريب, حيث بيانات التدريب تضخ إلى النموذج على شكل دفعات (Batches).
5 – إختيار درجة الإطناب في عرض مايدور إثناء عملية التدريب والتي تسمى (Verbose). والإطناب هو عكس الإختصار.
السطر رقم (1): للقيام بعملية التقييم (Evaluation) للنموذج بعد إتمام عملية التدريب لكي نعرف مدى الدقة في الأداء التي وصل إليها بعد إتمام عملية التدريب وكذلك قيمة الفقد (Loss), وقد إستخدمنا لهذا الغرض الدالة (evaluate) وقد مررنا لها بيانات الإختبار للصور والتسميات.
السطر رقم (2) و السطر رقم (3): لطباعة كل من قيمة الدقة (Accuracy) وكذلك قيمة الفقد (Loss). ونلاحظ أسفل الكود النتيجة التي حصلنا عليها بعد تدريب النموذج, حيث حصلنا على دقة (98.97%).
سوف نتطرق لاحقاً إلى طرق زيادة هذه الدقة لتصبح أعلى من ذلك بكثير.
إختبار النموذج بعد التدريب:
نقوم الآن بكتابة الكود الخاص بإختبار النموذج بعد القيام بتدريبه وكما يلي:
السطر رقم (1): للقيام بعملية إختبار النموذج بعد التدريب. إستخدمنا الدالة (predict) لهذا الغرض وقمنا بتمرير بيانات صور الإختبار (x_train) ولكن بدون بيانات تسمية (Labels) ونتوقع أن تكون المعلومات الخارجة من النموذج هي تصنيف لصور الأرقام الداخلة إليه, حيث إنَّ كل سطر من البيانات أو نقطة بيانات (Data point) يمثل بيانات لصورة تمثل أحد الأرقام فيجب أن تكون البيانات الخارجة تمثل هذا الرقم.
وهناك ملاحظة مهمة وهي إن البيانات الخارجة والتي يتم إيداعها في المتغير (predicted_classes), هذه البيانات تكون بصيغة (One_hot encoding).
الأسطر من رقم (2) لغاية رقم (17): عملية عرض لبعض من الصور التي أدخلنا بياناتها إلى النموذج وكذلك مايقابلها من التسميات (Labels) لهذه الصور والتي توقعها النموذج.
السطر رقم (2): نختار عدد الصور في كل صف حيث إننا سوف نعرض مجموعة من الصور في صفين.
السطر رقم (3): لتحديد المساحة الكلية التي سوف تعرض داخلها الصور والتي يكون عددها ثمان صور.
السطر رقم (4): لإنشاء حلقة تكرارية تتكرر بعدد الصور في كل صف.
السطر رقم (5): لإستخلاص التسمية لصورة واحدة في الصف الأول من الصور ومن ثم تحويلها من صيغة (One_hot encoder) إلى صيغ أرقام إعتيادية وذلك عن طريق الدالة (argmax).
السطر رقم (6): لإستخلاص التسمية لصورة واحدة في الصف الثاني من الصور ومن ثم تحويلها من صيغة (One_hot encoder) إلى صيغ أرقام إعتيادية وذلك عن طريق الدالة (argmax).
وبعد تنفيذ الكود نحصل على مايلي:
خاتمة:
تطرقنا في هذا الجزء من المقالات إلى موضوع تصنيف الصور وما هو المقصود منه وماهي الآليات المستخدمة لإنجازه وكذلك قمنا بالتعرف على نوعية البيانات المستخدمة في تدريب النموذج الذي يقوم بهذه المهمة وكيفية معالجتها قبل إدخالها إلى النموذج.
تعليقات
إرسال تعليق