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

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

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

קוד לדוגמה

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

אם אתם מטמיעים את גלאי הפנים ל-Raspberry Pi, יש לעיין דוגמה ל-Raspberry Pi app.

הגדרה

בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח פרויקטים קודיים במיוחד לשימוש ב'גלאי פנים'. למידע כללי על להגדיר את סביבת הפיתוח לשימוש במשימות 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'

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

יצירת המשימה

במשימה של MediaPipe Face Detector נעשה שימוש בפונקציה 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

הכנת נתונים

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

תמונה

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)
    

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

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

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

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

גלאי הפנים מחזיר אובייקט 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)

בתמונה הזו אפשר לראות את פלט המשימה:

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

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