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