التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء التاسع
Deep Learning for Computer Vision- part 9
سنقوم إن شاء ألله في هذه المقالة بالتعرف على أنواع أخرى شائعة من مجاميع البيانات (Datasets) يمكن الحصول عليها بشكل مجاني والتي تستخدم في تدريب وإختبار النماذج الخاصة بتصنيف الصور, كذلك نقوم بإستعراض أهم النماذج المشهورة في مجال تصنيف الصور والتي كثيراً ماتستخدم في مواضيع الرؤية الحاسوبية الأخرى مثل كشف الأشياء (Objects Detection) وكذلك مجال تقطيع عناصر الصورة (Segmentation).
وأخيراً نقوم بالإستمرار بإنشاء وتنفيذ شبكات عصبية عميقة لأجل الحصول على نماذج قادرة على القيام بعملية التصنيف للصور (Images Classification). حيث سنقوم أولاً بإنشاء نموذج يقوم بتصنيف صور الكلاب عن صور القطط.
Other popular image testing datasets
The CIFAR dataset
وهي مختصر لجملة (Canadian Institute for Advanced Research), وتوجد منها نوعين هما:
1 - (CIFAR-10):
والتي تحتوي على (60000) صورة منها (50000) صورة لأغراض التدريب و (10000) صورة لغرض الإختبار. وأبعاد هذه الصور (32 x 32 pixel). هذه الصور تنقسم إلى (10) أصناف. الشكل التالي يبين مجموعة من الصور موزعة على أصنافها وقد أختيرت عشوائياً من مجموعة البيانات (CIFAR-10):
ونلاحظ من الشكل أعلاه إن هذه الصور صغيرة الأبعاد وكذلك فإن كل صورة تحتوي شيء (Class) واحد فقط.
2 - (CIFAR-100):
وهذه المجموعة لها نفس مواصفات المجموعة الأولى ولكن تنقسم الصور إلى (100) صنف (أي 600 صورة لكل صنف).والمجموعتان يضمان بالإضافة الى الصور جدول التسميات (labels).
The Fashion-MNIST dataset
هذه المجموعة من البيانات قد تم إنشاءها من قبل نفس المؤسسة التي أنشأت مجموعة البيانات الخاصة بالأرقام المكتوبة بخط اليد (MNIST handwritten digits dataset), حيث إنها تحمل نفس مواصفاتها ولكن الصور التي بداخلها هي لمجموعة من الملابس.
The ImageNet dataset
هذه المجموعة تعتبر أهم مجموعة بيانات خاصة بالرؤية الحاسوبية, حيث إنها تحتوي على (14,197,122) صورة وتحتوي على (1000) صنف, وتعتبر مجموعة قياسية لمعرفة مدى دقة وأداء الخوارزميات المستخدمة في مجال تصنيف الصور (image classification algorithms).
The bigger deep learning models
سوف نقوم الآن بإستعراض أهم النماذج المشهورة في مجال تصنيف الصور والمدربة على تصنيف مجموعة بيانات (ImageNet) المذكورة أعلاه والتي حصلت على أفضل النتائج في المنافسات السنوية المعروفة تحت إسم (ImageNet competitions).
1 – النموذج (The AlexNet model):
وهو أول نموذج في مجال تصنيف الصور تم نشره, حيث أخذ بعداً واسعاً من الاهتمام في مجال إستخدام التعلم العميق في الرؤية الحاسوبية. قام بإنشاءه مجموعة من الباحثين وعلى رأسهم كريزهفسكي وآخرين (Krizhevsky et al.). هذا النموذج فاز عام (2013) بالمنافسة السنوية (ImageNet competitions). ويعتبر هذا النموذج ذو معمارية بسيطة نسبياً حيث إنه يحتوي على خمس طبقات فقط من نوع (convolution layers). يستخدم هذا النموذج دالة التنشيط من نوع (ReLU), حيث لوحظ أنَّ إستخدام هذه الدالة يؤدي إلى تسريع عملية التدريب عدة أضعاف مقارنة مع الحالات التي تستخدم فيها الأنواع الأخرى من دوال التنشيط, كما أنه يستخدم تقنية (augmentation) والتي تعني زيادة حجم ال(Data set) والتي سوف نتطرق إليها لاحقاً, كما أنه يستخدم تقنية (Stochastic Gradient Descent (SGD)) في عملية التحسين (Optimization). والشكل التالي يوضح معمارية هذا النموذج:
يحتوي هذا النموذج على (60) مليون من العناصر الواجب تدريبها.
2 – النموذج (The VGG-16 Model):
وهو نموذج تم إنشاؤه من قبل مؤسسة (Visual Geometry Group from Oxford), وهو نموذج يمتاز بالبساطة الشديدة ولكنه يملك عمقاً أكبر من النموذج السابق (AlexNet). وقد تم إصدار نموذجين من هذا النوع هما النموذج ذو ال (16) طبقة وهو نموذجنا هذا, وهناك نموذج ذو (19) طبقة ويسمى (VGG-19 model).
جميع الطبقات الإلتفافية (Convolutional layers) في هذا النموذج تستخدم (3 by 3 filters) وحجم الخطوة (stride) وكذلك ال(pad) هو (1) والفلتر الخاص بال (Pooling) هو (2) وبخطوة مقدارها (2). إنَّ إستخدام هذه القيم يؤدي إلى تقليل العناصر الواجب تدريبها (Parameters). الشكل التالي يوضح معمارية هذا النموذج:
هذا النموذج يحتوي على (138) مليون من العناصر الواجب تدريبها, ويعتبر أكبر النماذج إحتواءاً على هذه العناصر ولكنه يعتبر أفضل نموذج من حيث توزيعه لهذه العناصر. وهذا النموذج أيضاً تم تدريبه على مجموعة بيانات (ImageNet).
3 – النموذج (The Google Inception-V3 model):
تم إنشاء هذا النموذج من قبل الباحث (Szegedy) وآخرين (et al), وقد فاز في العام (2014) في المنافسة السنوية المسماة (ImageNet competition). إن ظهور هذا النموذج يعتبر خطوة مهمة بإتجاه زيادة الكفاءة والسرعة للنماذج المدربة وكذلك يتميز بقلة العناصر الواجب تدريبها حيث إن هذه العناصر أقل ب(12) ضعف عن العناصر الموجودة في نموذج (AlexNet).والشكل التالي يوضح معمارية هذا النموذج:
4 – النموذج (lThe Microsoft ResNet-50 mode):
تم إنشاء هذا النموذج من قبل (He et al.), وقد فاز في العام (2015) في المنافسة السنوية (ImageNet competition). وقد تمت البرهنة من خلال هذا النموذج على إمكانية تدريب الشبكات الأكثر عمقاً, حيث تم تجاوز عقبة التشبع في الدقة عند زيادة عدد الطبقات. وقد تم التغلب على هذه المشكلة بإستخدام التقنية المسمات
الكتلة المتبقية (residual block) والشكل التالي يوضح هذه التقنية:
5 – النموذج (The SqueezeNet model):
تم إصدار هذا النموذج في العام (2016), وقد قام بإنشاءه وتطويره مجموعة من الباحثين يتبعون ثلاث مؤسسات هي : مؤسسة (DeepScale), جامعة كاليفورنيا, مؤسسة (Berkeley) وجامعة ستانفورد.
كان هدف هؤلاء الباحثين هو إنشاء شبكة عصبية عميقة صغيرة الحجم ذات عناصر قابلة للتدريب قليلة يمكن تدريبها في أجهزة الحاسوب الإعتيادية ويمكن نقلها بسهولة عبر شبكة الأنترنت.
6 – النموذج (The DenseNet model):
هذا النموذج يعتبر تطوير للنموذج (ResNet) وقد تم إنشاؤه من قبل الباحث هوانك وآخرون (Huang et al.).
في معمارية النموذج (ResNet) يتم دمج الطبقة السابقة بالطبقة اللاحقة عن طريق الجمع, أما في حالة (DenseNet) فيتم دمج الطبقة السابقة بالطبقة اللاحقة بطريقة التسلسل, حيث يتم ربط جميع الطبقات مع الطبقات السابقة لها, ويتم ربط الطبقة الحالية إلى الطبقات اللاحقة. كل مصفوفة خصائص (feature map) في أي طبقة تعتبر بيانات إدخال للطبقات اللاحقة. والشكل التالي يوضح هذا النموذج:
إنشاء نموذج لتصنيف صور الكلاب والقطط
نقوم الآن بإنشاء وتدريب نموذج من الشبكات العصبية الإلتفافية (Convolution Neural Network) للقيام بمهمة تصنيف الصور التي تحتوي كل واحدة منها على صورة كلب مفرد مقابل الصور التي تحتوي كل واحدةٍ منها على صورة قط مفرد أيضاً.
نقوم أولاً بتحميل مجموعة البيانات الضرورية لإجراء التدريب وكذلك لإجراء الإختبار وذلك من خلال موقع (www.kaggle.com), حيث نذهب مباشرةً إلى الرابط:
(https://www.kaggle. com/c/dogs-vs-cats/data) ونقوم بتحميل الملفين المضغوطين:
train.zip
test1.zip
وبعد أن نقوم بتحميلهما نقوم بوضعهما في فولدر خاص بهما, حيث نقوم بفك ضغطهما أولاً ثم نقوم بتقسيمهما إلى مجاميع كما سوف نلاحظه لاحقاً.
قمنا بفك الضغط عن مجموعة البيانات والتي هي عبارة عن مجموعتين هما المجموعة الخاصة بالتدريب (train) والمجموعة الخاصة بالإختبار (test) حيث قمنا بوضع كلا الفولدرين في فولدر سميناه (my_dataset) ووضعناه في القرص المحلي (C:\).
تهيئة البيانات للعمل
Preparing the data
نقوم الآن بكتابة الكود اللازم لتهيئة البيانات الضرورية لإجراء عملية التدريب وكذلك عملية الإختبار وذلك بعزل بيانات الصنفين (الكلاب و القطط) بعضهما عن بعض ولكي نستطيع لاحقاً إستخلاص التسمية (label) لكل صورة. والشكل التالي يوضح الكود اللازم لإجراء هذه التهيئة:
الأسطر من رقم (1) ولغاية (3): لإستدعاء بعض الدوال من المكتبة (os), وإستدعاء المكتبة (shutil).
السطر رقم (6): الإعلان عن المسار الذي وضعنا فية البيانات.
الأسطر من (1) لغاية (10): لإنشاء دالة تقوم بتهيئة البيانات, حيث إنَّ:
السطر رقم (2): للإعلان عن مصفوفة فارغة سميناها (image_paths) توضع فيها مسارات الصور.
السطر رقم (3): لإنشاء حلقة تكرارية تتكرر بمقدار الصور التي نحتاجها لكل مهمة والتي نأخذها من البيانات. ويعتمد عدد الصور على إمكانيات الحاسوب المستخدم, حيث إستخدمنا هنا للتدريب (10000) صورة فقط وللإختبار (2000) صورة, ويمكن زيادة هذا العدد حسب إمكانيات الحاسوب المستخدم خاصة إذا كان يحتوي على وحدة المعالجة الصورية (GPU).
السطر رقم (4): لأجل كتابة المسار الكامل لكل صورة المراد إختيارها وحفظ هذا المسار في المتغير (image_path).
السطر رقم (5): لأجل إيداع كل مسار في الخطوة السابقة في المصفوفة (image_paths).
السطر رقم (6): لكتابة المسار الخاص (فقط كتابة وليس إنشاء) لحفظ بيانات الصور المنتخبة.
السطر رقم (7): لإنشاء جملة شرطية تشترط عدم إنشاء الفولدر (data_two) ومايحتويه.
السطر رقم (8): لإنشاء الفولدرات المطلوبة وحسب المسار الذي تمت كتابته في الخطوة (6).
السطر رقم (9): لإنشاء حلقة تكرارية للأجل المباشرة بنسخ بيانات الصور المنتخبة من البيانات الرئيسية ووضعها في الفولدر الذي تم إنشاؤه في الخطوة السابقة.
السطر رقم (10): للمباشرة بعملية النسخ.
الأسطر من (1) لغاية (4): لأجل إستدعاء الدالة التي أنشأناها وتمرير البيانات المطلوبة لها.
بعد تنفيذ هذا الكود نلاحظ ظهور فولدر جديد مع فولدرات التطبيق تحت إسم (data_two), فلو فتحناه سوف نشاهد وجود فولدرين في داخله هما (test & train) وكما مبين في الصورة التالية:
هذا إذا كانت البيئة التي نعمل عليها هي (PyCharm), أما إذا كنا نعمل على بيئة (Jupyter) فإنَّ المجلد يظهر كما في الشكل التالي:
وبذلك نكون قد إنتهينا من تهيئة البيانات المطلوبة لكي نقوم بالمباشرة بالخطوة اللاحقة وهي مرحلة بناء النموذج والقيام بتدريبه بإستخدام هذه البيانات.
بناء النموذج وتدريبه:
سوف نقوم أولاً بعرض بعض الصور من البيانات التي حفظناها في المجلد (data_two) للإطمئنان على صحة العمل الذي قمنا به في المرحلة السابقة.
سوف نقوم بعرض ثمان صور من بيانات التدريب نصفها من الكلاب والنصف الآخر من القطط.
السطر رقم (1): لجلب الدالة (Image) العائدة إلى المكتبة (Pillow) والتي سوف نستخدمها لقراءة بيانات الصور من الملفات.
السطر رقم (2): لجلب لجلب الكلاس (pyplot) من المكتبة (matplotlib) لإستخدامه في عملية عرض الصور.
السطر رقم (3): لإنشاء حلقة تتكرر بعدد الصور في كل صف.
السطر رقم (4) و السطر رقم (5): لقراءة بيانات الصور من الملفات عن طريق الدالة (Image).
بعد تنفيذ الكود أعلاه نحصل على الصور التالية:
ونقوم الآن بكتابة الكود المناسب لبناء نموذج من الشبكات العصبية الإصطناعية العميقة من نوع (CNN) للقيام بمهمة تصنيف صور الكلاب عن صور القطط.
الأسطر من (1) لغاية (6): إستدعاء المكتبات الضرورية.
الأسطر من (1) لغاية (9): لتعيين القيم الثابتة (Hyper parameters) المناسبة في إنشاء النموذج.
الأسطر من (1) لغاية (11): لإنشاء النموذج كاملاً, حيث يتم إنشاء نواة النموذج وإنشاء الطبقات المختلفة وإضافتها إلى النموذج بخطوة واحدة وهذه الإمكانية قد توفرت في الإصدار الثاني من مكتبة (Tensorflow).
السطر رقم (12): لأجل تهيئة النموذج وجعله جاهزاً للتدريب.
السطران (1) و (2): إستدعاء الدالة المهمة (ImageDataGenerator) التابعة إلى مكتبة (tf.keras) والتي تقوم بتوليد دفعات من بيانات الصور المراد تمريرها الى النموذج بهدف تدريبه وكذلك إختباره. وكذلك يمكننا عن طريق هذه الدالة إنتاج بيانات إضافية بعد أخذ نسخ من البيانات الأصلية وإجراء بعض التغييرات عليها ومن ثم إضافتها الى البيانات الأصلية بتقنية تسمى الزيادة (augmentation) حيث تستخدم هذه التقنية في الحالات التي تكون فيها البيانات المطلوبة التي لدينا لعملية التدريب قليلة. قمنا بتمرير قيمة (1. / 255) لأجل جعل قيم البكسلات من (0 à 1.0) بدلاً من (0 à255).
ملاحظة: لم نستخدم تقنية (augmentation) في هذا التطبيق وسوف نستخدمها في التطبيق اللاحق.
السطران رقم (3) و (6): البدء بتفعيل الدفعات المتولدة وكذلك تخصيصها عن طريق الدالة (flow_from_directory) حيث نقوم بتمرير البيانات المناسبة مثل مسار بيانات الصور وحجم كل دفعة وكذلك قياسات كل صورة من حيث ارتفاع الصورة وعرضها, حيث إستخدمنا هنا قياسات صغيرة نسبياً تبعاً لإمكانية الحاسوب ونستطيع أن نزيد هذه القياسات كلما كانت المواصفات والإمكانيات أفضل.
السطر رقم (9): لأجل البدء بعملية التدريب.
تقييم النموذج المدرب
(Model evaluation)
بعد إنتهاء عملية التدريب للنموذج يمكننا الآن أن نقوم بعملية التقييم له والتي من خلالها نحصل على قيمة الفقد (Loss) وكذلك نحصل الدقة في التصنيف (Accuracy) التي وصل إليها نموذجنا بعد عملية التدريب وكما في الكود التالي:
السطر رقم (1): للقيام بعملية التقييم للنموذج عن طريق الدالة (evaluate_generator) حيث نقوم بتمرير بيانات الصور الخاصة بالإختبار لها ونحصل من هذه الدالة على قيمة الفقد (loss) وكذلك نحصل على الدقة (acc), حيث نقوم بإظهار هاتين القيمتين في السطرين الأخيرين. وقد ظهرت لنا القيمتين التاليتين بعد تنفيذ الكود:
حيث نلاحظ أننا حصلنا على دقة للتصنيف مقدارها (78.7%) مع معدل فقد (loss = 0.45), وهذه النتيجة لاترضي طموحنا قطعاً , لذا سوف نبحث عن طرق تمكننا من زيادة الدقة وهذه الطرق هي:
1 – إضافة طبقات جديدة مع زيادة عدد الوحدات (units) لكل طبقة وهذا يعتمد على إمكانيات الحاسوب علماً بأن زيادة الطبقات لاتؤدي دائماً إلى زيادة كبيرة في الدقة , بل ربما تحدث عملية تشبع, وإذا كانت هناك زيادة فهي ليست بالكبيرة.
2 – زيادة حجم بيانات التدريب وهذا يعتمد على إمكانية الحصول على بيانات كبيرة وكذلك على إمكانية الحاسوب.
3 – إستخدام تقنية ال (augmentation) مع زيادة عملية التكرار (epochs), لأنه في كل تكرار سوف تضاف بيانات جديدة للبيانات الأصلية وهذا يساعدنا في زيادة الدقة ولكن لايحقق الهدف تماماً.
4 – إستخدام تقنية (transfer learning) وهذه هي أفضل الطرق لزيادة الدقة والتي بواسطتها نستطيع الحصول على دقة قد تصل إلى أكثر من (99 %).
حفظ النموذج:
Save The Model
وأخيراً نقوم بحفظ النموذج بعد أن قمنا بتدريبه وتقييمه:
زيادة الدقة بإستخدام تقنية الزيادة
(augmentation):
نقوم الآن بإنشاء نموذج شبيه بنموذجنا السابق ولكن نستخدم فيه تقنية زيادة البيانات (augmentation), والشكل التالي يبين الكود المناسب لهذا النموذج:
حيث نلاحظ إننا إخترنا عدد المرات التي تتكرر فيها البيانات هي (50) مرة. وكذلك إخترنا حجم دفعة البيانات الواحدة هي (32).
والشكل التالي يوضح البيانات التي تمرر إلى الدالة (ImageDataGenerator) لكي تقوم بعملية ال(augmentation):
إنَّ البيانات التي يمكن أن تمرر إلى الدالة (ImageDataGenerator) وكذلك القيم الإفتراضية هي:
وقد قمنا بتمرير أربعة (Arguments) هي :
1 - (rescale=1. / 255) لجعل قيم بكسلات الصور من (0.0) إلى (1.0).
2 - horizontal_flip=True لعمل تبديل للصور بين الجانب الأيمن والأيسر (مرآة).
3 - zoom_range=0.3 لعمل تغيرات في الصورة وذلك بتكبير الجانب الأعلى وتصغير الجانب
الأسفل أو بالعكس وحسب القيمة المعطاة حيث إن هذه القيمة تضاف إلى جانب وتطرح من الجانب الآخر. فبالنسبة إلى الجانب الأعلى يكون الحجم الجديد هو (1 + zoom_range), أما الجانب الأسفل فيصبح (1 - zoom_range).
4 - shear_range=0.3 قص جزء من الصورة وحسب الزاوية المعطاة ويكون بعكس إتجاه عقرب الساعة.
بعد تنفيذ الكود حصلنا على دقة مقدارها (86%), والصورتين أدناه توضحان الكود الخاص بتقييم أداء النموذج (Model Evaluation) وكذلك نتائج التقييم:
تعليقات
إرسال تعليق