המשימה 'מזהה אובייקטים של MediaPipe' מאפשרת לזהות את הנוכחות והמיקום של מספר של אובייקטים. בהוראות האלה מוסבר איך להשתמש ב'גלאי אובייקטים' ב-Python. הקוד לדוגמה שמתואר בהוראות האלה זמין GitHub.
אפשר לראות את המשימה הזו בהדגמה של האתר. לקבלת מידע נוסף על היכולות, המודלים אפשרויות ההגדרה של המשימה הזו, ראו סקירה כללית.
קוד לדוגמה
הקוד לדוגמה של 'מזהה אובייקטים' מספק הטמעה מלאה של ב-Python, לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולקבל התחלתם ליצור אפליקציה משלכם לסיווג טקסט. אפשר להציג, להריץ ו עורכים את הקוד לדוגמה של מזהה האובייקטים באמצעות דפדפן האינטרנט בלבד.
אם אתם מיישם את גלאי האובייקטים עבור Raspberry Pi, יש לעיין דוגמה ל-Raspberry Pi app.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח פרויקטי קוד שמיועדים באופן ספציפי לשימוש ב-Object Detect. למידע כללי על להגדיר את סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסת הפלטפורמה. מדריך ההגדרה של Python
חבילות
למשימה 'זיהוי אובייקטים' נדרשת חבילת ה-Mediapipe Pip. אפשר להתקין את חבילות נדרשות עם הפקודות הבאות:
$ python -m pip install mediapipe
יבוא
כדי לגשת לפונקציות המשימה 'גלאי אובייקטים', מייבאים את המחלקות הבאות:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
דגם
למשימה 'מזהה אובייקטים של MediaPipe' נדרש מודל מאומן שתואם למשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של מזהה אובייקטים, ראו בסקירה הכללית על המשימה בקטע 'מודלים'.
בוחרים מודל ומורידים אותו, ולאחר מכן שומרים אותו בספרייה מקומית:
model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'
שימוש בפרמטר BaseOptions
של האובייקט model_asset_path
כדי לציין את הנתיב
של המודל לשימוש. בקטע הבא מופיע קוד לדוגמה.
יצירת המשימה
כדי ליצור את המשימה, צריך להשתמש בפונקציה create_from_options
.
הפונקציה create_from_options
מקבלת אפשרויות הגדרה כולל הרצה
מצב, שם תצוגה, לוקאל, מספר מקסימלי של תוצאות, סף מהימנות,
רשימת הקטגוריות המותרות ורשימת הישויות שנחסמו. אם לא תגדירו אפשרות הגדרה,
המשימה משתמשת בערך ברירת המחדל. למידע נוסף על אפשרויות הגדרה,
ראו אפשרויות הגדרה.
במשימה 'גלאי אובייקטים' יש תמיכה בכמה סוגים של נתוני קלט: תמונות סטילס, וידאו קבצים וסטרימינג בשידור חי. בחירת הכרטיסייה שתואמת לנתוני הקלט כדי לראות איך ליצור את המשימה ולהריץ מסקנות.
תמונה
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.IMAGE) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
וידאו
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.VIDEO) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
שידור חי
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions DetectionResult = mp.tasks.components.containers.detections.DetectionResult ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: DetectionResult, output_image: mp.Image, timestamp_ms: int): print('detection result: {}'.format(result)) options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, max_results=5, result_callback=print_result) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
לדוגמה מלאה ליצירת 'גלאי אובייקטים' לשימוש עם תמונה, ב- קוד לדוגמה.
אפשרויות תצורה
המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאפליקציות Python:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
running_mode |
מגדיר את מצב הריצה של המשימה. יש שלושה סוגים
מצבים: IMAGE: המצב לקלט של תמונה יחידה. סרטון: המצב של פריימים מפוענחים בסרטון. LIVE_STREAM: המצב לשידור חי של קלט נתונים ממצלמה, במצב הזה, resultListener חייב להיות נשלחה קריאה כדי להגדיר אוזן כדי לקבל תוצאות באופן אסינכרוני. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names |
מגדיר את השפה של תוויות שישמשו לשמות לתצוגה שסופקו
של מודל המשימה, אם יש כאלה. ברירת המחדל היא en עבור
אנגלית. אפשר להוסיף תוויות שמותאמות לשוק המקומי למטא-נתונים של מודל מותאם אישית
באמצעות TensorFlow Lite Metadata Writer API
|
קוד שפה | en |
max_results |
מגדיר את המספר המקסימלי האופציונלי של תוצאות זיהוי עם הדירוג הגבוה ביותר של החזרה. | מספרים חיוביים כלשהם | 1- (כל התוצאות מוחזרות) |
score_threshold |
הגדרת סף הציון של התחזית שמבטל את הסף שצוין ב את המטא-נתונים של המודל (אם יש). תוצאות מתחת לערך הזה נדחות. | כל מספר ממשי (float) | לא מוגדר |
category_allowlist |
מגדיר את הרשימה האופציונלית של שמות קטגוריות מותרות. אם השדה לא ריק,
תוצאות זיהוי ששם הקטגוריה שלהן אינו בקבוצה זו יהיו
מסונן. המערכת מתעלמת משמות קטגוריות כפולים או לא ידועים.
האפשרות הזו בלעדית למשתמשי category_denylist ומשתמשים
ושניהם יובילו לשגיאה. |
כל מחרוזת | לא מוגדר |
category_denylist |
מגדיר את הרשימה האופציונלית של שמות קטגוריות שאינם מותרים. אם המיקום
לא ריקות, תוצאות זיהוי ששם הקטגוריה שלהן נמצא בקבוצה זו יסוננו
החוצה. המערכת מתעלמת משמות קטגוריות כפולים או לא ידועים. האפשרות הזו מקבילה
בלעדי ל-category_allowlist ושימוש בשתי התוצאות עלול לגרום לשגיאה. |
כל מחרוזת | לא מוגדר |
הכנת נתונים
מכינים את הקלט כקובץ תמונה או כמערך נומרי,
ואז ממירים אותו לאובייקט 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)
הרצת המשימה
אפשר להפעיל את אחת מפונקציות הזיהוי כדי להפעיל הסקת מסקנות. האובייקט משימת המזהה תחזיר את האובייקטים שזוהו בתמונת הקלט או בפריים.
תמונה
# Perform object detection on the provided single image. detection_result = detector.detect(mp_image)
וידאו
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform object detection on the video frame. detection_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
שידור חי
# Send the latest frame to perform object detection. # Results are sent to the `result_callback` provided in the `ObjectDetectorOptions`. detector.detect_async(mp_image, frame_timestamp_ms)
לדוגמה מלאה להפעלת 'גלאי אובייקטים' על תמונה, ראו את המאמר דוגמה לקוד לפרטים.
שימו לב לנקודות הבאות:
- כשמפעילים את מצב וידאו או שידור חי, צריך גם מספקים את חותמת הזמן של מסגרת הקלט למשימה 'מזהה האובייקטים'.
- כשמפעילים את המשימה 'זיהוי אובייקטים' בתמונה או במודל הווידאו, לחסום את השרשור הנוכחי עד שיסיים לעבד את תמונת הקלט מסגרת.
- כשפועלים במצב שידור חי, המשימה 'זיהוי אובייקטים' לא חוסמת השרשור הנוכחי, אבל חוזר מיד. הוא יפעיל את התוצאה שלו המאזין עם תוצאת הזיהוי בכל פעם שהוא מסיים לעבד מסגרת הקלט. אם מתבצעת קריאה לפונקציית הזיהוי כשהמשימה 'גלאי אובייקטים' עמוס בעיבוד פריים אחר, המערכת תתעלם ממסגרת הקלט החדשה.
טיפול בתוצאות והצגתן
כשמריצים את ההסקה, המשימה 'גלאי אובייקטים' מחזירה
אובייקט ObjectDetectionResult
שמתאר את האובייקטים שהוא מצא בהם
של קובץ הקלט
בדוגמה הבאה אפשר לראות את נתוני הפלט מהמשימה:
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
בתמונה הזו אפשר לראות את פלט המשימה:
הקוד לדוגמה של 'מזהה אובייקטים' מדגים איך להציג את הזיהוי של התוצאות שהוחזרו מהמשימה, קוד לדוגמה לקבלת פרטים.