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

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

קוד לדוגמה

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

הגדרה

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

חבילות

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

$ python -m pip install mediapipe

יבוא

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

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

דגם

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

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

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

מציינים את הנתיב של המודל בפרמטר Model Name (שם המודל), כפי שמתואר בהמשך:

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: המצב להזנת תמונה אחת.

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

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. אפשר להשתמש בה רק כשמצב ההפעלה מוגדר כ-LIVE_STREAM לא רלוונטי לא רלוונטי

הכנת הנתונים

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

תמונה

# 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, הפלט הוא וקטור בגודל מספר הקטגוריה. כל מסכה מחולקת לפלחים היא תמונה מסוג float בטווח [0,1], שמייצגת את ציון האמון של הפיקסל ששייך לקטגוריה.

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

רמת הסמך של הקטגוריה

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

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

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

ערך הקטגוריה

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

שתי ילדות שרוכבות על סוס וילדה אחת הולכת לצד הסוס מסכת התמונה שמציגה את קווי המתאר של הילדות והסוס מהתמונה הקודמת. הצורה של שלוש הבנות והסוס מטושטשת בצורה מדויקת

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