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

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

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

קוד לדוגמה

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

הגדרה

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

חבילות JavaScript

הקוד של Pose Discoverer זמין דרך חבילת 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.js"
    crossorigin="anonymous"></script>
</head>

מודל

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

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

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

יצירת המשימה

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

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

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

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 Scoreer יכול לזהות. 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 לעשות פלט של מסכת פילוח לתנוחה שזוהתה. Boolean False

הכנת הנתונים

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

מריצים את המשימה.

ה-Pose Scoreer משתמש בשיטות detect() (עם מצב ריצה IMAGE) ו-detectForVideo() (עם מצב ריצה VIDEO) כדי ליצור מסקנות. המשימה מעבדת את הנתונים, מנסה להציג תנוחות מפורסמים ואז מדווחת על התוצאות.

קריאות ל-methods detect() ו-detectForVideo() של Pose Discovery פועלות באופן סינכרוני וחוסמות את ה-thread של המשתמש. אם מזהים תנוחות בפריימים של וידאו מהמצלמה של המכשיר, כל זיהוי יחסום את התהליכון הראשי. כדי למנוע זאת, אפשר להטמיע עובדי אינטרנט כדי להריץ את השיטות detect() ו-detectForVideo() ב-thread אחר.

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

תמונה

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 Lander, אפשר להיעזר בקוד לדוגמה.

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

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