• בלוג
  • זיהוי פנים ב Python עם OpenCV

זיהוי פנים ב Python עם OpenCV

25/04/2020

זיהוי פנים בתמונה זו בעיה פתורה ומה שכיף בבעיות פתורות זה שאנחנו יכולים ממש בקלות לשלב את הפיתרון גם ביישומים גדולים יותר שלנו. אם אתם רוצים לדעת לעומק איך עושים את זה תצטרכו לקרוא על אלגוריתמים ותמונות והמון דברים שאני לא מספיק מבין בהם, אבל אם אתם פשוט צריכים למצוא פרצוף בתמונה מספיק להשתמש במנגנון הקיים של OpenCV. הנה הקוד שעושה את זה.

1. התקנת OpenCV

התקנת ספריית OpenCV ב Python היא די פשוטה ובסך הכל דורשת הרצת שתי פקודות pip:

python -m pip install numpy opencv-python

בשביל לבדוק שההתקנה עברה חלק אפשר להפעיל את הסקריפט הבא:

import cv2
print(cv2.__version__)

אני קיבלתי את 4.2.0 אבל אני חושב שכל גירסא מעל 4 תספיק.

הדבר השני שנצטרך הוא קובץ המידע עבור ה Classifier. זה בעצם הקובץ שמספר ל OpenCV מה זה פרצוף. הוא הוכן בתהליך של סריקת המון תמונות וסימון ידני של מאפיינים בתוכן. הקובץ מגיע בפורמט xml ואפשר למצוא מספר אפשרויות לקבצי מידע כאלה במאגר של OpenCV עצמו בגיטהאב.

בפוסט זה אשתמש בקובץ haarcascade_frontalface_default.xml שכולל מידע על פנים של אנשים. אפשר להוריד את הקובץ מהקישור הזה.

2. הסקריפט

קובץ ה Python שמזהה פרצופים כולל בסך הכל פחות מ-30 שורות כי את כל העבודה כבר עשו בשבילי ב OpenCV. בגדול אנחנו:

  1. הופכים את התמונה לשחור-לבן כדי שיהיה ל OpenCV יותר קל לעבוד איתה.

  2. מבקשים מ OpenCV למצוא פרצופים בתמונה באמצעות ה Cascader שלנו (זה המידע מקובץ ה xml שלקחנו מהמאגר של OpenCV).

  3. מציירים על התמונה המקורית ריבוע מסביב לכל פרצוף ש OpenCV מצא

  4. מציגים את התמונה עם הריבועים מסביב לפרצופים.

קוד? ברור:

import sys, pathlib
import cv2

imagePath = sys.argv[1]
cascader_file = str(pathlib.Path(__file__).parent / "haarcascade_frontalface_default.xml")
faceCascade = cv2.CascadeClassifier(cascader_file)

image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

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

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)

cv2.imshow("Faces found", image)
cv2.waitKey(0)

הקוד מבוסס על פוסט באותו נושא מ Real Python וכולל כמה תיקונים שלי כדי שיעבוד עם גירסא חדשה של פייתון ו OpenCV.

בשביל להפעיל אותו אתם מעבירים בשורת הפקודה שם של קובץ תמונה בתור פרמטר ראשון ונותנים לפייתון לעשות את כל השאר.