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

המשימה 'מזהה אובייקטים של MediaPipe' מאפשרת לכם לזהות את הנוכחות ואת המיקום של מספר סיווגים של אובייקטים. בהוראות האלה מוסבר איך להשתמש במשימה 'מזהה אובייקטים' ב-Python. דוגמת הקוד שמתוארת בהוראות האלו זמינה ב-GitHub.

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

קוד לדוגמה

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

אם אתם מטמיעים את גלאי האובייקטים עבור Raspberry Pi, קראו את האפליקציה לדוגמה של Raspberry Pi.

הגדרה

בקטע הזה מתוארים שלבים עיקריים להגדרת סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש ב-Object Detector. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות MediaPipe, כולל הדרישות לגרסת הפלטפורמה, קראו את מדריך ההגדרה של Python.

חבילות

המשימה 'מזהה אובייקטים' מחייבת את חבילת PIPP של Mediapipe. תוכלו להתקין את החבילות הנדרשות באמצעות הפקודות הבאות:

$ 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'

השתמשו בפרמטר model_asset_path של האובייקט BaseOptions כדי לציין את הנתיב של המודל שבו יש להשתמש. דוגמה לקוד זמינה בקטע הבא.

יצירת המשימה

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

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך numpy, ואז ממירים אותו לאובייקט mediapipe.Image. אם הקלט הוא קובץ וידאו או שידור חי ממצלמת אינטרנט, תוכלו להשתמש בספרייה חיצונית כמו OpenCV כדי לטעון את הפריימים של הקלט כמערכים מספריים.

הדוגמאות הבאות מסבירות ומראות איך להכין את הנתונים לעיבוד כל אחד מסוגי הנתונים הזמינים:

תמונה

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)
    

לדוגמה מלאה של הפעלת גלאי אובייקטים על תמונה, קראו פרטים בדוגמה לקוד.

שימו לב לנקודות הבאות:

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

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

לאחר הרצה של מסקנות, המשימה 'מזהה אובייקטים' מחזירה אובייקט 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

התמונה הבאה מציגה המחשה של פלט המשימה:

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