تقنية التعرف على الوجوه باستخدام Python مع مثال عملي

“يعد وجهك، في الواقع، بمثابة جهاز العرض الخاص بك، وينبغي على حاسوبك الخاص قراءته، الأمر الذي يستوجب الاعتراف بوجهك وتعابيره الفريدة”. ويعتبر التحدي التقني المتعلق بالتعرف على الوجه وتعبيراته صعباً. ومع ذلك، تعد عملية تنفيذه قابلة للتحقيق بدرجة كبيرة في بعض السياقات [1]”

في هذه المقالة [مترجم] ، سنلقي نظرة على طريقة بسيطة لفهم تقنية التعرف على الوجوه باستخدام ال Python ومكتبة OpenCV مفتوحة المصدر.

OpenCV

تعتبر مكتبة OpenCV الأكثر شعبية في الرؤية الحاسوبية Computer vision. تمت تصميم و كتابته هذه المكتبة في الأصل بلغة C / C ++ ، وهي الآن توفر روابط لـ Python.

تستخدم OpenCV خوارزميات التعلم الآلي للبحث عن الوجوه داخل الصورة. نظرًا لأن الوجوه معقدة للغاية ، لا يوجد اختبار بسيط واحد يخبرك إذا كان قد وجد وجهًا أم لا. بدلاً من ذلك ، هناك الآلاف من الأنماط والميزات الصغيرة التي يجب مطابقتها. تقسم الخوارزميات مهمة تحديد الوجه إلى آلاف المهام الأصغر حجمًا ، والتي يسهل حل كل منها. تسمى هذه المهام أيضًا المصنفات Classifiers.

بالنسبة لشيء مثل الوجه، قد يكون لديك 6000 مصنف أو أكثر ، وكلها يجب أن تتطابق حتى يتم اكتشاف الوجه (ضمن حدود الخطأ المقبول، بالطبع). ولكن هنا تكمن المشكلة: بالنسبة لاكتشاف الوجه ، تبدأ الخوارزمية في أعلى يسار الصورة وتتحرك لأسفل عبر كتل صغيرة من البيانات ، وتنظر إلى كل كتلة ، وتتساءل باستمرار ، “هل هذا وجه؟ … هل هذا وجه؟ … هل هذا وجه؟ ” نظرًا لوجود 6000 اختبار أو أكثر لكل كتلة ، فقد يكون لديك الملايين من العمليات الحسابية التي يتعين عليك إجراؤها ، مما سيؤدي إلى توقف جهاز الكمبيوتر الخاص بك اذا كانت مواصفاته ضعيفة.

للتغلب على هذا ، تستخدم مكتبة OpenCV السلاسل Cascades.

مثل سلسلة من الشلالات ، تقسم سلسلة OpenCV مسألة اكتشاف الوجوه إلى مراحل متعددة. لكل كتلة ، يتم إجراء اختبار تقريبي وسريع للغاية. إذا نجح ذلك ، فسيتم إجراء اختبار أكثر تفصيلاً ، وما إلى ذلك. قد تحتوي الخوارزمية على 30 إلى 50 من هذه المراحل أو السلاسل ، ولن تكتشف وجهًا إلا إذا مرت جميع المراحل.

الميزة هي أن غالبية الصورة ستعيد سلبيًا خلال المراحل القليلة الأولى ، مما يعني أن الخوارزمية لن تضيع الوقت في اختبار كل الميزات ال 6000 الموجودة عليها. بدلاً من قضاء ساعات كما في السابق ، يمكن الآن اكتشاف الوجه في الوقت الفعلي Real-time.

السلاسل Cascades في التطبيق

على الرغم من أن النظرية قد تبدو معقدة ، إلا أنها في الواقع سهلة للغاية. السلاسل نفسها هي مجرد مجموعة من ملفات XML التي تحتوي على بيانات OpenCV المستخدمة لاكتشاف الكائنات. تقوم بتهيئة الكود الخاص بك بالتالي الذي تريده ، ثم يقوم بالعمل نيابة عنك.

نظرًا لأن اكتشاف الوجه هو حالة شائعة ، فإن OpenCV يأتي مع عدد من التسلسلات المدمجة لاكتشاف كل شيء من الوجوه إلى العيون إلى اليدين إلى الساقين. حتى أن هناك سلاسل للأشياء غير البشرية. على سبيل المثال ، إذا كنت تدير متجر موز وترغب في تتبع الأشخاص الذين يسرقون الموز ، فقد صمم هذا الرجل واحداً لذلك!

تثبيت OpenCV

أولاً ، تحتاج إلى العثور على ملف الإعداد الصحيح لنظام التشغيل الخاص بك.

يعتبر تثبيت مكتبة ال OpenCV أصعب جزء في المهمة. إذا واجهت أخطاء غريبة غير قابلة للتفسير ، فقد يكون ذلك بسبب تضارب في المكتبة ، واختلافات نظام التشغيل الخاص ب 32/64 بت ، وما إلى ذلك. لقد وجدت أنه من الأسهل استخدام  نظام Linux إفتراضي وتثبيت OpenCV من البداية.

بمجرد الانتهاء من التثبيت ، يمكنك اختبار ما إذا كان يعمل أم لا عن بدء جلسة Python وكتابة:

import cv2
import sys

 

إذا لم تواجه أي أخطاء ، يمكنك الانتقال إلى الجزء التالي.

فهم الكود
لنفك رموز الكود الفعلي ، والذي يمكنك تنزيله من هنا. حمل الملفات التالية

face_detect.py script, the abba.png pic, the haarcascade_frontalface_default.xml.

# احصل على القيم التي يوفرها المستخدم
>>> imagePath = sys.argv[1]
>>> cascPath = sys.argv[2]

نقوم أولاً بتمرير الصورة وتسلسل الأسماء كوسائط سطر أوامر. سنستخدم صورة ABBA بالإضافة إلى التسلسل الافتراضي لاكتشاف الوجوه التي يوفرها OpenCV.

# haar إنشاء سلسلة
faceCascade = cv2.CascadeClassifier(cascPath)

الآن قمنا بإنشاء متسلسلة وتهيئتها باستخدام سلسلة الوجوه الخاصة بنا. يؤدي هذا إلى تحميل سلسة الوجوه في الذاكرة بحيث يكون جاهزًا للاستخدام. تذكر أن التسلسل هو مجرد ملف XML يحتوي على البيانات لاكتشاف الوجوه.

# نقوم بقراءة الصورة بعد تحميلها
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

هنا نقرأ الصورة ونحولها إلى تدرج رمادي. يتم إجراء العديد من العمليات في OpenCV بتدرج اللون الرمادي.

# Detect faces in the image
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags = cv2.cv.CV_HAAR_SCALE_IMAGE)

 

تعتبر هذه العملية الجزء الرئيسي من الكود الخاص بنا حيث أنها تكتشف الوجه الفعلي ، لذا دعنا ننتقل إلى الخيارات التالية:

  • تعد عملية DiscoverMultiScale عملية عامة تكتشف الكائنات. نظرًا لأننا نطلق عليه اسم سلسلة الوجه ، فهذا ما تكتشفه.
  • الخيار الأول هو الصورة ذات التدرج الرمادي grayscale image.
  • الخيار الثاني هو scaleFactor. نظرًا لأن بعض الوجوه قد تكون أقرب إلى الكاميرا ، فإنها ستظهر أكبر من الوجوه الموجودة في الخلف. عامل المقياس يعوض عن هذا.
  • تستخدم خوارزمية الكشف نافذة متحركة لاكتشاف الأشياء. تحدد minNeighbours عدد الأشياء التي تم اكتشافها بالقرب من الكائن الحالي قبل أن تعلن عن الوجه الذي تم العثور عليه. في غضون ذلك ، يعطي minSize حجم كل نافذة.

تعرض الدالة قائمة بالمستطيلات التي تعتقد أنها وجدت وجهًا لها. بعد ذلك ، سوف ننتقل إلى المكان الذي يعتقد أنه وجد فيه شيئًا ما.

 

print ("Found {0} faces!".format(len(faces)))
# 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(image)

Python face detection example 1: Abba

التحقق من النتائج

دعونا نختبر صور اخرى:

Share on facebook
فاسبوك
Share on twitter
تويتر
Share on linkedin
لينكد إن
Share on whatsapp
واتساب

اترك تعليقاً

المشاركات الاخيرة

أحدث التعليقات

أفحص بحثك بالمجان

رفع الملف