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

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

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

קוד לדוגמה

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

אם אתם מטמיעים את Face Landmarker ל-Raspberry Pi, תוכלו להיעזר באפליקציית הדוגמה ל-Raspberry Pi.

הגדרה

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

חבילות

כדי להשתמש במשימה MediaPipe Face Landmarker, צריך את חבילת mediapipe PyPI. אפשר להתקין ולייבא את יחסי התלות האלה באמצעות:

$ python -m pip install mediapipe

יבוא

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

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

דגם

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

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

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

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

יצירת המשימה

המשימה של MediaPipe Face Landmarker משתמשת בפונקציה 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 Landmarker לשימוש עם תמונה מופיעה בדוגמת הקוד.

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

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

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

IMAGE: המצב להזנת תמונה אחת.

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

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 Landmarker תייצר צורות פנים משולבות. תבניות עיבוד של פנים משמשות לעיבוד הנתונים של מודל הפנים התלת-ממדי. Boolean False
output_facial_transformation_matrixes אם הפלט של FaceLandmarker יהיה מטריצת הטרנספורמציה של הפנים. הפונקציה FaceLandmarker משתמשת במטריצה כדי להמיר את נקודות הציון בפנים ממודל פנים קנוני לפנים שזוהה, כדי שמשתמשים יוכלו להחיל אפקטים על נקודות הציון שזוהו. Boolean False
result_callback מגדיר את מאזין התוצאות לקבל את תוצאות ה-landmarker באופן אסינכרוני כש-FaceLandmarker נמצא במצב של שידור חי. אפשר להשתמש בה רק כשמצב ההפעלה מוגדר כ-LIVE_STREAM ResultListener N/A

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך numpy, ואז ממירים אותו לאובייקט 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)
    

הרצת המשימה

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

דוגמה מלאה להרצת Face Landmarker בתמונה מפורטת בדוגמת הקוד.

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

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

בהמשך מוצגת דוגמה לנתוני הפלט של המשימה הזו:

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