המשימה 'חלוקת תמונות למקטעים' ב-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.