מדריך להטמעת תמונות ב-Python

המשימה 'הטמעת תמונות 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])