التعرف الوجهي والتعرف على الهوية في الرؤية الحاسوبية

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

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

تقنيات تعرف وتحديد الوجوه

توجد طرق متعددة للتعرف على الوجوه وتحديدها، لكن هذا البرنامج التعليمي سيركز على ثلاثة تقنيات ويوضح مزاياها وعيوبها.

1. الطريقة القائمة على القالب

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

المزايا

  • إنها دقيقة جدًا مع قوالب عالية الجودة
  • تتعامل مع الاختلافات في الإضاءة وتعابير الوجه

العيوب

  • تتطلب قوالب عالية الجودة لنتائج دقيقة
  • قد تكون مكلفة من الناحية الحسابية

2. الطريقة القاعدية المبنية على الملامح

ثانياً، تستخرج التقنية القاعدية المبنية على الملامح من الوجه مثل شكل العينين، المسافة بين الحواجب، وانحناء الشفاه. ثم تقارن هذه الملامح مع تلك الموجودة في قاعدة بيانات للوجوه المعروفة لتحديد وجه الهدف. تشمل أمثلة الطرق القاعدية المبنية على الملامح التي تشمل تحول النمط المحلي الثنائي (LBP) وتحويل الملاحة الحساسة للمقياس (SIFT).

المزايا

  • نسبيًا سريعة وفعالة
  • تعمل مع صور ذات دقة منخفضة

العيوب

  • قد لا تعمل بشكل جيد مع ظروف الإضاءة المتغيرة
  • قد لا تكون مرنة في مواجهة تغيرات في تعابير الوجه أو الوقوف

3. نهج التعلم العميق

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

المزايا

  • يحقق دقة عالية مع مجموعات البيانات الكبيرة
  • يتعامل مع الاختلافات في تعابير الوجه والوضعات

العيوب

  • يتطلب كمية كبيرة من البيانات التدريبية
  • يكلف من حيث الموارد الحسابية

ملاحظة: هناك عدة تقنيات لتعريف الوجه والتعرف عليه.

تعريف الوجه والتعرف عليه باستخدام بايثون و OpenCV

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

OpenCV يوفر مجموعة متنوعة من النماذج لتسمية الوجوه، مثل Eigenfaces، Fisherfaces، و Local Binary Patterns Histograms (LBPH). نقوم بتدريب هذه النماذج لتحديد اشخاص معينين عن طريق تقديمهم لهم بصور للأشخاص الذين نرغب في التعرف عليهم. يستخدم Eigenfaces تحليل المكونات الأساسية (PCA) لبناء صورة وجه من أجزاء أصغر، بينما يستخدم Fisherfaces تحليل التمييز الخطي (LDA) للتمييز بين الوجوه. يقارن LBPH نسيج الوجوه بالوجوه المعروفة.

تحديد الهوية الوجهية

استيراد التبعيات

استيراد المكتبات اللازمة.

Python

 

import numpy as np
import cv2
import matplotlib.pyplot as plt
from IPython.display import Image

from google.colab import drive
drive.mount('/content/drive')

تحميل نماذج مدبرة مسبقًا وصورة

يوفر OpenCV مجموعة من المحاليل المدربة مسبقًا `Haar Cascade classifiers` لتحديد مختلف الأجسام، بما في ذلك الوجوه. `cv2.CascadeClassifier` هي فئة تمثل محاليل Haar Cascade. cv2.data.haarcascades هو مسار الدليل الذي يحتوي على النماذج المدربة مسبقًا. `haarcascade_frontalface_default.xml` هو ملف يحتوي على نموذج الكشف عن الوجه المدرب مسبقًا. النموذج متاح لللتنزيل مجانًا على GitHub.

Python

 

# تحميل نموذج الكشف عن الوجه المدرب مسبقًا
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

تحميل الصورة المدخلة `image1.jpg` والتي يمكن أن تكون صورة من اختيارك باستخدام دالة OpenCV’s `imread()`. ثم تحويل الصورة إلى لون أبيض وأسود باستخدام دالة OpenCV’s `cvtColor()`. تحتاج الصورة المتعادلة إلى خوارزمية الكشف عن الوجه.

Python

 

# تحميل الصورة وتحويلها إلى لون أبيض وأسود
img = cv2.imread('/content/drive/MyDrive/Face Detection/image1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# عرض الصورة 
plt.imshow(gray)

تستخدم السطر التالي طريقة detectMultiScale() في فئة CascadeClassifier لاكتشاف الوجوه في الصورة المدمجة. تأخذ طريقة detectMultiScale() الوسائط التالية:

`gray`: الصورة المدمجة

`scaleFactor`: معلمة تحدد مقدار تصغير حجم الصورة في كل مرحلة. قيمة 1.3 تعني تصغير الصورة بنسبة 30% في كل مرحلة.

`minNeighbors`: معلمة تحدد عدد الجيران الذي يجب أن يكون لكل مربع مرشح لاحتفاظ به، وتكون النتائج أقل بقيمة أعلى ولكن بثقة أكبر.

تُرجع طريقة detectMultiScale() قائمة بالمربعات حيث تم الكشف عن الوجوه. يمثل كل مربع مجموعة من أربعة أعداد صحيحة `(x,y,w,h)` يمثل إحداثيات الزاوية اليسرى العليا `(x,y)` للمربع وعرضه `w` وارتفاعه `h`.

Python

 

# اكتشاف الوجوه في الصورة المدمجة
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

رسم مربع حول منطقة الوجه

دعونا ننشئ حلقة ترسم مربعات حول الوجوه المكتشفة في الصورة الأصلية. تأخذ دالة cv2.rectangle() الوسائط التالية:

`img`: الصورة الأصلية.    

`(x,y)`: إحداثيات الزاوية اليسرى العلوية للمربع.    

`(x+w,y+h)`: إحداثيات الزاوية اليمنى السفلية للمربع.    

`(255,0,0)`: يمثل لون المربع الثنائي بتنسيق RGB. (255,0,0) يمثل اللون الأزرق.

`5`: سمك حد المربع بالبكسل.

Python

 

# ارسم مستطيلات حول الوجوه المكتشفة
for (x,y,w,h) in faces:

    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5)

#اعرض الصورة بعد بناء المستطيل.


#عرض الصورة بالوجوه المكتشفة

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

plt.show()

#حفظ الصورة المكتشفة باسم
cv2.imwrite('detected_image.jpg', img)

#تأكد من وجود الصورة المحفوظة.
detected_image=cv2.imread("detected_image.jpg", 1)
gray_channels_reversed = detected_image[:, :, ::-1]
plt.imshow(gray_channels_reversed)

تعرف الوجوه

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

استيراد المرجعيات

Python

 

import numpy as np
import cv2
import matplotlib.pyplot as plt
import dlib
from imutils import face_utils
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity

تحميل نموذج الكشف عن الوجوه وكاشف المعالم الوجهية

تُرجع دالة `dlib.get_frontal_face_detector()` نموذجًا للكشف عن الوجوه مدربًا سابقًا قادرًا على الكشف عن وجوه بشرية في الصور. لمزيد من المعلومات، تحقق من dlib.net الوظائف. أيضًا، قم بتنزيل كاشف المعالم.

Python

 

#تحميل نموذج الكشف عن الوجوه وكاشف المعالم الوجهية
face_detector = dlib.get_frontal_face_detector()
landmark_detector = dlib.shape_predictor('/content/drive/MyDrive/Face Detection/shape_predictor_68_face_landmarks_GTX.dat')

#تحميل الصورة المكتشفة 

img1 = cv2.imread('/content/drive/MyDrive/Face Detection/detected_image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)


#كشف الوجه ومعالم الوجه في الصورة
rects1 = face_detector(gray1, 1)
landmarks1 = landmark_detector(gray1, rects1[0])
landmarks1 = face_utils.shape_to_np(landmarks1)

#تحميل صورة أخرى للمقارنة مع الصورة المحملة مسبقًا
img2 = cv2.imread('/content/drive/MyDrive/Face Detection/001_d3323f3c.jpg')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

 

### تعيين معلمات النموذج

# الكشف عن الوجه ومعالم الوجه في الصورة الثانية

rects2 = face_detector(gray2, 1)

landmarks2 = landmark_detector(gray2, rects2[0])

landmarks2 = face_utils.shape_to_np(landmarks2)

# استخراج الميزات للصورتين عن طريق حساب المسافات الإقليدية بين معالم الوجه

features1 = np.zeros(68)

features2 = np.zeros(68)

for i in range(68):

    features1[i] = np.linalg.norm(landmarks1[i] - landmarks1[0])

    features2[i] = np.linalg.norm(landmarks2[i] - landmarks2[0])

#### تدريب على التشابه

# حساب تشابه جيب التمام بين المتجهين المميزين

score = cosine(features1, features2)

# التحقق مما إذا كان النتيجة أقل من عتبة معينة (على سبيل المثال 0.5) لتحديد ما إذا كان الوجهان متطابقين

if score < 0.5:

    print("The model did not recognize Joseph in one or both of the images..")

else:

    print("The model recognized Joseph in both images.")

الاستنتاج

في هذا البرنامج التعليمي، تعلمت تعرف الوجه وتحديده باستخدام بيثون OpenCV، كيف يعمل، تطبيقاته، وكيف يمكن تنفيذه. يمكن الوصول إلى رمز هذا المشروع من مستودع GitHub.

Source:
https://dzone.com/articles/facial-recognition-and-identification-in-computer