مقدمة في الرؤية الحاسوبية (Computer Vision, CV)
الرؤية الحاسوبية مجال هدفه يخلي الحاسب يفهم الصور الرقمية بمستوى متقدم. وهالتعريف واسع؛ لأن فهم الصورة ممكن يعني أشياء كثيرة، مثل تحديد جسم داخلها (اكتشاف الأجسام، Object Detection)، أو معرفة وش قاعد يصير (اكتشاف الأحداث، Event Detection)، أو وصف الصورة بنص، أو إعادة بناء المشهد بأبعاد ثلاثية. وفيه بعد مهام متخصصة بصور البشر، مثل تقدير العمر والمشاعر، واكتشاف الوجه والتعرّف عليه، وتقدير وضعية الجسم ثلاثية الأبعاد.
من أبسط مهام الرؤية الحاسوبية تصنيف الصور (Image Classification)، وهو أحد أشكال التصنيف (Classification).
عادةً نعدّ الرؤية الحاسوبية فرعًا من الذكاء الاصطناعي. تعتمد مهام التعرّف الحديثة كثيرًا على الشبكات العصبية، بينما تظل الخوارزميات التقليدية مفيدة في القياس والهندسة والمعالجة المسبقة والحلول محدودة الموارد. وخلال هالقسم بنتعرّف على الشبكات العصبية الالتفافية (Convolutional Neural Networks, CNNs).
لكن قبل ما نمرر الصورة للشبكة العصبية، يفيدنا في حالات كثيرة نستخدم تقنيات خوارزمية تحسّن الصورة وتجهّزها.
في Python فيه عدة مكتبات لمعالجة الصور:
- imageio نقدر نستخدمها لقراءة صيغ صور مختلفة وكتابتها. وتدعم بعد ffmpeg، وهي أداة مفيدة لتحويل إطارات الفيديو إلى صور.
- Pillow، المعروفة بعد باسم PIL، فيها إمكانات أوسع، وتدعم عمليات مثل تغيير شكل الصورة وضبط لوحة الألوان وغيرها.
- OpenCV مكتبة قوية لمعالجة الصور مكتوبة بلغة C++، وصارت المعيار الفعلي في المجال. ولها واجهة مريحة في Python.
- dlib مكتبة C++ تطبّق خوارزميات كثيرة من تعلم الآلة، ومنها خوارزميات للرؤية الحاسوبية. ولها واجهة Python، ونقدر نستخدمها في مهام متقدمة مثل اكتشاف الوجه ومعالمه.
OpenCV
تُعد OpenCV المعيار الفعلي لمعالجة الصور. فيها خوارزميات مفيدة كثيرة مطبّقة بلغة C++، ونقدر نستدعيها من Python بعد.
إذا ودكم تتعمقون في OpenCV، هذي دورة Learn OpenCV نقطة بداية زينة. هدفنا في هالمنهج مب نتعلّم OpenCV كاملة؛ بنشوف أمثلة توضّح متى تفيدنا وكيف نستخدمها.
تحميل الصور
نقدر نمثّل الصور في Python بسهولة بمصفوفات NumPy. مثلًا، صورة رمادية مقاسها 320x200 بكسل تُخزّن في مصفوفة أبعادها 200x320، والصورة الملونة بالمقاس نفسه يكون شكلها 200x320x3، لأن عندنا 3 قنوات لونية. لتحميل صورة في OpenCV، نستخدم الكود التالي:
import cv2
import matplotlib.pyplot as plt
im = cv2.imread('image.jpeg')
plt.imshow(im)
تستخدم OpenCV تقليديًا ترتيب BGR (أزرق-أخضر-أحمر) للصور الملونة، بينما تستخدم أغلب أدوات Python ترتيب RGB (أحمر-أخضر-أزرق). عشان تطلع الصورة بألوانها الصحيحة، نحوّلها إلى فضاء RGB؛ إما بتبديل الأبعاد في مصفوفة NumPy، أو باستدعاء دالة من OpenCV:
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
نقدر نستخدم دالة cvtColor نفسها لتحويلات ثانية بين فضاءات الألوان، مثل تحويل الصورة إلى تدرّج رمادي أو إلى فضاء HSV (Hue-Saturation-Value).
وتقدرون تستخدمون OpenCV لتحميل الفيديو إطارًا بعد إطار. بتلقون مثالًا في تمرين دفتر OpenCV.
معالجة الصور
قبل ما نعطي الصورة للشبكة العصبية، قد نحتاج نطبق عليها خطوات معالجة مسبقة. تقدر OpenCV تسوي أشياء كثيرة، منها:
- تغيير مقاس الصورة باستخدام
im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS).
- تمويه الصورة باستخدام
im = cv2.medianBlur(im,3) أو im = cv2.GaussianBlur(im, (3,3), 0).
- تغيير سطوع الصورة وتباينها عن طريق عمليات على مصفوفات NumPy، مثل ما هو موضح في هالملاحظة على Stack Overflow.
- استخدام تحديد العتبة باستدعاء الدالتين
cv2.threshold وcv2.adaptiveThreshold، وغالبًا يكون أنسب من تعديل السطوع أو التباين.
- تطبيق تحويلات هندسية مختلفة على الصورة:
- تفيد التحويلات الأفينية إذا بغينا نجمع بين تدوير الصورة وتغيير مقاسها وإمالتها، وكنا نعرف مواقع ثلاث نقاط في الصورة الأصلية والصورة الناتجة. هالتحويلات تبقي الخطوط المتوازية متوازية.
أمثلة على استخدام الرؤية الحاسوبية
في دفتر OpenCV بنشوف أمثلة على استخدام الرؤية الحاسوبية لتنفيذ مهام محددة:
- المعالجة المسبقة لصورة من كتاب بطريقة برايل. بنركّز على استخدام تحديد العتبة، واكتشاف السمات، وتحويل المنظور، وعمليات NumPy لفصل رموز برايل عن بعض، عشان نصنّفها لاحقًا بشبكة عصبية.
وصف الشكل: صورة برايل | > وصف الشكل: صورة برايل بعد المعالجة | > وصف الشكل: رموز برايل
----|-----|-----
الصورة من OpenCV.ipynb
- اكتشاف الحركة في الفيديو بالفرق بين الإطارات. إذا كانت الكاميرا ثابتة، المفروض تكون الإطارات متشابهة جدًا. ولأن الإطارات ممثّلة بمصفوفات، نطرح مصفوفتَي إطارين متتاليين فنحصل على فرق البكسلات. يكون الفرق قليلًا في الإطارات الساكنة، ويزيد إذا صارت حركة واضحة في الصورة.
وصف الشكل: إطارات فيديو والفروق بينها
الصورة من OpenCV.ipynb
وصف الشكل: صورة للتدفق البصري
الصورة من OpenCV.ipynb
خلونا نجرّب OpenCV بأنفسنا في دفتر OpenCV.
الخلاصة
أحيانًا نقدر نحل مهام معقدة نسبيًا، مثل اكتشاف الحركة أو أطراف الأصابع، بأساليب الرؤية الحاسوبية وحدها. عشان كذا يفيدنا نعرف تقنياتها الأساسية، ووش تقدر تسوي مكتبات مثل OpenCV.
🚀 التحدي
شوفوا هالفيديو من AI Show، وتعرّفوا على مشروع Cortic Tigers وكيف بنوا حلًا قائمًا على الكتل يسهّل مهام الرؤية الحاسوبية باستخدام روبوت. بعدها ابحثوا عن مشاريع مشابهة تساعد المبتدئين يدخلون هالمجال.
المراجعة والتعلّم الذاتي
اقرؤوا أكثر عن التدفق البصري في هالشرح الممتاز.
في هالمختبر، بتصوّرون فيديو فيه إيماءات بسيطة، والهدف إنكم تستخرجون حركات فوق/تحت/يمين/يسار باستخدام التدفق البصري.
وصف الشكل: إطار يوضح حركة الكف