מדריך לזיהוי ציוני דרך של תנועות באינטרנט

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

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

קוד לדוגמה

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

הגדרה

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

חבילות JavaScript

הקוד של Pose Landmarker זמין דרך החבילה @mediapipe/tasks-vision NPM של MediaPipe. אפשר למצוא את הספריות האלה ולהוריד אותן לפי ההוראות שמפורטות במדריך ההגדרה של הפלטפורמה.

אפשר להתקין את החבילות הנדרשות באמצעות 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.js"
    crossorigin="anonymous"></script>
</head>

דגם

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

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

<dev-project-root>/app/shared/models/

יצירת המשימה

משתמשים באחת מהפונקציות createFrom...() של Pose Landmarker כדי להכין את המשימה להרצת המסקנות. משתמשים בפונקציה createFromModelPath() עם נתיב יחסי או מוחלט לקובץ המודל שעבר אימון. אם המודל כבר נטען בזיכרון, אפשר להשתמש ב-method‏ createFromModelBuffer().

בדוגמת הקוד שבהמשך מוצג שימוש בפונקציה createFromOptions() כדי להגדיר את המשימה. הפונקציה createFromOptions() מאפשרת להתאים אישית את 'ציון המיקום של תנוחה' באמצעות אפשרויות תצורה. מידע נוסף על אפשרויות ההגדרה זמין במאמר אפשרויות הגדרה.

הקוד הבא מראה איך ליצור ולהגדיר את המשימה עם אפשרויות בהתאמה אישית:

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: המצב להזנת תמונה אחת.

וידאו: המצב של פריימים מפוענחים של וידאו או של שידור חי של נתוני קלט, למשל ממצלמה.
{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) כדי להפעיל את ההסקות. המשימה מעבדת את הנתונים, מנסה לזהות תנוחות ומדווחת על התוצאות.

קריאות לשיטות detect() ו-detectForVideo() של Pose Landmarker פועלות באופן סינכרוני וחוסמות את הליבת ה-interpose של המשתמש. אם מזוהות תנוחות בפריימים של סרטונים ממצלמת המכשיר, כל זיהוי חוסם את השרשור הראשי. כדי למנוע זאת, אפשר להטמיע עובדים באינטרנט שיפעילו את השיטות 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 מוסבר איך להציג את התוצאות שהוחזרו מהמשימה. אפשר לעיין בקוד לדוגמה