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

الصفحات

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

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

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

Deep Learning For Computer Vision-Part1

                              

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

مقدمة:

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

سوف أتطرق من خلال مجموعة من المقالات المتسلسلة إن شاء ألله الى موضوع التعلم العميق (Deep Learning) وإستخداماته في موضوع الرؤية الحاسوبية (Computer Vision), ومن خلال العنوان نفهم أنَّ هناك موضوعان سوف نتناولهما بالشرح والتوضيح  وهما موضوع الرؤية الحاسوبية وموضوع التعلم العميق والذين يعتبران من المواضيع المهمة جداً في فرع الذكاء الإصطناعي (Artificial Intelligence).

إن موضوع الرؤية الحاسوبية قد بدأ أولاً بإستخدام خوارزميات تعتمد على البرمجة التقليدية ومن خلال مكتبات برمجية جاهزة, ومن أشهر هذه المكتبات مكتبة (OpenCV) مفتوحة المصدر,حيث توفر الخوارزميات المناسبة في معالجة الصور وكذلك الرؤية الحاسوبية, لكن النتائج كانت متواضعة, وبعد حدوث تطور كبير في مجال الذكاء الإصطناعي وخصوصاً في مجال التعلم العميق تم توظيف هذا التطور من خلال إبتكار خوارزميات ساهمت في رفع مستوى الرؤية الحاسوبية بشكل كبير جداّ لم يكن ممكناً الوصول إليه بإستخدام الخوارزميات القديمة التي تعتمد على البرمجة التقليدية.
سوف نتطرق في هذه المقالة الى موضوع الرؤية الحاسوبية بشيئٍ من التوضيح مع بعض الأمثلة وذلك بإستخدام لغة (Python) مع مكتبة (OpenCV), وكذلك بعض المكتبات الأخرى الخاصة بلغة بايثون, مع شرح لكيفية إضافة هذه المكتبات إلى البيئة (IDE) التي سوف نختارها للعمل عليها وتنفيذ المشاريع من خلالها,وسوف نقوم في المقالات الآتية إن شاء ألله بشرح موسع لموضوع التعلم العميق وكيفية إستخدامه في الرؤية الحاسوبية مع أمثلة متنوعة.

إن هدفي من خلال هذه المقالات هو المساهمة في توضيح وشرح هذان الموضوعان المهمان قدر المستطاع .ومن ألله نسأل العون والتوفيق.

نظرة عامة حول الرؤية الحاسوبية

تمهيد:
الرؤية الحاسوبية: هي عملية جعل النموذج الحاسوبي (Model) يقوم بمعاينة ومعالجة وتصنيف وتشخيص الأشياء الموجودة في الواقع الخارجي وهي أشبه ماتكون بعملية محاكاة بسيطة لرؤية الإنسان للمحيط الخارجي. 
إن  عملية الرؤية الحاسوبية تسبقها عملية تهيئة للصور تسمى عملية معالجة الصورة (Image Processing), حيث إن الواقع الخارجي يتم إكتسابه من خلال مجسات )كاميرات مثلاً( على هيئة صورة أو فيديو حيث إن الفيديو هو عبارة عن صور متتالية (frames), بعد ذلك تجرى على هذه الصور أو البيانات (تكون على هيئة بيانات رقمية) عمليات معالجة (processing) حيث يتم تهيئتها لتصبح بمواصفات مقبولة لإستخدامها في الرؤية الحاسوبية.
تستخدم الرؤية الحاسوبية في مجالات  مختلفة منها:-
1- الحقل الطبي حيث تستخدم الرؤية الحاسوبية في تشخيص بعض الأمراض .
2 – تحليل الصور المأخوذة للأرض بواسطة الأقمار الصناعية.
3 – الخطوط الإنتاجية في المصانع لمراقبة نوعية المنتج.
4 – في السيارات ذاتية القيادة .
5 – الروبوتات
6 – أنظمة المراقبة الأمنية حيث تستخدم في تحليل الصور والتعرف على الأشخاص. وغيرها من المجالات.

الفرق بين معالجة الصور والرؤية الحاسوبية:

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



                  شكل رقم (1) مقارنة بين معالجة الصور والرؤية الحاسوبية


أنواع المهام التي تنجز في قسم معالجة الصور (Tasks in Image Processing):

1- تغيير فضاء الألوان (Changing color spaces).
2- التحويلات الهندسية للصور (Geometric transformation of images).
3- تعتيب الصورة أي جعلها ذات لونين أبيض و أسود فقط بدون تدرج  (Image Thresholding).
4- تنعيم وتخليص الصور من بعض السلبيات (Image Smoothing).
5- إجراء التحويلات الشكلية على الصور (Morphological Transformations).
6- عمل تدرجات على الصور (Image Gradients).
7- إكتشاف الحواف في الصور (Canny Edge Detection).
8- عمل أحجام مختلفة للصور على شكل هرم (Image Pyramids).
وغير ذلك من العمليات .

أنواع المهام التي تنجز في الرؤية الحاسوبية (Tasks in Computer Vision):

1- تصنيف الأشياء أو الكائنات (Object Classification).
2- التعرف على الكائنات (Object Identification).
3- التحقق من الأشياء أو الكائنات (Object verification).
4- إكتشاف الأشياء أو الكائنات (Object Detection).
5- إكتشاف معالم الأشياء أو الكائنات (Object Landmark Detection).
6- تقطيع الصورة إلى أجزاء صغيرة لمعرفة التفاصيل الدقيقة فيها (Object Segmentation).
7- التعرف على وجه الإنسان (Face Recognition).

وغير ذلك من المهام الأخرى.


الشروع في العمل:
أولاً : تنصيب لغة بايثون, وسوف نختار في تطبيقاتنا بايثون 3 (python 3.7).
ثانياً : إضافة مكتبة (Opencv) عن طريق الأمر التالي في سطر الأوامر (cmd) :


ثالثاً : نقوم بإضافة مكتبات مهمة أخرى مثل مكتبة (numpy) عن طريق الأمر التالي :

رابعاً : نختار بيئة عمل (IDE) مناسبة ولتكن (PyCharm) أو أي بيئة أخرى متاحة خاصة بلغة بايثون.
خامساً : نقوم بربط هذه البيئة بالمسار المثبتة فيه لغة البايثون.


تطبيقات عملية بإستخدام مكتبة (OpenCV)



التطبيق الأول:

عرض صورة (Display an Image).



شرح الكود:

السطر رقم (1) لأجل إستدعاء المكتبة (openCV).

السطر رقم (3) لإستدعاء الدالة (imread) والتي تقوم بقراءة بيانات الصورة الموجودة في الملف (img_one.jpg) ووضع هذه البيانات في المتغير (img).

السطر رقم (4) لإستدعاء الدالة (imshow) والتي تقوم بإنشاء نافذة لعرض الصورة حيث نمرر لها معاملين (2 arguments)  هما إسم النافذة المراد إنشاءها (My Image) والثاني هو إسم المتغير الذي يحوي بيانات الصورة والذي هو (img).

السطر رقم (5) لأجل أن تستمر النافذة بالظهور عند تنفيذ الكود.

السطر رقم (6) لتدمير النافذة بعد إنتهاء عرض الصورة أي بمجرد أن نضغط على أي زر.

ملاحظة: يجب وضع ملف الصورة (img_one.jpg) داخل الفولدر الخاص بالمشروع. 

وعند تنفيذ البرنامج تظهر لنا الصورة كما موضح أدناه:



التطبيق الثاني:

تحويل الصورة الملونة إلى تدرج رمادي (Convert the Image to Gray scale).



شرح الكود:

السطر رقم (4) لإستدعاء الدالة (cvtColor) والتي تقوم بتحويل بيانات الصورة الموجودة في المتغير (img)

إلى بيانات تدرج رمادي (Grayscale) وتقوم بوضع هذه البيانات في متغير جديد هو (gray), وتحتاج هذه الدالة إلى معاملين (2 arguments) هم بيانات الصورة الملونة (أي المتغير img) وكذلك نوع التحويل المراد إجراؤه, حيث إستخدمنا العبارة (cv2.COLOR_BGR2GRAY).

وعند التنفيذ نحصل على الصورة التالية:



التطبيق الثالث:

إجراء عملية (Thresholding) على الصورة أي جعلها أبيض وأسود فقط.


شرح الكود:

السطر رقم (3): لإستدعاء الدالة (imread) والتي تقوم بقراءة بيانات الصورة الموجودة في الملف (img_one.jpg) ووضع هذه البيانات في المتغير (img), وقدد مررنا هنا الرقم (0) لهذه الدالة لكي تقوم أيضاً بتحويل الصورة إلى تدرج رمادي (Grayscale).

السطر رقم (5) هنا يتم إستدعاء الدالة (threshold())  حيث يجب إعطاءها أربعة معاملات : المتغير الذي يحوي إشارة الصورة (img) والتي يجب أن تكون غير ملونة (grayscale image) وكذلك العتبة (thresholding), وكذلك القيمة القصوى فوق العتبة, وأخيراً المعامل الرابع الذي هو نوع عملية التعتيب (Thresholding Style).

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



التطبيق الرابع:

الكشف عن الحواف في الصورة (Edge detection).

شرح الكود:

السطر رقم (5) لإستدعاء الدالة (Canny()) وهذه الدالة  تمثل الخوارزمية نوع (Canny) والتي تقوم بإكتشاف الحواف الموجودة في الصورة. هذه الدالة تحتاج إلى ثلاثة معاملات, حيث إنً المعامل الأول هو بيانات الصورة المراد العمل عليها, وهنا إستخدمنا المتغير (img) والذي يحمل بيانات الصورة, المعاملان الثاني والثالث يمثلان عتبتان صغرى وكبرى (minVal & maxVal) يستخدمان لأجل تحسين الأداء بالتخلص من النتائج الغير مرغوبة.

وعند التنفيذ نحصل على الصورة الآتية:



التطبيق الخامس:

تحويل الصورة إلى أخرى سالبة (Convert the image to negative).

شرح الكود:

السطر رقم (5) للقيام بعملية طرح مصفوفة من الرقم (255), وحيث أنَّ الصورة قد تحولت بياناتها إلى مصفوفة بواسطة الأمر في السطر الرابع وهذه المصفوفة تتكون من صفوف وأعمدة حسب عدد البكسلات المكونة للإرتفاع وعدد البكسلات المكونة للعرض وكل بكسل من هذه البكسلات له قيمة عددية تتراوح مابين الصفر و (255), حيث أن الصفر يمثل حالة إنطفاء تام للبكسل والرقم (255) يمثل حالة إنارة تامة للبكسل, فإذا قمنا بهذه العملية الرياضية وهي طرح قيمة كل بكسل من هذه البكسلات من الرقم (255) فتكون القيمة الجديدة لكل بكسل هي معاكسة للقيمة الأصلية (أي أن الصفر يصبح (255) والعكس بالعكس).

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



التطبيق السادس:

جعل الصورة غير واضحة المعالم (Image Blurring)

وهي عملية إزالة التفاصيل الدقيقة للصورة من أجل أغراض متعددة, فتارةً تستخدم هذه العملية للتخلص من الضوضاء المصاحبة للصورة (noise) , وتستخدم أيضاً لإخفاء بعض التفاصيل في الصورة لضرورات معينة.


شرح الكود:

السطر رقم (4) لإستدعاء الدالة (blur) والتي تقوم بإجراء عملية ال (blurring) على الصورة, حيث نمرر لها معاملين هما بيانات الصورة وكذلك حجم الفلتر (kernel) الذي يطبق على الصورة بعملية رياضية تدعى عملية الإلتفاف (Convolution). وبعد تنفيذ الكود نحصل على مايأتي:



التطبيق السابع:

إكتشاف وجه الإنسان (Face Detection).


يجب أولاً إستدعاء الملف الخاص بخوارزمية تصنيف الوجه والموجودة ضمن باقة (OpenCV) وحسب المسار التالي:

نقوم بتحميل باقة (OpenCV), وبعد فك الضغط نذهب الى الفولدر (build), ثم إلى الفولدر (etc), ثم إلى الفولدر (haarcascades), ثم نقوم بنسخ الملف (haarcascade_frontalface_default.xml) ولصقه داخل الفولدر الخاص بالمشروع.

شرح الكود:

السطر رقم (4) إستدعاء الدالة (CascadeClassifier()) التي تقوم بتحميل الملف الخاص بالخوارزمية نوع (xml) ووضع بياناته في متغير إسمه (haar_cascade_face).

السطر رقم (6) إستدعاء الدالة (detectMultiScale()) والتي تقوم بإكتشاف وجه الإنسان (أو وجوه متعددة إذا كانت الصورة تحتوي على أكثر من شخص) وتقوم بتحديد مواقع هذه الوجوه (إحداثياتها) على شكل مستطيلات, فيتم تحديد قيم (x, y)  والتي تمثل رأس المستطيل في الجهة اليسرى العلوية وكذلك تحدد عرض المستطيل (width (w)) وكذلك ارتفاع المستطيل (height (h)), يتم تخزين هذه القيم على شكل قائمة (list) في متغير إسمه (faces_rects). هذه الدالة تحتاج ثلاثة معاملات هي:

1- بيانات صورة على هيئة تدرج رمادي (grayscale).

2- معامل معالجة الفروقات في الصور من حيث بعدها وقربها من الكاميرا (scaleFactor) والقيمة

الإفتراضية له هنا هي (1.2), ومن الممكن إختيار أي قيمة أخرى مناسبة.

3- المعامل (minNeighbors) والذي يحدد عدد المستطيلات المجاورة لكل مستطيل يمثل وجه إنسان.

السطر رقم (9) بما أنً الصورة التي إستخدمناها فيها شخص واحد (وجه واحد)  فإنً القائمة (faces_rects) تحتوي على بيانات مستطيل واحد, لذلك إستخدمنا أربعة متغيرات لحفظ بيانات المستطيل وهي (x, y, w, h) والتي نحصل عليها في الدليل (index 0) من القائمة (list).

السطر رقم (10) إستدعاء الدالة (rectangle())  والتي تقوم برسم مستطيل واحد كما في تطبيقنا أو مجموعة مستطيلات حسب عدد الوجوه المكتشفة في الصورة أو في الفيديو, هذه الدالة تحتاج إلى خمسة معاملات هي:

1- الصورة الأصلية المراد رسم المستطيل (أو المستطيلات) التي تحدد الوجه (أو الوجوه) عليها.

2- إحداثيات رأس المستطيل من الجهة اليسرى من الأعلى (x, y).

3- إحداثيات رأس المستطيل من الجهة اليمنى من الأسفل (x + w, y + h).

4- اللون الذي يرسم به المستطيل وهنا إستخدمنا اللون الأخضر حيث أعطينا اللون الأخضر (G = 255).

5- المعامل الخامس يمثل سمك الخط الذي يرسم به المستطيل.

الرسم التالي يوضح كيفية رسم المستطيل:


وعند تنفيذ الكود نحصل على الصورة الآتية :



التطبيق الثامن:

إخفاء بعض تفاصيل الصورة كالوجه مثلاً (Hide some image details such as face).

في هذا التطبيق نقوم بتطبيق تقنية ال (blurring) على جزء محدد من الصورة وليكن الوجه وكما موضح الكود في الشكل التالي:

شرح الكود:

السطر رقم (12) إنتخاب جزء من الصورة الأصلية وهذا الجزء هو مساحة الوجه والذي تم إكتشافه في الخطوتين السابقتين عن هذا السطر (أي السطران (8) و (11)). حيث أنَّ (y:y+h)  تعني أن الإرتفاع المنتخب يبدأ من (y) وينتهي عند (y+h) وكذلك (x:x+w).

السطر رقم (13) بعد قمنا بإنتخاب مساحة الوجه, نقوم الآن بتطبيق عملية ال (Blurring)  على هذه المساحة فقط.

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

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





خاتمة:
في هذه المقالة إستعرضنا مفهوم الرؤية الحاسوبية بشكل إجمالي وبينًا الفرق بينه وبين مفهوم معالجة الصور وأعطينا أمثلة بسيطة لتكون منطلقاً لنا لكي نتوسع في هذا الموضوع المهم في المقالات اللاحقة إن شاء ألله حيث نتناول هذا الموضوع بشكل مفصًل من خلال موضوع التعلم العميق (Deep Learning) الموضوع الأكثر أهمية في الذكاء الإصطناعي, حيث نبدأ بدراسة مفصلة للشبكات العصبية أولاً ثم ندرس الشبكات العصبية الإلتفافية (Convolutional Neural Networks) والتي هي العنصر الأساسي في موضوع الرؤية الحاسوبية (Computer Vision). إفترضت في هذه المقالة أنً يكون الأخوة الأعزاء ملمين بلغة بايثون وكذلك عملية تثبيتها وكذلك تنصيب مكتبة (OpenCV) وكذلك العمل على برنامج (PyCharm)  وإذا كان هناك أي إستفسار فسوف نجيب عليه إن شاء ألله.
ومن ألله نسأل العون والتوفيق.


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












































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

تعليقات

4 تعليقات
إرسال تعليق
  1. ممكن تفيدونا في. شرح منهج معالجه صوره عربي

    ردحذف
    الردود
    1. سوف ننشر كورس للمعالجة الصورية قريباً أن شاء الله تعالى.

      حذف
  2. سلام عليكم، محتاج كلام ولو بشكل مختصر ربط للمواضيع التي تخص الشبكات الاصطناعية التي تقوم بتحديد الوجه بلغة بايثون، يعني علاثة الذكاء بالرؤية والشبكة المستخدمة في تحديد وجه الانسان، وماهي كيف أكتبها برمجياً بلغة بايثون باستخدام مكتبة Open CV حصراً، وجزاكم الله خيراً.

    ردحذف
    الردود
    1. وعليكم السلام أخي العزيز.إذا كان سؤالك في موضوع تحديد الوجه وليس التعرف على الوجه فيمكن تنفيذه بكل سهولة عن طريق مكتبة (opencv) لأنه توجد في هذه المكتبة خوارزمية نوع (haar) مكتوبة بلغة (xml) والكود موجود في الجزء الأول من مقالات التعلم العميق. في مجال التعلم العميق يدخل سؤالك ضمن موضوع كشف الأشياء (object detection) بإستخدام خوارزميات خاصة وإذا كنت ترغب في الدخول في مجال التعلم العميق فأنا حاضر أن أرشدك إلى بعض المصادر. مع تحياتي.

      حذف

إرسال تعليق