מדריך לפילוח תמונות ב-Python

המשימה 'פלח התמונות של MediaPipe' מאפשרת לחלק תמונות לאזורים על סמך קטגוריות מוגדרות מראש, ולהשתמש באפקטים חזותיים כמו טשטוש רקע. בהוראות האלה מוסבר איך להשתמש במקטע התמונות בשפת Python. למידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו, קראו את הסקירה הכללית.

קוד לדוגמה

הקוד לדוגמה של פילוח התמונות מספק הטמעה מלאה של המשימה הזו ב-Python לעיונכם. הקוד הזה עוזר לכם לבדוק את המשימה הזו ולהתחיל ליצור אפליקציה משלכם לפלח תמונות. ניתן להציג, להריץ ולערוך את קוד הדוגמה של פלח התמונות באמצעות דפדפן האינטרנט.

הגדרה

בקטע זה מתוארים שלבים עיקריים להגדרת סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש ב'פלח התמונות'. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות MediaPipe, כולל הדרישות לגרסת הפלטפורמה, קראו את מדריך ההגדרה של Python. תוכלו לבדוק את קוד המקור של הדוגמה הזו ב-GitHub

חבילות

המשימה 'פלח תמונות MediaPipe' מחייבת את החבילה mediapipe. אפשר להתקין את יחסי התלות הנדרשים באמצעות הפקודה הבאה:

$ python -m pip install mediapipe

יבוא

מייבאים את המחלקות הבאות כדי לגשת לפונקציות המשימה של פילוח התמונות:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

מודל

כדי לבצע את המשימה 'פלח התמונות של MediaPipe' נדרש מודל מאומן שתואם למשימה הזו. למידע נוסף על המודלים הזמינים המיומן לפילוח תמונות, עיינו בקטע מודלים לסקירה כללית של המשימות.

בוחרים ומורידים את המודל, ולאחר מכן מאחסנים אותו בספריית הפרויקט:

model_path = '/absolute/path/to/model.tflite'

מציינים את הנתיב של המודל בתוך הפרמטר של שם המודל, באופן הבא:

base_options = BaseOptions(model_asset_path=model_path)

יצירת המשימה

המשימה 'פלח התמונות של MediaPipe' משתמשת בפונקציה create_from_options כדי להגדיר את המשימה. הפונקציה create_from_options מקבלת ערכים לאפשרויות של הגדרות אישיות. למידע נוסף על הגדרת המשימות, קראו את המאמר אפשרויות ההגדרה.

בדוגמאות האלה אפשר לראות גם את הווריאציות של יצירת המשימה לתמונות, לקובצי וידאו ולסטרימינג בשידור חי.

תמונה

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

וידאו

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

שידור חי

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

אפשרויות הגדרה

במשימה הזאת קיימות אפשרויות ההגדרה הבאות לאפליקציות Python:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
running_mode מגדיר את מצב הריצה של המשימה. יש שלושה מצבים:

IMAGE: המצב שבו ניתן להזין תמונה יחידה.

וידאו: המצב של פריימים מפוענחים של סרטון.

LIVE_STREAM: המצב עבור סטרימינג בשידור חי של נתוני קלט, למשל ממצלמה. במצב הזה, יש להפעיל את resultListener כדי להגדיר מאזין לקבלת תוצאות באופן אסינכרוני.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask אם המדיניות מוגדרת כ-True, הפלט כולל מסכת פילוח כתמונה של Uint8, וכל ערך של פיקסל מציין את ערך הקטגוריה המנצחת. {True, False} False
output_confidence_masks אם היא מוגדרת כ-True, הפלט כולל מסכת פילוח כתמונה של ערך צף, שבה כל ערך צף מייצג את מפת ציון המהימנות של הקטגוריה. {True, False} True
display_names_locale ההגדרה הזו מגדירה את השפה של התוויות שישמשו לשמות תצוגה שנמסרים במטא-נתונים של מודל המשימה, אם יש כאלה. ברירת המחדל היא en עבור אנגלית. אפשר להוסיף תוויות שהותאמו לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד הלוקאל en
result_callback מגדיר את הכלי להאזנה לתוצאות כך שיקבל את תוצאות הפילוח באופן אסינכרוני כאשר מפלח התמונות נמצא במצב שידור חי. אפשר להשתמש רק כשמצב ריצה מוגדר ל-LIVE_STREAM לא רלוונטי לא רלוונטי

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך numpy, ואז ממירים אותו לאובייקט mediapipe.Image. אם הקלט הוא קובץ וידאו או שידור חי ממצלמת אינטרנט, תוכלו להשתמש בספרייה חיצונית כמו OpenCV כדי לטעון את הפריימים של הקלט כמערכים מספריים.

תמונה

# 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)
    

וידאו

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate 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)
    

שידור חי

# 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)
    

בדוגמה לקוד, תוכלו לראות קוד לדוגמה שממחיש הכנת נתונים עבור 'פלח התמונות'.

מריצים את המשימה.

פלח התמונות משתמש בפונקציות segment, segment_for_video ו-segment_async כדי להפעיל מסקנות. בפילוח תמונות, התהליך כולל עיבוד מראש של נתוני קלט, הפעלת מודל פילוח ולאחר עיבוד הפלט של המודל הגולמי במסיכות המפולחות.

הדוגמאות הבאות מראות איך להפעיל עיבוד באמצעות מודל המשימה.

תמונה

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

וידאו

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

שידור חי

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

שימו לב לנקודות הבאות:

  • כשמפעילים את פילוח התמונות במצב וידאו או במצב שידור חי, צריך גם לציין את חותמת הזמן של מסגרת הקלט למשימת פילוח התמונות.
  • כשמפעילים את הפונקציה 'פלח של תמונות' בתמונה או במודל של סרטון, היא תחסום את השרשור הנוכחי עד לסיום העיבוד של תמונת הקלט או הפריים.

לדוגמה מלאה יותר להרצת ההשערות של פלחי התמונות, עיינו בקוד לדוגמה.

טיפול בתוצאות והצגתן

פילוח התמונות מפיק רשימה של נתונים מסוג Image. אם הערך של output_type הוא CATEGORY_MASK, הפלט הוא רשימה שמכילה מסכה עם פילוח יחיד כתמונת Uint8. הפיקסל מציין את אינדקס הקטגוריה המזוהה של תמונת הקלט. אם output_type הוא CONFIDENCE_MASK, הפלט הוא וקטור עם גודל של מספר קטגוריה. כל מסכה מפולחת היא תמונה צפה בטווח [0,1], שמייצגת את רמת המהימנות של הפיקסל השייך לקטגוריה.

בקטעים הבאים מוצגות דוגמאות של נתוני הפלט מהמשימה הזו:

מהימנות הקטגוריה

בתמונות הבאות אפשר לראות המחשה חזותית של פלט המשימה של מסכת ביטחון של קטגוריה. הפלט של מסכת הביטחון מכיל ערכים צפים בין [0, 1].

פלט מסכת המהימנות של התמונה והקטגוריה המקורית. תמונת המקור ממערך הנתונים של Pascal VOC 2012.

ערך קטגוריה

בתמונות הבאות אפשר לראות המחשה חזותית של פלט המשימה של מסכת ערכים של קטגוריה. הטווח של מסכות הקטגוריה הוא [0, 255], וכל ערך של פיקסל מייצג את אינדקס הקטגוריה הזוכה של פלט המודל. אינדקס הקטגוריות הזוכה הוא בעל הניקוד הגבוה ביותר מבין הקטגוריות שהמודל יכול לזהות.

פלט התמונה המקורית של המסכה והקטגוריה. תמונת המקור ממערך הנתונים של Pascal VOC 2012.