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