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

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

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

קוד לדוגמה

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

הגדרה

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

חבילות JavaScript

הקוד של Poseוןer זמין דרך @mediapipe/tasks-visionMediaPipe חבילת 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 לעדכןer נדרש מודל מאומן התואם למשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של Pose Scoreer, ראו: בסקירה הכללית על המשימה בקטע 'מודלים'.

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

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

יצירת המשימה

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

הקוד לדוגמה שלמטה מדגים את השימוש בפונקציה createFromOptions() כדי: נגדיר את המשימה. הפונקציה createFromOptions() מאפשרת להתאים אישית מיקום של ARIA עם אפשרויות הגדרה. מידע נוסף על הגדרות אישיות אפשרויות נוספות, ראו אפשרויות הגדרה.

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

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 המספר המקסימלי של תנוחות שהמערכת יכולה לזהות תנו לציוני דרך. 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 srcer מפיק מסיכת פילוח עבור של התנוחה. Boolean False

הכנת נתונים

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

הרצת המשימה

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

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

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

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