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

הכנת נתונים

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

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

ודאות הקטגוריה

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

פלט של מסכת מהימנות לתמונה ולקטגוריה. תמונת המקור מ- פסקל VOC 2012 של הכיתובים.

ערך הקטגוריה

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

פלט של התממה של התמונה והקטגוריה המקורית. תמונת המקור מ- פסקל VOC 2012 של הכיתובים.