מדריך לסיווג תמונות ב-Python

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

המשימה 'מסווג תמונות' היא חבילת PIPP. אפשר להתקין את התלות בדרכים הבאות:

$ python -m pip install mediapipe

יבוא

מייבאים את המחלקות הבאות כדי לגשת לפונקציות המשימה 'מסווג תמונות':

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

מודל

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

בוחרים מודל ומורידים אותו, ולאחר מכן מאחסנים אותו בספרייה מקומית. אפשר להשתמש במודל OptimizeNet-Lite0 המומלץ.

model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'

מציינים את הנתיב של המודל בתוך הפרמטר של שם המודל, באופן הבא:

base_options = BaseOptions(model_asset_path=model_path)

יצירת המשימה

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

המשימה 'מסווג תמונות' תומכת ב-3 סוגים של נתוני קלט: תמונות סטילס, קובצי וידאו וסטרימינג של וידאו בשידור חי. בחרו את הכרטיסייה המתאימה לסוג נתוני הקלט כדי לראות איך ליצור את המשימה ולהסיק את ההסקה.

תמונה

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

וידאו

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

שידור חי

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageClassifierResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageClassifierResult result: {}'.format(result))

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

דוגמה מלאה ליצירת מסווג תמונות לשימוש עם תמונה, ראו דוגמה לקוד.

אפשרויות הגדרה

במשימה הזאת קיימות אפשרויות ההגדרה הבאות לאפליקציות Python:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
running_mode מגדיר את מצב הריצה של המשימה. יש שלושה מצבים:

IMAGE: המצב שבו ניתן להזין תמונה יחידה.

וידאו: המצב של פריימים מפוענחים של סרטון.

LIVE_STREAM: המצב עבור סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, יש להפעיל את resultListener כדי להגדיר מאזין לקבלת תוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale ההגדרה הזו מגדירה את השפה של התוויות שישמשו לשמות תצוגה שנמסרים במטא-נתונים של מודל המשימה, אם יש כאלה. ברירת המחדל היא en עבור אנגלית. אפשר להוסיף תוויות שהותאמו לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד הלוקאל en
max_results הפונקציה מגדירה את המספר המקסימלי האופציונלי של תוצאות מהסיווג הגבוה ביותר להחזרה. אם הערך קטן מ-0, יוחזרו כל התוצאות הזמינות. כל מספר חיובי -1
score_threshold השדה הזה מגדיר את סף הציון של החיזוי ששונה מהסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה יידחו. כל מספר ממשי (float) לא הוגדרה
category_allowlist מגדיר את הרשימה האופציונלית של שמות הקטגוריות המותרות. אם השדה לא ריק, תוצאות סיווג ששם הקטגוריה שלהן לא נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-category_denylist ומשתמשת בשתי התוצאות כשגיאה. כל מחרוזת לא הוגדרה
category_denylist מגדיר את הרשימה האופציונלית של שמות קטגוריות אסורים. אם התוצאות לא ריקות, תוצאות הסיווג ששם הקטגוריה שלהן נכלל בקבוצה הזו יסוננו. המערכת מתעלמת משמות כפולים או לא ידועים של קטגוריות. האפשרות הזו בלעדית ל-category_allowlist, והשימוש בשתי האפשרויות האלה גורם לשגיאה. כל מחרוזת לא הוגדרה
result_callback מגדיר לכך שמאזין התוצאות יקבל את תוצאות הסיווג באופן אסינכרוני כאשר מסווג התמונות נמצא במצב שידור חי. אפשר להשתמש רק כשמצב ריצה מוגדר ל-LIVE_STREAM לא רלוונטי לא הוגדרה

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך 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)
    

מריצים את המשימה.

אפשר לקרוא לפונקציה classify שתואם למצב הריצה שלכם כדי להפעיל הסקת מסקנות. ה-Image Classifier API יחזיר את הקטגוריות האפשריות לאובייקט בתוך תמונת הקלט או מסגרת הקלט.

תמונה

# Perform image classification on the provided single image.
classification_result = classifier.classify(mp_image)
    

וידאו

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image classification on the video frame.
classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
    

שידור חי


# Send the latest frame to perform image classification.
# Results are sent to the `result_callback` provided in the `ImageClassifierOptions`.
classifier.classify_async(mp_image, frame_timestamp_ms)
    

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

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

דוגמה מלאה ליצירת מסווג תמונות לשימוש עם תמונה, ראו דוגמה לקוד.

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

לאחר הרצה של מסקנות, המשימה 'מסווג תמונות' מחזירה אובייקט ImageClassifierResult שמכיל את רשימת הקטגוריות האפשריות לאובייקטים בתמונת הקלט או במסגרת הקלט.

דוגמה לנתוני הפלט מהמשימה הזאת:

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

התוצאה הזו הושגה על ידי הרצת Bird Classifier במכשיר:

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