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

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

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

$ python -m pip install mediapipe

יבוא

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

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

דגם

למשימה MediaPipe Pose לעדכןer נדרש מודל מאומן התואם למשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של Pose Scoreer, ראו: בסקירה הכללית על המשימה בקטע 'מודלים'.

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

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

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

יצירת המשימה

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

לדוגמה מלאה ליצירת ציון דרך של Pose Lander שניתן להשתמש בו עם תמונה, אפשר לעיין ב קוד לדוגמה.

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

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

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

IMAGE: המצב לקלט של תמונה יחידה.

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

LIVE_STREAM: המצב לשידור חי של קלט נתונים ממצלמה, במצב הזה, resultListener חייב להיות נשלחה קריאה כדי להגדיר אוזן כדי לקבל תוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses המספר המקסימלי של תנוחות שהמערכת יכולה לזהות תנו לציוני דרך. 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 srcer מפיק מסיכת פילוח עבור של התנוחה. Boolean False
result_callback מגדיר את אוזן התוצאות לקבל את תוצאות ה- במעקב באופן אסינכרוני כש-Pose Lander נמצא במצב שידור חי. אפשר להשתמש באפשרות הזו רק כשמצב הריצה מוגדר ל-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)
    

הרצת המשימה

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

לקבלת דוגמה מלאה להרצת Poseמדיניותer על תמונה, אפשר לעיין ב קוד לדוגמה לקבלת פרטים.

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

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