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

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

למשימה MediaPipe Face Scoreer נדרשת חבילת Mediapipe PyPI. אפשר להתקין את לייבא את יחסי התלות האלה באמצעות:

$ python -m pip install mediapipe

יבוא

כדי לגשת לפונקציות המשימות של Face Placeer, ניתן לייבא את המחלקות הבאות:

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

דגם

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

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

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

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

יצירת המשימה

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

לדוגמה מלאה ליצירת ציון דרך של זיהוי פנים לשימוש עם תמונה: את הקוד דוגמה.

אפשרויות תצורה

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

הכנת נתונים

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

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

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

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

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

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