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

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

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

$ python -m pip install mediapipe

יבוא

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

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

מודל

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

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

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

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

יצירת המשימה

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

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

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

תמונה

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

וידאו

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the video mode:
options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

שידור חי

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
FaceLandmarkerResult = mp.tasks.vision.FaceLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

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

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

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

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

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

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

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

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

LIVE_STREAM: המצב עבור סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, יש להפעיל את resultListener כדי להגדיר מאזין לקבלת תוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces המספר המקסימלי של פנים שניתן לזהות באמצעות FaceLandmarker. ההחלקה מתבצעת רק כאשר הערך של num_faces מוגדר ל-1. Integer > 0 1
min_face_detection_confidence ציון הסמך המינימלי שצריך לעמוד בו כדי שזיהוי הפנים ייחשב כמוצלח. Float [0.0,1.0] 0.5
min_face_presence_confidence ציון המהימנות המינימלי של ציון נוכחות הפנים בזיהוי של ציון הפנים. Float [0.0,1.0] 0.5
min_tracking_confidence ציון הסמך המינימלי הנדרש למעקב אחר זיהוי הפנים כדי להיחשב כמוצלח. Float [0.0,1.0] 0.5
output_face_blendshapes האם Face Looker יוצר מיקסים של פנים. שילובים של הפנים משמשים להצגת התבנית התלת-ממדית לזיהוי הפנים. Boolean False
output_facial_transformation_matrixes האם סמן הפלט הוא פלט של מטריצת טרנספורמציית הפנים. התכונה 'סמן פנים' משתמשת במטריצה כדי לשנות את ציוני הדרך של הפנים מתבנית קנונית לזיהוי פנים לזיהוי הפנים שזוהו. כך המשתמשים יכולים להחיל אפקטים על ציוני הדרך שזוהו. Boolean False
result_callback מגדיר את מאזין התוצאות לקבלת תוצאות של ציוני דרך באופן אסינכרוני כאשר FaceLandmark נמצא במצב שידור חי. אפשר להשתמש רק כשמצב ריצה מוגדר ל-LIVE_STREAM ResultListener N/A

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך 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 landmarking on the provided single image.
# The face landmarker must be created with the image mode.
face_landmarker_result = landmarker.detect(mp_image)
    

וידאו

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the video mode.
face_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

שידור חי

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

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

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

לקבלת דוגמה מלאה להפעלת Face Looker על תמונה, עיינו בדוגמה לקוד.

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

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

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

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

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

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