המשימה 'סיווג תמונות ב-MediaPipe' מאפשרת לבצע סיווג של תמונות. אפשר להשתמש במשימה הזו כדי לזהות את מה שתמונה מייצגת מתוך קבוצה של קטגוריות שהוגדרו בזמן האימון. בהוראות האלה מוסבר איך להשתמש ב-Image Classifier עם Python.
כדי לראות את המשימה הזו בפעולה, אפשר לצפות בהדגמה באינטרנט. למידע נוסף על היכולות, המודלים והאפשרויות להגדרה של המשימה הזו, קראו את הסקירה הכללית.
קוד לדוגמה
לידיעתכם, בקוד לדוגמה של Image Classifier יש הטמעה מלאה של המשימה הזו ב-Python. הקוד הזה יעזור לכם לבדוק את המשימה הזו ולהתחיל ליצור סיווג תמונות משלכם. אתם יכולים להציג, להריץ ולערוך את קוד הדוגמה של סיווג התמונות רק באמצעות דפדפן האינטרנט.
אם אתם מטמיעים את הסיווג של תמונות ב-Raspberry Pi, תוכלו לעיין באפליקציית הדוגמה ל-Raspberry Pi.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח ופרויקטי הקוד, במיוחד לשימוש ב-Image Classifier. מידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל דרישות לגרסאות הפלטפורמה, זמין במדריך ההגדרה ל-Python.
חבילות
המשימה 'סיווג תמונות' כוללת את חבילת ה-pip של mediapipe. אפשר להתקין את התלות באמצעות הפקודה הבאה:
$ 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, נדרש מודל מאומן שתואם למשימה הזו. מידע נוסף על המודלים המאומנים הזמינים ל-Image Classifier זמין בקטע 'מודלים' בסקירה הכללית של המשימה.
בוחרים מודל ומורידים אותו, ולאחר מכן שומרים אותו בספרייה מקומית. אפשר להשתמש במודל המומלץ EfficientNet-Lite0.
model_path = '/absolute/path/to/efficientnet_lite0_int8_2.tflite'
מציינים את הנתיב של המודל בפרמטר Model Name (שם המודל), כפי שמתואר בהמשך:
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: המצב להזנת תמונה אחת. VIDEO: המצב של פריימים מפוענחים של סרטון. LIVE_STREAM: המצב של סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, צריך להפעיל את resultListener כדי להגדיר מאזין שיקבל את התוצאות באופן אסינכרוני. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names_locale |
הגדרת השפה של התוויות לשימוש בשמות התצוגה שסופקו במטא-נתונים של מודל המשימה, אם הם זמינים. ברירת המחדל היא en לאנגלית. אפשר להוסיף תוויות מותאמות לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API |
קוד לוקאל | en |
max_results |
הגדרת המספר המקסימלי האופציונלי של תוצאות הסיווג עם הדירוג הגבוה ביותר שיוחזר. אם הערך < 0, כל התוצאות הזמינות יחזרו. | מספרים חיוביים | -1 |
score_threshold |
הגדרת הסף של ציון התחזית, שמבטל את הסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה נדחות. | כל ערך צף | לא מוגדר |
category_allowlist |
הגדרת רשימה אופציונלית של שמות קטגוריות מותרים. אם הערך לא ריק, תוצאות הסיווג ששם הקטגוריה שלהן לא נמצא בקבוצה הזו יוחרגו מהסינון. המערכת מתעלמת משמות קטגוריות כפולים או לא מוכרים.
האפשרות הזו לא תואמת לאפשרות category_denylist , ושימוש בשתיהן גורם לשגיאה. |
מחרוזות כלשהן | לא מוגדר |
category_denylist |
הגדרת רשימה אופציונלית של שמות קטגוריות אסורים. אם הערך לא ריק, תוצאות הסיווג ששם הקטגוריה שלהן נמצא בקבוצה הזו יוסר. המערכת מתעלמת משמות קטגוריות כפולים או לא מוכרים. האפשרות הזו לא תואמת לאפשרות category_allowlist , ושימוש בשתיהן גורם לשגיאה. |
מחרוזות כלשהן | לא מוגדר |
result_callback |
מגדיר את מאזין התוצאות לקבל את תוצאות הסיווג באופן אסינכרוני כש-Image Classifier נמצא במצב של שידור חי. אפשר להשתמש בה רק כשמצב ההפעלה מוגדר כ-LIVE_STREAM |
לא רלוונטי | לא מוגדר |
הכנת הנתונים
מכינים את הקלט כקובץ תמונה או כמערך numpy, ואז ממירים אותו לאובייקט 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)
הרצת המשימה
כדי להפעיל את ההסקות, אפשר לקרוא לפונקציית הסיווג שמתאימה למצב שבו הקוד פועל. ממשק 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)
שימו לב לנקודות הבאות:
- כשמריצים את הקוד במצב וידאו או במצב של שידור חי, צריך גם לספק למשימות של Image Classifier את חותמת הזמן של פריים הקלט.
- כשהיא פועלת במודל התמונה או בסרטון, המשימה 'סיווג תמונות' תמנע את המשך הפעילות של השרשור הנוכחי עד שהיא תסיים לעבד את התמונה או את הפריים של הקלט.
- כשהיא פועלת במצב של שידור חי, המשימה של סיווג התמונות לא חוסמת את השרשור הנוכחי אלא חוזרת מיד. הוא יפעיל את מאזין התוצאות שלו עם תוצאת הסיווג בכל פעם שהוא יסיים לעבד מסגרת קלט. אם הפונקציה
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:
בקוד לדוגמה של Image Classifier מוסבר איך להציג את תוצאות הסיווג שהוחזרו מהמשימה. פרטים נוספים זמינים בקוד לדוגמה.