في هذه المقال، سنلقي نظرة على طريقة بسيطة لفهم تقنية التعرف على الوجوه باستخدام ال Python ومكتبة OpenCV مفتوحة المصدر.
مكتبة OpenCV
تعتبر مكتبة OpenCV الأكثر شعبية في مجال الرؤية الحاسوبية. تم تصميم و كتابة هذه المكتبة في الأصل بلغة C و C ++ ، وهي الآن متوفرة على Python.
تستخدم مكتبة OpenCV خوارزميات التعلم الآلي للبحث عن الوجوه داخل الصورة. نظرًا لأن الوجوه معقدة للغاية ، لا يوجد اختبار بسيط واحد يخبرك إذا كان قد وجد وجهًا أم لا. بدلاً من ذلك ، هناك الآلاف من الأنماط والميزات الصغيرة التي يجب مطابقتها. تقسم الخوارزميات مهمة تحديد الوجه إلى الآلاف من المهام الأصغر حجمًا ، والتي يسهل حل كل منها. تسمى هذه المهام أيضًا المصنفات Classifiers.
بالنسبة لشيء مثل الوجه، قد يكون لديك 6000 مصنف أو أكثر ، وكلها يجب أن تتطابق حتى يتم اكتشاف الوجه (ضمن حدود الخطأ المقبولة بالطبع). ولكن هنا تكمن المشكلة: بالنسبة لاكتشاف الوجه ، تبدأ الخوارزمية في أعلى يسار الصورة وتتحرك لأسفل عبر كتل صغيرة من البيانات ، وتنظر إلى كل كتلة ، وتتساءل باستمرار ، “هل هذا وجه؟ … هل هذا وجه؟ … هل هذا وجه؟ ” نظرًا لوجود 6000 اختبار أو أكثر لكل كتلة ، فقد يكون لديك الملايين من العمليات الحسابية التي يتعين عليك إجراؤها ، مما سيؤدي إلى توقف جهاز الكمبيوتر الخاص بك اذا كانت مواصفاته ضعيفة. و بالتالي للتغلب على هذه المشكلة ، تستخدم مكتبة OpenCV السلاسل Cascades.
مثل سلسلة من الشلالات ، تقسم سلسلة OpenCV مسألة اكتشاف الوجوه إلى مراحل متعددة. لكل كتلة ، يتم إجراء اختبار تقريبي وسريع للغاية. إذا نجح ذلك ، فسيتم إجراء اختبار أكثر تفصيلاً ، وما إلى ذلك. قد تحتوي الخوارزمية على 30 إلى 50 من هذه المراحل أو السلاسل ، ولن تكتشف وجهًا إلا إذا مرت على جميع المراحل.
الميزة هي أن العملية قد تعطي نتائج سلبية خلال المراحل القليلة الأولى ، مما يعني أن الخوارزمية لن تضيع الوقت في اختبار كل الميزات ال 6000 الموجودة عليها. بدلاً من قضاء ساعات كما في السابق ، يمكن الآن اكتشاف الوجه في الوقت الفعلي Real-time.
السلاسل Cascades
على الرغم من أن النظرية قد تبدو معقدة ، إلا أنها في الواقع سهلة للغاية. السلاسل نفسها هي مجرد مجموعة من ملفات XML التي تحتوي على بيانات مكتبة OpenCV المستخدمة لاكتشاف الكائنات. تقوم بتهيئة الكود الخاص بك الذي تريده ، ثم يقوم بالعمل نيابة عنك.
نظرًا لأن اكتشاف الوجه هو حالة شائعة ، فإن مكتبة OpenCV تأتي مع عدد من السلاسل المدمجة لاكتشاف كل شيء من الوجوه إلى العيون إلى اليدين إلى الساقين. حتى أن هناك سلاسل للأشياء غير البشرية. على سبيل المثال ، إذا كنت تدير متجر موز وترغب في تتبع الأشخاص الذين يسرقون الموز ، فقد صممت سلاسل لذلك!
تثبيت مكتبة OpenCV
أولاً ، تحتاج إلى العثور على ملف الإعداد الصحيح لنظام التشغيل الخاص بك. يعتبر تثبيت مكتبة ال OpenCV شوي صعب. إذا واجهت أخطاء غريبة غير قابلة للتفسير ، فقد يكون ذلك بسبب تضارب في المكتبة ، و اختلاف نظام التشغيل الخاص ب 32 بت او 64 بت ، وما إلى ذلك. في المثال التالي سنتخدم Google Colab لتشغيل الكود.
بمجرد الانتهاء من التثبيت ، يمكنك اختبار ما إذا كان يعمل أم لا عن بدء جلسة Python وكتابة:
import cv2 import numpy as np
إذا لم تواجه أي أخطاء ، يمكنك الانتقال إلى الجزء التالي.
ثانيا، لنفك رموز الكود ، الذي يمكنك تنزيله من هنا. حمل الملفات التالية:
# Load the pre-trained model face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # Load the test image img = cv2.imread('test_image.jpg')
ملف haarcascade_frontalface_default.xml عبارة عن نموذج مدرب مسبقا على الوجوه. أما في ما يتعلق test_image.jpg فهي الصورة المراد اختبار الكود عليها باستطاعتك تحميل أي صورة تحتوي على وجوه.
ثالثا، نمرر الصور على كود لتحويلها الى ذات لوان متدرج رمادي.أي أن الصورة الناتجة ستحتوي فقط على تدرجات اللون الرمادي (أسود ، أبيض ، ومستويات مختلفة من الرمادي بينهما) ، بدلاً من الألوان الكاملة. في الصورة ذات التدرج الرمادي ، تمثل كل قيمة بكسل شدة الضوء عند تلك النقطة في الصورة. أما في الصورة الملونة ، يحتوي كل بكسل عادةً على ثلاث قيم تمثل شدة الضوء الأحمر والأخضر والأزرق (RGB) في تلك النقطة.
غالبًا ما يكون تحويل صورة إلى صورة ذات تدرج رمادي مفيدًا لتقليل كمية البيانات التي تحتاج إلى المعالجة ، ولتبسيط أنواع معينة من مهام تحليل الصور حيث لا يكون اللون مناسبًا. يمكن أن تكون أيضًا خطوة معالجة مسبقة مفيدة لبعض مهام الرؤية الحاسوبية ، مثل التعرف على الوجوه ، حيث يمكن أن تساعد هذه الطريقة على إزالة أنواع معينة من الضوضاء وتسهيل اكتشاف الميزات المهمة في الصورة.
# Convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
رابعا، نقوم بتمرير الصورة بعد تحويلها الى صورة ذات تدرج رمادي على النموذج المدرب مسبقا.
# Detect faces in the image faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
ملاحظة
- تعد عملية DiscoverMultiScale عملية عامة تكتشف الكائنات. نظرًا لأننا نطلق عليها اسم سلسلة الوجه ، فهذا ما تكتشفه.
- الخيار الأول هو الصورة ذات التدرج الرمادي gray.
- الخيار الثاني هو scaleFactor. نظرًا لأن بعض الوجوه قد تكون أقرب إلى الكاميرا ، فإنها ستظهر أكبر من الوجوه الموجودة في الخلف. عامل المقياس يعوض عن هذا.
- تستخدم خوارزمية الكشف عن الوجوه نافذة متحركة لاكتشاف الأشياء. تحدد minNeighbours عدد الأشياء التي تم اكتشافها بالقرب من الكائن الحالي قبل أن تعلن عن الوجه الذي تم العثور عليه. في غضون ذلك ، يعطي minSize حجم كل نافذة.
تعرض الدالة قائمة بالمستطيلات التي تعتقد أنها وجدت وجهًا لها. بعد ذلك ، سوف ننتقل إلى المكان الذي يعتقد أنه وجد فيه شيئًا ما.
# Draw a rectangle around the faces for x, y, w, h in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
التحقق من النتائج
تحتوي هذه الدالة على 4 قيم نستخدم هذه القيم لرسم مستطيل باستخدام دالة () rectangle المضمنة.
from google.colab.patches import cv2_imshow cv2_imshow(img) cv2.waitKey(0) cv2.destroyAllWindows()
دعونا نختبر صور اخرى: