המשימה MediaPipe HandTimestamper מאפשרת לכם לזהות את ציוני הדרך של הידיים בתמונה. ההוראות האלה מדגימות איך להשתמש ב-Hand landmarker באמצעות Python. דוגמת הקוד שמתוארת בהוראות אלה זמינה GitHub.
מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת, ראו סקירה כללית.
קוד לדוגמה
הקוד לדוגמה של Handmonder מספק הטמעה מלאה של ב-Python, לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולקבל התחלתם לבנות גלאי ייחודי לסימון שטח משלכם. אפשר להציג, להריץ ו לערוך את קוד לדוגמה של Handmarker באמצעות דפדפן האינטרנט בלבד.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח בפרויקטים של קוד שישמשו באופן ספציפי לשימוש ב-Hand לאתרer. למידע כללי על להגדיר את סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסת הפלטפורמה. מדריך ההגדרה של Python
חבילות
למשימה MediaPipe HandTimestamper נדרשת חבילת Mediapipe PyPI. אפשר להתקין ולייבא את יחסי התלות האלה באמצעות:
$ python -m pip install mediapipe
יבוא
כדי לגשת לפונקציות המשימות של Hand Lawer, מייבאים את המחלקות הבאות:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
דגם
למשימה MediaPipe HandTimestamper נדרש מודל מאומן שתואם למשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של Hand Scoreer, ראו: בסקירה הכללית על המשימה בקטע 'מודלים'.
בוחרים את המודל, מורידים אותו ושומרים אותו בספרייה מקומית:
model_path = '/absolute/path/to/gesture_recognizer.task'
שימוש בפרמטר BaseOptions
של האובייקט model_asset_path
כדי לציין את הנתיב
של המודל לשימוש. בקטע הבא מופיע קוד לדוגמה.
יצירת המשימה
המשימה MediaPipe HandTimestamper משתמשת בפונקציה create_from_options
כדי
נגדיר את המשימה. הפונקציה create_from_options
מקבלת ערכים
לאפשרויות תצורה לטיפול. מידע נוסף על הגדרות אישיות
אפשרויות נוספות, ראו אפשרויות הגדרה.
הקוד הבא מדגים איך יוצרים ומגדירים את המשימה הזו.
הדוגמאות האלה גם מראות את הווריאציות של מבנה המשימה עבור תמונות, קובצי וידאו וסטרימינג בשידור חי.
תמונה
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions HandLandmarker = mp.tasks.vision.HandLandmarker HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a hand landmarker instance with the image mode: options = HandLandmarkerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.IMAGE) with HandLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
וידאו
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions HandLandmarker = mp.tasks.vision.HandLandmarker HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a hand landmarker instance with the video mode: options = HandLandmarkerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.VIDEO) with HandLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
שידור חי
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions HandLandmarker = mp.tasks.vision.HandLandmarker HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions HandLandmarkerResult = mp.tasks.vision.HandLandmarkerResult VisionRunningMode = mp.tasks.vision.RunningMode # Create a hand landmarker instance with the live stream mode: def print_result(result: HandLandmarkerResult, output_image: mp.Image, timestamp_ms: int): print('hand landmarker result: {}'.format(result)) options = HandLandmarkerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.LIVE_STREAM, result_callback=print_result) with HandLandmarker.create_from_options(options) as landmarker: # The landmarker is initialized. Use it here. # ...
לדוגמה מלאה ליצירת ציון דרך של יד לשימוש עם תמונה, אפשר לעיין ב קוד לדוגמה.
אפשרויות תצורה
המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאפליקציות Python:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
running_mode |
מגדיר את מצב הריצה של המשימה. יש שלושה סוגים
מצבים: IMAGE: המצב לקלט של תמונה יחידה. סרטון: המצב של פריימים מפוענחים בסרטון. LIVE_STREAM: המצב לשידור חי של קלט נתונים ממצלמה, במצב הזה, resultListener חייב להיות נשלחה קריאה כדי להגדיר אוזן כדי לקבל תוצאות באופן אסינכרוני. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
num_hands |
מספר הידיים המקסימלי שזוהה על ידי מזהה ציון הדרך של היד. | Any integer > 0 |
1 |
min_hand_detection_confidence |
ציון הסמך המינימלי שצריך להיות זיהוי היד נחשב למוצלח במודל זיהוי כף היד. | 0.0 - 1.0 |
0.5 |
min_hand_presence_confidence |
ציון הסמך המינימלי של ציון הנוכחות בכף היד לזיהוי מאפיינים של ציוני דרך. במצב וידאו ובמצב 'שידור חי': אם ציון המהימנות של נוכחות היד מהמודל של יד הציון נמצא מתחת את הסף הזה, Hand landmarker מפעיל את המודל לזיהוי כף היד. אחרת, אלגוריתם קל ופשוט למעקב אחר תנועות הידיים קובע את המיקום של את הידים לזיהוי של ציוני הדרך הבאים. | 0.0 - 1.0 |
0.5 |
min_tracking_confidence |
ציון הסמך המינימלי שצריך להביא בחשבון את המעקב אחר היד הפעולה הצליחה. זהו סף IoU של התיבה התוחמת בין הידיים הפריים הנוכחי והפריים האחרון. במצב וידאו ובמצב 'זרם' של Hand Placeer, אם המעקב נכשל, Hand Largeer מפעיל את היד זיהוי וזיהוי אובייקטים. אחרת, התכונה מדלגת על זיהוי היד. | 0.0 - 1.0 |
0.5 |
result_callback |
מגדיר את אוזן התוצאות לקבל את תוצאות הזיהוי
באופן אסינכרוני כשסמן היד נמצא במצב של שידור חי.
רלוונטי רק כשמצב הריצה מוגדר כ-LIVE_STREAM |
לא רלוונטי | לא רלוונטי |
הכנת נתונים
מכינים את הקלט כקובץ תמונה או כמערך נומרי,
ואז ממירים אותו לאובייקט mediapipe.Image
. אם הקלט הוא קובץ וידאו
או להפעיל סטרימינג בשידור חי ממצלמת אינטרנט, אפשר להשתמש בספרייה חיצונית כמו
OpenCV לטעינת פריימים של קלט בתור numpy
מערכים מגוונים.
תמונה
import mediapipe as mp # Load the input image from an image file. mp_image = mp.Image.create_from_file('/path/to/image') # Load the input image from a numpy array. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
וידאו
import mediapipe as mp # Use OpenCV’s VideoCapture to load the input video. # Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS # You’ll need it to calculate the timestamp for each frame. # Loop through each frame in the video using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
שידור חי
import mediapipe as mp # Use OpenCV’s VideoCapture to start capturing from the webcam. # Create a loop to read the latest frame from the camera using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
הרצת המשימה
סימן הדרך היד משתמש ב-זיהוי, זיהוי_for_video ו-זיהוי_async כדי להפעיל הסקת מסקנות. בזיהוי ציוני דרך של ידיים, עיבוד מראש של נתוני קלט, זיהוי ידיים בתמונה וזיהוי יד של ציוני דרך.
הקוד הבא מדגים איך מבצעים את העיבוד באמצעות מודל המשימה.
תמונה
# Perform hand landmarks detection on the provided single image. # The hand landmarker must be created with the image mode. hand_landmarker_result = landmarker.detect(mp_image)
וידאו
# Perform hand landmarks detection on the provided single image. # The hand landmarker must be created with the video mode. hand_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
שידור חי
# Send live image data to perform hand landmarks detection. # The results are accessible via the `result_callback` provided in # the `HandLandmarkerOptions` object. # The hand landmarker must be created with the live stream mode. landmarker.detect_async(mp_image, frame_timestamp_ms)
שימו לב לנקודות הבאות:
- כשמפעילים את מצב וידאו או שידור חי, צריך גם מציינים את חותמת הזמן של מסגרת הקלט למשימה של HandTimestamper.
- בזמן ההפעלה בתמונה או במודל הסרטון, המשימה Hand Placeer לחסום את השרשור הנוכחי עד שיסיים לעבד את תמונת הקלט מסגרת.
- כשהמשימה הזאת מופעלת במצב שידור חי, המשימה Hand Scoreer לא חוסמת השרשור הנוכחי, אבל חוזר מיד. הוא יפעיל את התוצאה שלו המאזין עם תוצאת הזיהוי בכל פעם שהעיבוד שלו מסתיים מסגרת קלט. אם מתבצעת קריאה לפונקציית הזיהוי המשימה עסוקה בעיבוד פריים אחר. המשימה תתעלם ממסגרת הקלט החדשה.
כדי לראות דוגמה מלאה להפעלת Hand Lawer על תמונה, אפשר לעיין דוגמה לקוד לפרטים.
טיפול בתוצאות והצגתן
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 מדגים איך להציג של התוצאות שהוחזרו מהמשימה, קוד לדוגמה לקבלת פרטים.