המשימה MediaPipe HandTimestamper מאפשרת לכם לזהות את ציוני הדרך של הידיים בתמונה. בהוראות הבאות מוסבר איך להשתמש בסימן 'ציון דרך'. לאפליקציות אינטרנט ו-JavaScript.
מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת, ראו סקירה כללית.
קוד לדוגמה
הקוד לדוגמה של HandTimestamper מספק הטמעה מלאה של ב-JavaScript לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולקבל התחלתם ליצור אפליקציה משלכם לזיהוי ציוני דרך בעבודת יד. אפשר להציג, להריץ ו לערוך את קוד הדוגמה של Handmarker באמצעות דפדפן האינטרנט בלבד.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח במיוחד כדי להשתמש ב-Hand Wayer. למידע כללי על להגדיר את סביבת הפיתוח של האינטרנט ו-JavaScript, כולל הדרישות לגרסת הפלטפורמה. מדריך הגדרה לאינטרנט.
חבילות JavaScript
הקוד של Handmarker זמין דרך @mediapipe/tasks-vision
MediaPipe
חבילת NPM. אפשר
למצוא את הספריות האלה ולהוריד אותן לפי ההוראות שבפלטפורמה
מדריך ההגדרה.
אפשר להתקין את החבילות הנדרשות באמצעות NPM באמצעות הפקודה הבאה:
npm install @mediapipe/tasks-vision
אם רוצים לייבא את קוד המשימה דרך רשת להעברת תוכן (CDN) צריך להוסיף את הקוד הבא לתג <head> בקובץ ה-HTML:
<!-- You can replace JSDeliver with another CDN if you prefer to -->
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
crossorigin="anonymous"></script>
</head>
דגם
למשימה MediaPipe HandTimestamper נדרש מודל מאומן שתואם למשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של Hand Scoreer, ראו: בסקירה הכללית על המשימה בקטע 'מודלים'.
בוחרים מודל ומורידים אותו, ולאחר מכן מאחסנים אותו בספריית הפרויקט:
<dev-project-root>/app/shared/models/
יצירת המשימה
אפשר להשתמש באחת מהפונקציות של Handmarker createFrom...()
כדי
להכין את המשימה להפעלת ההסקה. שימוש בcreateFromModelPath()
בפונקציה עם נתיב יחסי או מוחלט לקובץ המודל שעבר אימון.
אם המודל כבר נטען לזיכרון, אפשר להשתמש
אמצעי תשלום אחד (createFromModelBuffer()
).
הקוד לדוגמה שלמטה מדגים את השימוש בפונקציה createFromOptions()
כדי:
נגדיר את המשימה. הפונקציה createFromOptions
מאפשרת להתאים אישית
מסמן ידני עם אפשרויות הגדרה. מידע נוסף על הגדרות אישיות
אפשרויות נוספות, ראו אפשרויות הגדרה.
הקוד הבא מדגים איך יוצרים ומגדירים משימה באמצעות פרמטרים מותאמים אישית אפשרויות:
const vision = await FilesetResolver.forVisionTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const handLandmarker = await HandLandmarker.createFromOptions(
vision,
{
baseOptions: {
modelAssetPath: "hand_landmarker.task"
},
numHands: 2
});
אפשרויות תצורה
המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאינטרנט ו-JavaScript אפליקציות:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
runningMode |
מגדיר את מצב הריצה של המשימה. יש שתי פלטפורמות
מצבים: IMAGE: המצב לקלט של תמונה יחידה. סרטון: המצב עבור פריימים מפוענחים בסרטון או בשידור חי של נתוני קלט, למשל ממצלמה. |
{IMAGE, VIDEO } |
IMAGE |
numHands |
מספר הידיים המקסימלי שזוהה על ידי מזהה ציון הדרך של היד. | Any integer > 0 |
1 |
minHandDetectionConfidence |
ציון הסמך המינימלי שצריך להיות זיהוי היד נחשב למוצלח במודל זיהוי כף היד. | 0.0 - 1.0 |
0.5 |
minHandPresenceConfidence |
ציון הסמך המינימלי של ציון הנוכחות בכף היד לזיהוי מאפיינים של ציוני דרך. במצב וידאו ובמצב 'שידור חי': אם ציון המהימנות של נוכחות היד מהמודל של יד הציון נמצא מתחת את הסף הזה, Hand Journeyer מפעיל את מודל הזיהוי בכף היד. אחרת, אלגוריתם קל ופשוט למעקב אחר תנועות הידיים קובע את המיקום של את הידים לזיהוי של ציוני הדרך הבאים. | 0.0 - 1.0 |
0.5 |
minTrackingConfidence |
ציון הסמך המינימלי שצריך להביא בחשבון את המעקב אחר היד הפעולה הצליחה. זהו סף IoU של התיבה התוחמת בין הידיים הפריים הנוכחי והפריים האחרון. במצב וידאו ובמצב 'זרם' של Hand Placeer, אם המעקב נכשל, Hand Largeer מפעיל את היד זיהוי וזיהוי אובייקטים. אחרת, התכונה מדלגת על זיהוי היד. | 0.0 - 1.0 |
0.5 |
הכנת נתונים
יד ציוני דרך יכולה לזהות ציוני דרך בכתב יד בתמונות בכל פורמט שנתמך על ידי הדפדפן המארח. המשימה מטפלת גם בעיבוד מראש של קלט נתונים, כולל שינוי גודל, רוטציה ונירמול ערכים. כדי לזהות ציוני דרך של ידיים בסרטונים: אפשר להשתמש ב-API כדי לעבד במהירות פריים אחד בכל פעם, באמצעות חותמת הזמן של המסגרת כדי לקבוע מתי ציוני הדרך של היד מתרחשים בסרטון.
הרצת המשימה
סימן הדרך היד משתמש בdetect()
(במצב הריצה image
)
שיטות להפעלה של detectForVideo()
(במצב הרצה video
)
מסקנות. המשימה מעבדת את הנתונים, מנסה לזהות ציוני דרך של ידיים
ואז מדווח על התוצאות.
קריאות ל-Hand שנקבעו, detect()
ו-detectForVideo()
, פועלות
באופן סינכרוני ולחסום את ה-thread של ממשק המשתמש. אם אתם מזהים ציוני דרך של ידיים
בפריימים של וידאו מהמצלמה של המכשיר, כל זיהוי חוסם את
של שרשור. כדי למנוע זאת, אפשר להטמיע עובדי אינטרנט שיפעילו את detect()
ו-detectForVideo()
שיטות בשרשור אחר.
הקוד הבא מדגים איך מבצעים את העיבוד באמצעות מודל המשימה:
תמונה
const image = document.getElementById("image") as HTMLImageElement; const handLandmarkerResult = handLandmarker.detect(image);
וידאו
await handLandmarker.setOptions({ runningMode: "video" }); let lastVideoTime = -1; function renderLoop(): void { const video = document.getElementById("video"); if (video.currentTime !== lastVideoTime) { const detections = handLandmarker.detectForVideo(video); processResults(detections); lastVideoTime = video.currentTime; } requestAnimationFrame(() => { renderLoop(); }); }
כדי להשלים את תהליך ההרצה של משימת HandTimestamper, אפשר לעיין ב קוד לדוגמה.
טיפול בתוצאות והצגתן
Hand Placeer יוצר אובייקט תוצאת חיפוש ידני לכל זיהוי לרוץ. אובייקט התוצאה מכיל ציוני דרך של יד בקואורדינטות של תמונה, יד ציוני דרך בעולם מבחינת הקואורדינטות והידיות(יד שמאל/ימין) של את הידיים.
בדוגמה הבאה אפשר לראות את נתוני הפלט מהמשימה:
הפלט של HandLandmarkerResult
מכיל שלושה רכיבים. כל רכיב הוא מערך, שבו כל רכיב מכיל את התוצאות הבאות לגבי יד אחת שזוהתה:
התאמה ליד הדומיננטית
היד הדומיננטית מבחינה ידנית מציינת אם הידיים שזוהו הן ידיים שמאל או ידיים ימין.
ציוני דרך
יש 21 ציוני דרך בעבודת יד, כל אחד מהם מורכב מקואורדינטות
x
,y
ו-z
. הקואורדינטותx
ו-y
מנורמלות ל-[0.0, 1.0] על ידי רוחב התמונה ו בהתאמה, בהתאמה. הקואורדינטהz
מייצגת את העומק של ציון הדרך, יחד עם העומק בפרק כף היד הוא המקור. ככל שהערך קטן יותר, כך הוא למצלמה. העוצמה שלz
משתמשת בסולם הזהות, פחות או יותר, כמוx
.אתרים חשובים בעולם
21 ציוני הדרך הידניים מוצגים גם בקואורדינטות עולמיות. כל ציון דרך מורכב מ-
x
,y
ו-z
, שמייצגים קואורדינטות תלת-ממדיות בעולם האמיתי מטרים עם המקור במרכז הגיאומטרי של היד.
HandLandmarkerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
בתמונה הזו אפשר לראות את פלט המשימה:
הקוד לדוגמה של Hand Scoreer מדגים איך להציג של התוצאות שהוחזרו מהמשימה, קוד לדוגמה