המשימה 'הטמעת תמונות MediaPipe' מאפשרת להמיר נתוני תמונות לייצוג מספרי, כדי לבצע משימות של עיבוד תמונות שקשורות ל-ML, כמו השוואת הדמיון בין שתי תמונות. בהוראות האלה מוסבר איך להשתמש ב-Image הטמעה עם Python.
למידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו, קראו את הסקירה הכללית.
קוד לדוגמה
הקוד לדוגמה של Image Implementder מספק הטמעה מלאה של המשימה הזו ב-Python לעיונך. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולהתחיל ליצור כלי להטמעת תמונות. ב-Google Colab תוכלו להציג, להריץ ולערוך את הקוד לדוגמה של Image Implementder, באמצעות דפדפן האינטרנט בלבד. תוכלו לראות את קוד המקור של הדוגמה הזו ב-GitHub.
הגדרה
בקטע הזה מתוארים שלבים עיקריים להגדרת סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש בכלי Image הטמעה. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות 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.
בוחרים מודל ומורידים אותו, ולאחר מכן מאחסנים אותו בספרייה מקומית. אתם יכולים להשתמש במודל 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: המצב שבו ניתן להזין תמונה יחידה. וידאו: המצב של פריימים מפוענחים של סרטון. LIVE_STREAM: המצב עבור סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, יש להפעיל את resultListener כדי להגדיר מאזין לקבלת תוצאות באופן אסינכרוני. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
האם לנרמל את וקטור התכונה שמוחזר עם נורמת L2. יש להשתמש באפשרות הזו רק אם המודל עדיין לא מכיל L2_NORMALIZATION TFLite Op. . ברוב המקרים, זה כבר המצב, וכתוצאה מכך מתקבל מסקנות של TFLite, ללא צורך באפשרות הזו. | Boolean |
False |
quantize |
האם יש לכמת את ההטמעה שמוחזרת לבייטים באמצעות קוונטיזציה סקלרית. ההנחה היא שההטמעות הן נורמת יחידה, ולכן לכל מאפיין מובטח שיהיה ערך [ -1.0, 1.0]. אם זה לא המצב, מומלץ להשתמש באפשרות l2_Normalize. | Boolean |
False |
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)
מריצים את המשימה.
אתם יכולים לקרוא לפונקציית ההטמעה שתואמת למצב הריצה כדי להפעיל מסקנות. ה-Image Implementder API יחזיר את הווקטורים של ההטמעה לתמונת הקלט או למסגרת.
תמונה
# 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)
שימו לב לנקודות הבאות:
- כשמפעילים את התכונה במצב וידאו או בשידור חי, צריך גם לספק למשימת הטמעת התמונות את חותמת הזמן של מסגרת הקלט.
- כשמפעילים את המשימה בתמונה או במודל הסרטון, המשימה הטמעה של תמונות תחסום את ה-thread הנוכחי עד לסיום העיבוד של התמונה או הפריים שהזנתם.
- כשמפעילים את המשימה במצב שידור חי, המשימה 'הטמעת תמונות' לא חוסמת את השרשור הנוכחי, אלא מוחזרת מיד. הוא יפעיל את מאזין התוצאות עם תוצאת ההטמעה בכל פעם שהוא יסיים לעבד פריים של קלט. אם מתבצעת קריאה לפונקציה
embedAsync
כשהמשימה של הטמעת התמונות עסוקה בעיבוד פריים אחר, המשימה מתעלמת ממסגרת הקלט החדשה.
טיפול בתוצאות והצגתן
לאחר ההסקה, המשימה של הטמעת תמונות מחזירה אובייקט 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])