القائمة الرئيسية

الصفحات

التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء السابع

التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء السابع
في هذه المقالة سوف نقوم إن شاء ألله بالتطرق إلى أحد المواضيع المهمة في الرؤية الحاسوبية والتي تستخدم فيها شبكات ال (CNNs) ألا وهو موضوع تصنيف الصور (Image Classification), حيث نقوم أولاً بتوضيح ماهو المقصود بتصنيف الصور ثم نقوم بإنشاء تطبيقات بسيطة ثم نتقدم إلى التطبيقات الأكثر أهمية.

التعلم العميق وأستخداماته في الرؤية الحاسوبية - الجزء السابع

Deep Learning For Computer Vision-Part 7


المهندس حسن فنجان عداي


بسم إلله الرحمن الرحيم
تطرقنا في المقالة السابقة إلى موضوع الشبكات العصبية الإلتفافية (Convolution Neural Networks) وطريقة عملها وسبب تسميتها بهذا الإسم وكذلك تطرقنا إلى أنواع الطبقات المستخدمة فيها ووظيفة كل طبقة وكذلك قمنا بعمل مقارنة بين هذه الشبكات ونظيرتها الشبكات العصبية التقليدية (Artificial Neural Networks), حيث قمنا بالمقارنة بينهما من حيث الدقة (Accuracy) وكذلك من حيث عدد العناصر الواجب تدريبها (Parameters), حيث تعرفنا على الفرق الشاسع بين النوعين حيث إنَّ شبكات ال (CNN) تتميز بالدقة العالية وكذلك بقلة عدد العناصر الواجب تدريبها إذا إفترضنا نفس عدد الطبقات ونفس البيانات الداخلة.

في هذه المقالة سوف نقوم إن شاء ألله بالتطرق إلى أحد المواضيع المهمة في الرؤية الحاسوبية والتي تستخدم فيها شبكات ال (CNNs) ألا وهو موضوع تصنيف الصور (Image Classification), حيث نقوم أولاً بتوضيح ماهو المقصود بتصنيف الصور ثم نقوم بإنشاء تطبيقات بسيطة ثم نتقدم إلى التطبيقات الأكثر أهمية.

تصنيف الصور

Image Classification

وهو أحد المواضيع المهمة والأساسية للرؤية الحاسوبية (Computer Vision) والذي تبتني عليه كثير من المواضيع الأخرى مثل موضوع كشف الأشياء (Object Detection) وكذلك موضوع ال (Segmentation). ويسمى هذا الموضوع (Image Classification)  في مجال الرؤية الحاسوبية, وهو عبارة عن تصنيف كل صورة عن الأخرى تبعاً للشيء الذي تحويه كل صورة وإعطاء الصورة كاملة صنف الشيء الموجود داخلها.

إنَّ عملية التصنيف أما أن تكون مباشرة أي إعطاء صنف للصورة أو إعطاء مجموعة إحتمالات لمجموعة الأشياء المدخلة إلى النموذج ويكون الإحتمال الأكبر يمثل الصنف الذي تحويه الصورة فعلياً, والشكل التالي يمثل المعلومات الخارجة من أحد النماذج المدربة على القيام بتصنبف مجموعة من الصور على أساس صورة الحيوان الموجود فيها:

نلاحظ في الشكل أعلاه أن البيانات الخارجة في الحالة الأولى تؤكد أن الصورة المدخلة إلى النموذج هي صورة كلب, وفي الحالة الثانية صورة قط وذلك من خلال قيم الإحتمالات.

تطبيقات تستخدم التعلم العميق في تصنيف الصور

سوف نقوم بإنشاء مجموعة تطبيقات تستخدم أسلوب التعلم العميق في مجال تصنيف الصور, وسوف نبدأ بإنشاء تطبيق يقوم بتصنيف الصور التي تحتوي على أرقام مكتوبة بخط اليد.


التطبيق الأول - تصنيف الأرقام المكتوبة بخط اليد

في هذا التطبيق نقوم بإنشاء نموذج يقوم بعملية تصنيف مجموعة من الصور مكتوبة بخط اليد على أساس الرقم الذي تحويه, حيث إنَّ كل صورة تحتوي على رقم واحد فقط مكتوب بخط اليد (Handwritten digit).
نستخدم في هذا التطبيق مجموعة بيانات معروفة تسمى (MNIST dataset), حيث إنها إختصار للعبارة
(Modified National Institute of Standard and Technology), حيث إنها تعتبر مجموعة بيانات معدلة من أخرى أكبر حجما  تسمى (NIST). ومجموعة البيانات (MNIST) هي مجانية ويتم تحميلها عن طريق كود معين داخل الكود الرئيسي للتطبيق. هذه البيانات عبارة عن (70000) صورة موزعة مابين التدريب والإختبار (60000 صورة للتدريب و 10000 صورة للإختبار), وهذه الصور ذات أبعاد صغيرة نسبياً حيث تتكون من (28 x 28) بكسل وهي عبارة عن صور مكتوبة بخط اليد من قبل طلاب المدارس الثانوية وموظفي مكتب الإحصاء الأمريكي.

الشكل التالي يوضح أمثلة لهذه الصور وبيانات التسمية (labels) الموجودة ضمن (MNIST dataset):


وهذه البيانات كثيرة الإستخدام من قبل الباحثين ودائماً تستخدم في أي خوارزمية جديدة في موضوع التصنيف (Classification)  إلى درجة أن سميت (Hello world for machine learning) على غرار (Hello World) للمبتدئين في تعلم لغات البرمجة.

يقوم هذا التطبيق بتدريب نموذج (model) على التمييز بين هذه الصور على أساس الرقم الذي تحويه كل صورة, حيث يقوم بتصنيف كل صورة تعطى له وإعطاءها الصنف الخاص بها وهو ال (label) الذي يمثل الرقم الموجود فيها.
سوف نقوم بتنفيذ هذا التطبيق بإستخدام مكتبة (tensorflow) أولاً بعدها نقوم بتنفيذه بإستخدام مكتبة (keras).

تنفيذ التطبيق بإستخدام مكتبة (Tensorflow):

سوف نقوم بإنشاء شبكة من نوع (CNN) تحتوي على (8) طبقات, حيث إنَّ الطبقة الأولى والثالثة هي من نوع (convolution layer) والطبقة الثانية والرابعة من نوع (pooling layer) والطبقة الخامسة من نوع (Flatten layer) والطبقة السادسة والثامنة من نوع (Full connection layer) والطبقة السابعة من نوع (dropout layer) وطبيعة هذه الطبقات قد تم شرحها في المقالة السابقة, ولقد تعمدنا أن تكون هذه الشبكة بسيطة قدر المستطاع لغرض التدرج بتوضيح الموضوع. والشكل التالي يوضح مكونات هذه الشبكة:


والآن نقوم بكتابة الكود لهذا التطبيق.

السطر رقم (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).

وبعد تنفيذ الكود نحصل على مايلي:


خاتمة:

تطرقنا في هذا الجزء من المقالات إلى موضوع تصنيف الصور وما هو المقصود منه وماهي الآليات المستخدمة لإنجازه وكذلك قمنا بالتعرف على نوعية البيانات المستخدمة في تدريب النموذج الذي يقوم بهذه المهمة وكيفية معالجتها قبل إدخالها إلى النموذج.

وبهذا نكون قد إنتهينا من كتابة هذا الجزء والحمد لله رب العالمين.




المهندس حسن فنجان عداي


هل اعجبك الموضوع :

تعليقات

تعليق واحد
إرسال تعليق
  1. السلام عليكم ورحمة الله وبركاته
    اشكرك جداً .............على هذا الشرح الممتع حقاً

    واود طلب بسيط اذا كان بامكانك ارسال الكود لنا عبر الايميل
    هذا aminfarg431@gmail.com

    ردحذف

إرسال تعليق