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

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

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

קוד לדוגמה

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

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

הגדרה

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

חבילות

המשימה של מסווג התמונות היא חבילת ה-Mediapipe Pip. אפשר להתקין את יחסי התלות עם:

$ python -m pip install mediapipe
``` ### Imports

Import the following classes to access the Image Classifier task functions:

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

דגם

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

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

הכנת נתונים

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

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

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

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