מדריך לזיהוי פנים ל-Python

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

דוגמת הקוד שמתוארת בהוראות האלו זמינה ב-GitHub. למידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו, קראו את הסקירה הכללית.

קוד לדוגמה

הקוד לדוגמה של Face Detector מספק הטמעה מלאה של המשימה הזו ב-Python לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולהתחיל ליצור גלאי פנים. תוכלו להציג, להריץ ולערוך את קוד הדוגמה של מזהה הפנים באמצעות דפדפן האינטרנט בלבד.

אם אתם מטמיעים את גלאי הפנים עבור Raspberry Pi, עיינו באפליקציה לדוגמה של Raspberry Pi.

הגדרה

בקטע הזה מתוארים שלבים עיקריים להגדרת סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש ב'גלאי פנים'. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות MediaPipe, כולל הדרישות לגרסת הפלטפורמה, קראו את מדריך ההגדרה של Python.

חבילות

המשימה 'מזהה פנים של MediaPipe' מחייבת את חבילת mediapipe PyPI. אפשר להתקין ולייבא את יחסי התלות האלה בעזרת הדברים הבאים:

$ python -m pip install mediapipe

יבוא

ייבא את המחלקות הבאות כדי לגשת לפונקציות המשימה של 'זיהוי פנים':

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

מודל

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

בוחרים את המודל ומורידים אותו, ולאחר מכן מאחסנים אותו בספרייה מקומית:

model_path = '/absolute/path/to/face_detector.task'

השתמשו בפרמטר model_asset_path של האובייקט BaseOptions כדי לציין את הנתיב של המודל שבו יש להשתמש. דוגמה לקוד זמינה בקטע הבא.

יצירת המשימה

המשימה 'מזהה פנים של MediaPipe' משתמשת בפונקציה create_from_options כדי להגדיר את המשימה. הפונקציה create_from_options מקבלת ערכים לאפשרויות של הגדרות אישיות. מידע נוסף על אפשרויות ההגדרה זמין במאמר אפשרויות תצורה.

הקוד הבא מדגים איך ליצור ולהגדיר את המשימה הזו.

בדוגמאות האלה מוצגות גם הווריאציות של יצירת המשימה לתמונות, לקובצי וידאו ולשידור חי.

תמונה

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face detector instance with the image mode:
options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

וידאו

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face detector instance with the video mode:
options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

שידור חי

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceDetector = mp.tasks.vision.FaceDetector
FaceDetectorOptions = mp.tasks.vision.FaceDetectorOptions
FaceDetectorResult = mp.tasks.vision.FaceDetectorResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face detector instance with the live stream mode:
def print_result(result: FaceDetectorResult, output_image: mp.Image, timestamp_ms: int):
    print('face detector result: {}'.format(result))

options = FaceDetectorOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with FaceDetector.create_from_options(options) as detector:
  # The detector is initialized. Use it here.
  # ...
    

דוגמה מלאה ליצירת גלאי פנים לשימוש עם תמונה, ראו דוגמה לקוד.

אפשרויות הגדרה

במשימה הזאת קיימות אפשרויות ההגדרה הבאות לאפליקציות Python:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
running_mode מגדיר את מצב הריצה של המשימה. יש שלושה מצבים:

IMAGE: המצב שבו ניתן להזין תמונה יחידה.

וידאו: המצב של פריימים מפוענחים של סרטון.

LIVE_STREAM: המצב עבור סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, יש להפעיל את resultListener כדי להגדיר מאזין לקבלת תוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
min_detection_confidence ציון המהימנות המינימלי שזיהוי הפנים ייחשב בהצלחה. Float [0,1] 0.5
min_suppression_threshold הסף המינימלי שאינו ביטול מקסימלי כדי שזיהוי הפנים ייחשב לחפיפה. Float [0,1] 0.3
result_callback מגדיר את הכלי להאזנה לתוצאות כך שיקבל את תוצאות הזיהוי באופן אסינכרוני כשגלאי הפנים נמצא במצב שידור חי. אפשר להשתמש רק כשמצב הריצה מוגדר ל-LIVE_STREAM. N/A Not set

הכנת הנתונים

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

תמונה

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

וידאו

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

שידור חי

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

מריצים את המשימה.

גלאי הפנים משתמש בפונקציות detect, detect_for_video ו-detect_async כדי לגרום להסקת מסקנות. בזיהוי פנים, התהליך כולל עיבוד מראש של נתוני קלט וזיהוי פנים בתוך התמונה.

הקוד הבא מדגים איך לבצע את העיבוד באמצעות מודל המשימה.

תמונה

# Perform face detection on the provided single image.
# The face detector must be created with the image mode.
face_detector_result = detector.detect(mp_image)
    

וידאו

# Perform face detection on the provided single image.
# The face detector must be created with the video mode.
face_detector_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
    

שידור חי

# Send live image data to perform face detection.
# The results are accessible via the `result_callback` provided in
# the `FaceDetectorOptions` object.
# The face detector must be created with the live stream mode.
detector.detect_async(mp_image, frame_timestamp_ms)
    

שימו לב לנקודות הבאות:

  • כשאתם מפעילים את התכונה במצב וידאו או במצב שידור חי, עליכם גם לספק למשימת 'זיהוי פנים' את חותמת הזמן של פריים הקלט.
  • כשמפעילים את התמונה או את דגם הווידאו, המשימה 'זיהוי פנים' חוסמת את ה-thread הנוכחי עד לסיום העיבוד של התמונה או הפריים שהוגדרו כקלט.
  • כשמפעילים את התכונה במצב שידור חי, המשימה 'זיהוי פנים' חוזרת באופן מיידי ולא חוסמת את השרשור הנוכחי. בכל פעם שהוא יסיים לעבד פריים קלט, הוא יופעל עם מאזן התוצאות. אם תתבצע קריאה לפונקציית הזיהוי כשהמשימה של 'זיהוי פנים' עסוקה בעיבוד פריים אחר, המשימה תתעלם ממסגרת הקלט החדשה.

לצפייה בדוגמה מלאה של הפעלת גלאי פנים על תמונה, קראו פרטים בקוד לדוגמה.

טיפול בתוצאות והצגתן

בכל הרצת זיהוי, מזהה הפנים מחזיר אובייקט FaceDetectorResult. אובייקט התוצאה מכיל תיבות תוחמות לפנים שזוהו, וציון מהימנות לכל פנים שזוהו.

דוגמה לנתוני הפלט מהמשימה הזאת:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

התמונה הבאה מציגה המחשה של פלט המשימה:

לגבי התמונה ללא תיבות תוחמות, יש לעיין בתמונה המקורית.

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