מדריך לזיהוי ציוני דרך ב-Python

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

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

$ python -m pip install mediapipe

יבוא

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

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

דגם

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

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

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

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

יצירת המשימה

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

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

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

תמונה

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

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

וידאו

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

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

שידור חי

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

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

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

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

דוגמה מלאה ליצירת 'ציון דרך של תנוחה' לשימוש בתמונה מופיעה בדוגמת הקוד.

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

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

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

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

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

LIVE_STREAM: המצב של סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, צריך להפעיל את resultListener כדי להגדיר מאזין שיקבל את התוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses המספר המקסימלי של תנוחות שאפשר לזהות באמצעות התכונה Pose Landmarker. Integer > 0 1
min_pose_detection_confidence דירוג האמון המינימלי שדרוש כדי שהזיהוי של התנוחה יחשב כהצלחה. Float [0.0,1.0] 0.5
min_pose_presence_confidence דירוג האמון המינימלי של דירוג נוכחות התנוחה בזיהוי ציוני ציון התנוחה. Float [0.0,1.0] 0.5
min_tracking_confidence דירוג האמון המינימלי שדרוש כדי שהמעקב אחר התנוחה ייחשבו כסתיים. Float [0.0,1.0] 0.5
output_segmentation_masks האם התכונה Pose Landmarker מפיקה מסכת פילוח לתנוחה שזוהתה. Boolean False
result_callback מגדיר את מאזין התוצאות לקבל את תוצאות ה-landmarker באופן אסינכרוני כש-Pose Landmarker נמצא במצב של שידור חי. אפשר להשתמש בה רק כשמצב ההפעלה מוגדר כ-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)
    

הרצת המשימה

ה-Pose Landmarker משתמש בפונקציות detect, ‏ detect_for_video ו-detect_async כדי להפעיל מסקנות. בתהליך סימון נקודות ציון של תנוחות, המערכת מבצעת עיבוד מקדים של נתוני הקלט ומאתרת תנוחות בתמונה.

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

תמונה

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the image mode.
pose_landmarker_result = landmarker.detect(mp_image)
    

וידאו

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

שידור חי

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

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

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

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

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

ה-Pose Landmarker מחזיר אובייקט poseLandmarkerResult לכל הרצה של זיהוי. אובייקט התוצאה מכיל קואורדינטות לכל ציון דרך של תנוחה.

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

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

הפלט מכיל גם קואורדינטות רגילות (Landmarks) וגם קואורדינטות בעולם (WorldLandmarks) לכל ציון דרך.

הפלט מכיל את הקואורדינטות המנורמליות הבאות (Landmarks):

  • x ו-y: קואורדינטות של ציון דרך שמותאמות לטווח שבין 0.0 ל-1.0 לפי רוחב התמונה (x) וגובה התמונה (y).

  • z: עומק ציון הדרך, כאשר נקודת המוצא היא העומק בנקודת האמצע של הירכיים. ככל שהערך קטן יותר, כך ציון הדרך קרוב יותר למצלמה. הערך של z משתמש בערך באותו סולם כמו x.

  • visibility: הסבירות שהציון הגיאוגרפי יהיה גלוי בתמונה.

הפלט מכיל את הקואורדינטות הבאות בעולם (WorldLandmarks):

  • x,‏ y ו-z: קואורדינטות תלת-ממדיות בעולם האמיתי במטרים, כשנקודת המוצא היא נקודת האמצע של הירכיים.

  • visibility: הסבירות שהציון הגיאוגרפי יהיה גלוי בתמונה.

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

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

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

מסכת פילוח של התמונה הקודמת שמציגה את קווי המתאר של האישה

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