המשימה 'הטמעת תמונות ב-MediaPipe' מאפשרת לכם להמיר נתוני תמונות לייצוג מספרי כדי לבצע משימות עיבוד תמונה שקשורות ל-ML, כמו השוואת הדמיון בין שתי תמונות. בהוראות הבאות מוסבר איך להשתמש ב-Image Embedder עם Python.
מידע נוסף על היכולות, המודלים והאפשרויות להגדרה של המשימה הזו זמין בסקירה הכללית.
קוד לדוגמה
הקוד לדוגמה של Image Embedder מספק הטמעה מלאה של המשימה הזו ב-Python. הקוד הזה יעזור לכם לבדוק את המשימה הזו ולהתחיל ליצור כלי להטמעת תמונות משלכם. אתם יכולים להציג, להריץ ולערוך את קוד הדוגמה של Image Embedder באמצעות דפדפן האינטרנט שלכם עם Google Colab. אפשר לראות את קוד המקור של הדוגמה הזו ב-GitHub.
הגדרה
בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח ופרויקטי הקוד, במיוחד לשימוש ב-Image Embedder. מידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל דרישות לגרסאות הפלטפורמה, זמין במדריך ההגדרה ל-Python.
חבילות
המשימה Image Embedder מפעילה את חבילת ה-pip של mediapipe. אפשר להתקין את התלות באמצעות הפקודה הבאה:
$ python -m pip install mediapipe
יבוא
כדי לגשת לפונקציות של המשימה Image Embedder, מייבאים את הכיתות הבאות:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
דגם
כדי לבצע את המשימה 'הטמעת תמונות ב-MediaPipe', נדרש מודל מאומן שתואם למשימה הזו. מידע נוסף על המודלים המאומנים הזמינים ל-Image Embedder זמין בקטע 'מודלים' בסקירה הכללית של המשימה.
בוחרים מודל ומורידים אותו, ולאחר מכן שומרים אותו בספרייה מקומית. אפשר להשתמש במודל המומלץ MobileNetV3.
model_path = '/absolute/path/to/mobilenet_v3_small_075_224_embedder.tflite'
מציינים את הנתיב של המודל בפרמטר model_asset_path
, כפי שמתואר בהמשך:
base_options = BaseOptions(model_asset_path=model_path)
יצירת המשימה
אפשר להשתמש בפונקציה create_from_options
כדי ליצור את המשימה. הפונקציה create_from_options
מקבלת אפשרויות תצורה להגדרת האפשרויות של המטמיע. מידע נוסף על אפשרויות ההגדרה זמין במאמר סקירה כללית על הגדרות.
המשימה 'הטמעת תמונות' תומכת ב-3 סוגי נתוני קלט: תמונות סטילס, קובצי וידאו ושידור וידאו בשידור חי. בוחרים את הכרטיסייה שמתאימה לסוג נתוני הקלט כדי לראות איך יוצרים את המשימה ומריצים את ההסקה.
תמונה
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), quantize=True, running_mode=VisionRunningMode.IMAGE) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
וידאו
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), quantize=True, running_mode=VisionRunningMode.VIDEO) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
שידור חי
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ImageEmbedderResult = mp.tasks.vision.ImageEmbedder.ImageEmbedderResult ImageEmbedder = mp.tasks.vision.ImageEmbedder ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: ImageEmbedderResult, output_image: mp.Image, timestamp_ms: int): print('ImageEmbedderResult result: {}'.format(result)) options = ImageEmbedderOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, quantize=True, result_callback=print_result) with ImageEmbedder.create_from_options(options) as embedder: # The embedder is initialized. Use it here. # ...
אפשרויות הגדרה
למשימה הזו יש את אפשרויות התצורה הבאות לאפליקציות Python:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
running_mode |
הגדרת מצב ההפעלה של המשימה. יש שלושה מצבים: IMAGE: המצב להזנת תמונה אחת. VIDEO: המצב של פריימים מפוענחים של סרטון. LIVE_STREAM: המצב של סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, צריך להפעיל את resultListener כדי להגדיר מאזין שיקבל את התוצאות באופן אסינכרוני. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
האם לבצע נורמליזציה של וקטור המאפיינים המוחזר באמצעות נורמלי L2. משתמשים באפשרות הזו רק אם המודל כבר לא מכיל אופרטור L2_NORMALIZATION מקורי של TFLite. ברוב המקרים, המצב הזה כבר קיים, ולכן נורמליזציה של L2 מתבצעת באמצעות היסק של TFLite ללא צורך באפשרות הזו. | Boolean |
False |
quantize |
האם להצפין את הטמעת הנתונים שחוזרת לבייטים באמצעות קידוד סקלר. ההנחה לגבי הטמעות היא שהן נורמליות ליחידה, ולכן לכל מאפיין מובטח ערך בטווח [-1.0, 1.0]. אם זה לא המצב, צריך להשתמש באפשרות l2_normalize. | Boolean |
False |
result_callback |
מגדיר את מאזין התוצאות לקבל את תוצאות ההטמעה באופן אסינכרוני כשהכלי להטמעת תמונות נמצא במצב של שידור חי. אפשר להשתמש בה רק כשמצב ההפעלה מוגדר כ-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)
הרצת המשימה
כדי להפעיל את ההסקות, אפשר לקרוא לפונקציית ההטמעה שמתאימה למצב שבו הקוד פועל. ממשק ה-API של Image Embedder יחזיר את וקטורי ההטמעה של התמונה או המסגרת של הקלט.
תמונה
# Perform image embedding on the provided single image. embedding_result = embedder.embed(mp_image)
וידאו
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform image embedding on the video frame. embedding_result = embedder.embed_for_video(mp_image, frame_timestamp_ms)
שידור חי
# Send the latest frame to perform image embedding. # Results are sent to the `result_callback` provided in the `ImageEmbedderOptions`. embedder.embed_async(mp_image, frame_timestamp_ms)
שימו לב לנקודות הבאות:
- כשמריצים את הקוד במצב וידאו או במצב של שידור חי, צריך גם לספק למשימות של הטמעת התמונות את חותמת הזמן של פריים הקלט.
- כשהיא פועלת במודל התמונה או בסרטון, המשימה Image Embedder תמנע את הרצת השרשור הנוכחי עד שיסתיים עיבוד התמונה או הפריים של הקלט.
- כשהיא פועלת במצב של שידור חי, המשימה 'הטמעת תמונות' לא חוסמת את השרשור הנוכחי אלא חוזרת מיד. הוא יפעיל את מאזין התוצאות שלו עם תוצאת ההטמעה בכל פעם שהוא יסיים לעבד פריים קלט. אם הפונקציה
embedAsync
נקראת כשהמשימה של הטמעת התמונה עסוקה בעיבוד של פריים אחר, המשימה תתעלם מפריים הקלט החדש.
טיפול בתוצאות והצגתן
לאחר הפעלת ההסקה, המשימה Image Embedder מחזירה אובייקט ImageEmbedderResult
שמכיל את רשימת הקטגוריות האפשריות לאובייקטים בתוך התמונה או המסגרת של הקלט.
בהמשך מוצגת דוגמה לנתוני הפלט של המשימה הזו:
ImageEmbedderResult:
Embedding #0 (sole embedding head):
float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
head_index: 0
התוצאה הזו התקבלה על ידי הטמעת התמונה הבאה:
אפשר להשוות את הדמיון בין שני הטמעות באמצעות הפונקציה ImageEmbedder.cosine_similarity
. דוגמה לקוד:
# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
embedding_result.embeddings[0],
other_embedding_result.embeddings[0])