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

الصفحات

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


التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء السادس
نقوم في هذا الجزء بأستعراض مفهوم الشبكة العصبية الألتفافية Convolutional Neural Networks وتوضيح طريقة عملها بلأمثلة والصور
التعلم العميق وإستخداماته في الرؤية الحاسوبية - الجزء السادس

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

Deep Learning For Computer Vision-Part 6




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


بسم إلله الرحمن الرحيم

في هذا الجزء سنقوم إنشاء ألله بالتوسع في شرح الشبكات العصبية العميقة (Deep Neural Networks) وخاصة الإلتفافية منها ونقوم أيضاً بإستعراض الطبقات التي تتضمنها الشبكات العصبية الإلتفافية (Convolutional Neural Networks).

Convolutional Neural Networks:

إنَّ الشبكات العصبية الإلتفافية (CNNs) هي أحد أصناف الشبكات العصبية العميقة (Deep Neural Networks) وتستخدم غالباً في مجالات الرؤية الحاسوبية (Computer vision) وفي مجالات تحليل الصور المرئية (analyzing visual imagery).  وقد أطلق عليها هذا الإسم لأنها تستخدم طبقات إلتفافية (Convolutional layers) حيث يستخدم مبدأ الإلتفاف الرياضي (Convolution) والذي يشير إلى عملية جمع بين دالتين وينتج دالة جديدة منهما.

Convolutional Layer
إنَّ الصور عند إدخالها إلى جهاز الحاسوب يتم التعرف عليها عن طريق تحويلها إلى مصفوفة ذات ثلاثة أبعاد (الإرتفاع xالعرضxالعمق) والعمق هنا يساوي (3) حيث تخصص لكل لون من الألوان الرئيسية الثلاثة الأحمر(R) والأخضر (G) والأزرق (B) مصفوفة. الشكل رقم (1) يوضح هذه المصفوفات:

نشاهد في الشكل أعلاه ثلاث مصفوفات كل مصفوفة تمثل أحد الألوان الرئيسية الثلاثة وتحتوي كل مصفوفة على مجموعة من العناصر تحمل قيم معينة كل عنصر يمثل نقطة (pixel) حيث إنَّ قيمته تمثل مقدار الإضاءة لهذا اللون والتي تظهر عند عرض الصورة على الشاشة.
لو فرضنا أنَّ لدينا مجموعة بيانات عبارة عن صور (images), وهذه الصور تمثل أرقام مكتوبة بخط اليد (Hand Written digits) تحتوي كل صورة على أحد الأرقام, وأبعاد كل صورة هي (الإرتفاع = 28 نقطة, العرض = 28 نقطة والعمق هو 3), ونريد إنشاء نموذج من الشبكات العصبية الإعتيادية (ANNs) للقيام بعملية تصنيف (Classification) لهذه الأرقام.
مثلما عرفنا في المقالات السابقة فإنَّ البيانات الداخلة الى نموذج الشبكة العصبية يجب أن تكون على شكل متجه (Vector) لأجل أن يكون كل سطر بيانات (iteration) هوعبارة عن متجه (وهنا هو عبارة عن بيانات صورة واحدة data point), لذلك يجب تحويل كل صورة بمصفوفاتها الثلاثة إلى متجه (Vector) واحد. يكون عدد عناصر المتجه عبارة عن حاصل ضرب الأبعاد الثلاثة للصورة أي:
الإرتفاع x العرض x العمق = 28 x 28 x 3 = 2352 عنصر
فإذا أضفنا طبقة من النيورونات لهذا النموذج فيجب أن تحتوي كحد أدنى على نيورونات مساوياً لعدد عناصر المتجه الذي يحوي مكونات الصورة الداخلة (أي 2352 نيورون) وبالتالي يجب أن يرتبط كل واحد من هذه النيورونات بجميع عناصر المتجه عن طريق أوزان (weights) ويمكن حساب عدد هذه الأوزان كما يلي:
عدد الأوزان = عدد عناصر المتجه x عدد النيورونات في الطبقة
           أي = 2352 x 2352 = 5,531,904 
من خلال هذا العدد الكبير من الأوزان والذي هو خاص بطبقة واحدة وبالحد الأدنى والصورة صغيرة جداً (28 x 28) فكيف بالصور ذات الأبعاد الكبيرة (280 x 280 ) مثلاً وبعدة طبقات فقد يصل الرقم الى عشرات بل مئات المليارات من الأوزان الواجب تدريبها, وهذا من الأعمال بالغة الصعوبة في عمليات التدريب وقد يستغرق أسابيع أو أكثر, لذلك وبعد جهود كبيرة بذلها الباحثون في هذا المجال توصلوا إلى طريقة فذة ورائعة تؤدي الى التقليل من عدد الأوزان في كل طبقة حيث يتم إشتراك كل مجموعة كبيرة من النيورونات بأوزان قليلة جداً عن طريق إستخدام مبدأ الإلتفاف (Convolution).  سميت كل طبقة تستخدم هذا المبدأ بالطبقة الإلتفافية (Convolutional Layer) والشبكات التي تستعمل مثل هذه الطبقات تسمى الشبكات العصبية الإلتفافية (Convolutional Neural Networks).
ويمكن توضيح أساس عمل هذه الشبكات بالخطوات التالية:
1 - يتم إدخال بيانات الصورة كما هي أي مصفوفة ذات ثلاثة أبعاد (وفي بعض الأحيان تكون الصورة على شكل تدرج رمادي ذات بعدين فقط) أي بدون تحويلها ألى متجه (Vector).
2 - يتم إنشاء مصفوفات صغيرة الحجم تسمى مرشحات (filters) لها نفس أبعاد الصورة الداخلة. تكون
      عناصر كل مصفوفة هي عبارة عن أوزان (weights) يجب تدريبها.
تستخدم هذه المرشحات للكشف عن وجود مميزات أو خصائص محددة موجودة في الصورة الأصلية (بيانات الإدخال).
3 – يمرر المرشح (filter) الأول على الصورة بخطوات أفقية وعمودية حتى يتم مسح كامل نقاط الصورة.
     بعد كل حركة تجرى عملية ضرب مصفوفات نوع (dot product) لمصفوفة الفلتر مع الجزء الذي يقابله من مصفوفة الصورة لحساب قيمة نقطة واحدة من مصفوفة الخصائص الأولى المقترنة مع المرشح الأول.
نكرر عملية حساب النقاط المتبقية من مصفوفة الخصائص (feature map) بعد كل حركة لمصفوفة الفلتر filter الى أن يتم مسح الصورة بأكملها وبذلك يتم حساب قيم مصفوفة الخصائص الأولى. بعدها يأتي الدور للمرشح الثاني ومصفوفة الخصائص الثانية المقترنة معه وهكذا بقية المرشحات ومصفوفات الخصائص المقترنة مع كل مرشح.
4 – تعطى قيم إفتراضية لعناصر المرشحات والتي كما قلنا تمثل الأوزان, وهذه القيم يجب أن تكون مختلفة من مرشح إلى آخر لكي يمكن الحصول على مميزات وخصائص مختلفة في كل مصفوفة من مصفوفات الخصائص (feature maps).
5 – تمثل مصفوفات الخصائص (feature maps) بمجموعها بيانات إدخال الى الطبقة اللاحقة ويكون عددها يمثل العمق لهذه البيانات.
الشكل التالي يوضح مابيناه حول الطبقة الإلتفافية (Convolutional Layer):


يتم حساب حجم مصفوفة الخصائص (Feature map) حسب القانون التالي: 

وبتطبيق هذا القانون على العناصر في الشكل (2) حيث إنَّ ارتفاع الصورة المدخلة هو (10) وعرضها أيضاً (10), وإرتفاع الفلتر هو (3) وعرضه أيضاً (3), ونفترض أن حجم الخطوة التي يتحرك فيها الفلتر عرضاً وإرتفاعاً هو (1), فينتج أن حجم مصفوفة الخصائص (Feature map) يكون (8 x 8), أي أن عدد النيورونات المكونة لهذه المصفوفة هي (8 x 8 = 64) نيورون ولكن بإستخدام (9) أوزان (weights) فقط  حيث إشتركت هذه النيورونات جميعها بهذه الأوزان التسعة والتي هي حجم الفلتر (إستخدمنا هنا فلتر ثنائي الأبعاد لأن الصورة المدخلة كذلك ثنائية الأبعاد).

مقارنة عدد الأوزان في طبقة واحدة (hidden layer) بين شبكة عصبية تقليدية (ANN) وشبكة عصبية عميقة نوع (CNN):
قلنا في المثال الأول إنه إذا أردنا إنشاء نموذج من الشبكات العصبية الإصطناعية يقوم بعملية التصنيف (Classification) لمجموعة من الصور التي تمثل أرقاماً مكتوبةً بخط اليد (Hand written digits), وهذه الصور  ذات أبعاد (28 x 28 x 3), فإننا نلجأ أولاً إلى تحويل كل صورة إلى متجه (Vector) تكون عدد عناصره مساوية إلى عدد البكسلات في الصورة أي:
عدد عناصر المتجه = عدد بكسلات عرض الصورة x عدد بكسلات ارتفاع الصورة x 3
                       = 28 x 28 x 3 = 2352 عنصر
فإذا أردنا إنشاء طبقة مخفية أولى (first hidden layer) فيجب أن تكون عدد النيورونات (neurons) فيها مساوياً أو أكبر من عدد عناصر الإدخال, ولنفترض إنها مساوية له أي (2352 neurons), وكذلك يجب ربط كل نيورون بجميع عناصر الإدخال عن طريق أوزان (weights) وبعملية حسابية بسيطة نستطيع حساب عدد هذه الأوزان الواجب تدريبها وكما يلي:
عدد الأوزان في هذه الطبقة فقط = عدد عناصر الإدخال x عدد النيورونات في هذه الطبقة
                                    = 2352 x 2352 = 5,531,904  وزن
وكما نرى فإن عدد الأوزان في هذه الطبقة فقط هو أكثر من خمسة ملايين مضافاً لها قيم إنحياز (biases) بعدد النيورونات, وبذلك يصبح عدد العناصر الواجب تدريبها في هذه الطبقة فقط:
العناصر الواجب تدريبها = عدد الأوزان + عدد عناصر الإنحياز
                               = 5531904 + 2352 = 5,534,256 عنصر
هذا في حالة كون الصورة صغيرة (28 x 28), أما في حالة الصور الأكبر حجماً (280 x 280) مثلاً فإن الرقم سوف يزداد بشكل كبير جداً جداً ويمكن حسابه كما يلي:
عدد عناصر المتجه = 280 x 280 x 3 = 235200 عنصر
عدد الأوزان = 235200 x 235200 = 55,319,040,000  وزن
العناصر الواجب تدريبها = 55319040000 + 235200 = 55319275200 عنصر
وهذا العدد من العناصر الواجب تدريبها والتي هي في طبقة واحدة فقط, فإذا أضيف لها العناصر في الطبقات الأخرى يصبح العدد كبير جداً بحيث تتعذر علينا عملية التدريب, والشكل التالي يوضح المقصد:

      وهذا مادفع الباحثين إلى التفكير بطريقة أخرى لحل هذه المعظلة وقد توصلوا الى إستخدام طريقة الإلتفاف (Convolution) في عملية إنشاء الطبقات حيث سميت هذه الطبقات بالإلتفافية (Convolutional layers).
سوف نقوم الآن بحساب العناصر الواجب تدريبها من أوزان (weights) و قيم إنحياز (biases) بإستخدام شبكة (Convolutional Neural Network  CNN) وكما يلي:
1 – حجم الصورة هو (28 x 28 x 3).
2 – نقوم بإختيار حجم الفلتر وليكن (5 x 5 x 3).
3 – حجم الخطوة (stride) في الإتجاهين هو (1).
4 – نقوم بحساب حجم مصفوفة الخصائص الواحدة (feature map) كما يلي:
إرتفاع مصفوفة الخصائص = ((28 - 5) / 1) + 1 = 24
عرض مصفوفة الخصائص = ((28 - 5) / 1) + 1 = 24
وبذلك أنشأنا مصفوفة خصائص (feature map) بحجم (24 x 24), ومن الطبيعي أننا نحتاج إلى مجموعة من هذه المصفوفات وليكن عددها (10) مصفوفات حيث تشكل العمق للطبقة المراد إنشاءها (conv_layer_1), والتي بدورها سوف تكون بمثابة الصورة المدخلة الى الطبقة اللاحقة.وبذلك يكون حجم هذه الطبقة هو
(24 x 24 x 10).
5 – نقوم بحساب الأوزان (weights) لهذه الطبقة وكما يلي:
     كل مصفوفة خصائص واحدة تشترك بعدد من الأوزان مساوياً لحجم الفلتر الواحد أي:
عدد الأوزان المشتركة لكل مصفوفة خصائص = 5 x 5 x 3 = 75 وزن
عدد الأوزان الكلي للطبقة = عدد الأوزان لكل (feature map) x عدد ال (sfeature map)
                             = 75 x 10 = 750 من الأوزان (weights)
عدد العناصر الواجب تدريبها = عدد الأوزان (weights) + عدد قيم الإنحياز (biases)
                                  = 750 + 10 (عدد مصفوفات الخصائص) = 760 عنصر فقط.
وكما نلاحظ من الحالتين الفرق الشاسع بين النوعين من الطبقات حيث تسمى الطبقة في الحالة الأولى (أي عندما إستخدمنا شبكة عصبية تقليدية) تسمى (full connection layer), أما في الحالة الثانية فتسمى (convolutional layer). وكلما قل حجم الفلتر المستخدم يقل عدد الأوزان.

تقنية الإضافة (الحشوة)

 Padding

هذه التقنية تستخدم لعلاج حالتين تظهران بعض الأحيان في شبكات ال(CNN), وهاتين الحالتين هما:
1 – إضمحلال حجم الصورة تدريجياً عبر الطبقات المتعددة في الشبكة.
2 – البكسلات التي في الأطراف لايدخلان في الحسابات إلا مرات قليلة قياساً مع مثيلاتهما في المواقع الأخرى, وهذا يقلل من كفاءة النموذج.
لذلك وكعلاج للحالتين يتم إضافة إطار من البكسلات والتي تحمل قيمة (0) ويكون عرض هذا الإطار معتمداً على حجم الفلتر المستخدم إذا أردنا جعل عرض وإرتفاع مصفوفات الخصائص مساوياً إلى عرض وإرتفاع الصورة المدخلة, وكما موضح في الشكل التالي:

طبقات التجميع

(Pooling Layers)

كما تطرقنا سلفاً فإن في الطبقة الإلتفافية (Convolutional layer) يتم إستخلاص الخصائص الموجودة في الصورة المدخلة إلى النموذج وإيداعها في مصفوفات الخصائص (feature maps). تكمن مشكلة هنا وهي أنَّ مصفوفات الخصائص هذه تكون حساسة لمواقع الخصائص في الصورة المدخلة (input image). أحد الأساليب المتبعة للتقليل من هذه الحساسية هو تصغير حجم مصفوفة الخصائص, وهذا الأسلوب يجعل مصفوفات الخصائص مستقرة وقوية في مواجهة التغيرات في مواقع الخصائص في الصورة المدخلة.
ولتنفيذ أسلوب المعالجة هذا يتم إستخدام تقنية التجميع (pooling) والتي هي عملية إختزال لمجموعة من البكسلات المتجاورة في بكسل واحد.
هناك طريقتان لتنفيذ ال(pooling) وهما :
1 - max pooling.
2 - average pooling.
يتم إستخدام قناع (mask) بحجم (2 x 2) وتمريره على مصفوفة (feature map) وبخطوة (stride)  مقدارها (2). ففي حالة الطريقة الأولى (max pooling) يتم أخذ أعلى قيمة من القيم الأربعة الواقعة تحت القناع بعد كل موضع يكون فيه.
أما في الحالة الثانية (average pooling) فيتم أخذ المعدل لتلك القيم. والشكل التالي يوضح المقصد:



تطبق هذه التقنية على جميع مصفوفات الخصائص (feature maps) والنتائج التي تخرج منها تشكل طبقة جديدة تسمى (pooling layer).

الطبقات المسطحة

(Flatten Layers)

بعد إنتهاء سلسلة الطبقات الإلتفافية (convolutional layers) وقبل إنشاء الطبقة الأخيرة (full connection layer), يصار إلى تحويل كافة مصفوفات الخصائص  (feature maps) إلى متجه (vector) واحد لأجل ربطه بالطبقة الأخيرة (output layer) والتي هي من نوع (full connection) كما أسلفنا, أي أن هذه الطبقة بمثابة حلقة وصل بين النوعين من الطبقات.

الطبقات ذات الإتصال الكامل

(Full Connection Layers)

هي الطبقة التي تكون خالية من مصفوفات الخصائص (Featurer Maps) حيث إنها تتكون فقط من نيورونات وأوزان مرتبطة بها كما هي في الشبكات العصبية من نوع (ANN), وتستخدم غالباً في الطبقات الأخيرة في شبكات (CNN).

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




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


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

تعليقات