מדריך לזיהוי אובייקטים ב-Python

המשימה 'מזהה אובייקטים של 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

בתמונה הזו אפשר לראות את פלט המשימה:

הקוד לדוגמה של 'מזהה אובייקטים' מדגים איך להציג את הזיהוי של התוצאות שהוחזרו מהמשימה, קוד לדוגמה לקבלת פרטים.