המשימה MediaPipe Pose Landmarker מאפשרת לזהות נקודות ציון של גוף האדם בתמונה או בסרטון. אפשר להשתמש במשימה הזו כדי לזהות מיקומים מרכזיים בגוף, לנתח את היציבה ולסווג תנועות. במשימה הזו נעשה שימוש במודלים של למידת מכונה (ML) שפועלים עם תמונות בודדות או עם סרטונים. המשימה מחזירה נקודות ציון של תנוחת הגוף בקואורדינטות של תמונה ובקואורדינטות תלת-ממדיות של העולם.
בהוראות האלה מוסבר איך להשתמש ב-Pose Landmarker לאתרים ולאפליקציות JavaScript. מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו זמין בסקירה הכללית.
קוד לדוגמה
קוד לדוגמה לזיהוי נקודות ציון של תנוחה מספק הטמעה מלאה של המשימה הזו ב-JavaScript לעיון. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולהתחיל ליצור אפליקציה משלכם לזיהוי נקודות ציון בתנוחה. אתם יכולים להציג, להריץ ולערוך את הדוגמה לזיהוי נקודות ציון בתנוחה באמצעות דפדפן האינטרנט בלבד.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח לשימוש ב-Pose Landmarker. מידע כללי על הגדרת סביבת הפיתוח לאתרים ול-JavaScript, כולל דרישות לגבי גרסת הפלטפורמה, זמין במדריך ההגדרה לאתרים.
חבילות JavaScript
הקוד של Pose Landmarker זמין דרך חבילת MediaPipe @mediapipe/tasks-vision
NPM. אפשר למצוא ולהוריד את הספריות האלה לפי ההוראות במדריך ההגדרה של הפלטפורמה.
אפשר להתקין את החבילות הנדרשות דרך NPM באמצעות הפקודה הבאה:
npm install @mediapipe/tasks-vision
אם רוצים לייבא את קוד המשימה דרך שירות של רשת להעברת תוכן (CDN), מוסיפים את הקוד הבא לתג <head> בקובץ ה-HTML:
<!-- You can replace JSDeliver with another CDN if you prefer -->
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.mjs"
crossorigin="anonymous"></script>
</head>
דגם
כדי להשתמש במשימה MediaPipe Pose Landmarker, צריך מודל מאומן שתואם למשימה הזו. מידע נוסף על מודלים מאומנים שזמינים לזיהוי נקודות ציון של תנוחות מופיע בקטע Models (מודלים) בסקירה הכללית של המשימה.
בוחרים מודל, מורידים אותו ושומרים אותו בספריית הפרויקט:
<dev-project-root>/app/shared/models/
יצירת המשימה
משתמשים באחת מהפונקציות של Pose Landmarker createFrom...() כדי להכין את המשימה להפעלת מסקנות. משתמשים בפונקציה createFromModelPath() עם נתיב יחסי או מוחלט לקובץ המודל שעבר אימון.
אם המודל כבר נטען לזיכרון, אפשר להשתמש בשיטה createFromModelBuffer().
בדוגמת הקוד הבאה מוצג שימוש בפונקציה createFromOptions() כדי להגדיר את המשימה. הפונקציה createFromOptions() מאפשרת לכם להתאים אישית את Pose Landmarker באמצעות אפשרויות הגדרה. מידע נוסף על אפשרויות ההגדרה זמין במאמר אפשרויות הגדרה.
בדוגמת הקוד הבאה אפשר לראות איך יוצרים ומגדירים את המשימה עם אפשרויות מותאמות אישית:
const vision = await FilesetResolver.forVisionTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const poseLandmarker = await poseLandmarker.createFromOptions(
vision,
{
baseOptions: {
modelAssetPath: "path/to/model"
},
runningMode: runningMode
});
אפשרויות הגדרה
במשימה הזו יש את אפשרויות ההגדרה הבאות לאפליקציות אינטרנט ולאפליקציות JavaScript:
| שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
|---|---|---|---|
runningMode |
הגדרת מצב ההפעלה של המשימה. יש שני מצבים: IMAGE: המצב לקלט של תמונה אחת. VIDEO: המצב של פריים מפוענח של סרטון או של שידור חי של נתוני קלט, כמו ממצלמה. |
{IMAGE, VIDEO} |
IMAGE |
numPoses |
המספר המקסימלי של תנוחות שאפשר לזהות באמצעות Pose Landmarker. | Integer > 0 |
1 |
minPoseDetectionConfidence |
ציון הסמך המינימלי לזיהוי התנוחה כדי שהזיהוי ייחשב כמוצלח. | Float [0.0,1.0] |
0.5 |
minPosePresenceConfidence |
ציון הסמך המינימלי של נוכחות התנוחה בזיהוי נקודות ציון של התנוחה. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
ציון הסמך המינימלי שנדרש כדי שמעקב התנוחות ייחשב כמוצלח. | Float [0.0,1.0] |
0.5 |
outputSegmentationMasks |
האם המודל Pose Landmarker מוציא מסכת פילוח עבור התנוחה שזוהתה. | Boolean |
False |
הכנת הנתונים
הכלי Pose Landmarker יכול לזהות תנוחות בתמונות בכל פורמט שנתמך על ידי הדפדפן המארח. בנוסף, המשימה מטפלת בעיבוד מקדים של נתוני הקלט, כולל שינוי גודל, סיבוב ונרמול ערכים. כדי לסמן תנוחות בסרטונים, אפשר להשתמש ב-API כדי לעבד במהירות פריים אחד בכל פעם, באמצעות חותמת הזמן של הפריים כדי לקבוע מתי התנוחות מתרחשות בסרטון.
הרצת המשימה
המודל Pose Landmarker משתמש בשיטות detect() (עם מצב הפעלה IMAGE) ו-detectForVideo() (עם מצב הפעלה VIDEO) כדי להפעיל הסקת מסקנות. המשימה מעבדת את הנתונים, מנסה לזהות תנוחות של נקודות ציון ואז מדווחת על התוצאות.
הקריאות לשיטות Pose Landmarker detect() ו-detectForVideo() מופעלות באופן סינכרוני וחוסמות את השרשור של interpose המשתמש. אם מזהים תנוחות
בפריים של סרטון מהמצלמה של המכשיר, כל זיהוי חוסם את השרשור הראשי. כדי למנוע את זה, אפשר להטמיע web workers כדי להריץ את השיטות detect() ו-detectForVideo() בשרשור אחר.
בדוגמה הבאה אפשר לראות איך להריץ את העיבוד באמצעות מודל המשימות:
תמונה
const image = document.getElementById("image") as HTMLImageElement; const poseLandmarkerResult = poseLandmarker.detect(image);
וידאו
await poseLandmarker.setOptions({ runningMode: "VIDEO" }); let lastVideoTime = -1; function renderLoop(): void { const video = document.getElementById("video"); if (video.currentTime !== lastVideoTime) { const poseLandmarkerResult = poseLandmarker.detectForVideo(video); processResults(detections); lastVideoTime = video.currentTime; } requestAnimationFrame(() => { renderLoop(); }); }
לדוגמה מלאה יותר להטמעה של משימת זיהוי נקודות ציון של תנוחה, אפשר לעיין בדוגמה.
טיפול בתוצאות והצגתן
ה-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 מדגים איך להציג את התוצאות שמוחזרות מהמשימה. אפשר לעיין בדוגמה