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

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

קוד לדוגמה

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

הגדרה

בקטע הזה מתוארים שלבים עיקריים להגדרת סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש ב-Interactive Image Segmenter. למידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות 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'

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

base_options = BaseOptions(model_asset_path=model_path)

יצירת המשימה

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

BaseOptions = mp.tasks.BaseOptions
InteractiveSegmenter = mp.tasks.vision.InteractiveSegmenter
InteractiveSegmenterOptions = mp.tasks.vision.InteractiveSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = InteractiveSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_type=InteractiveSegmenterOptions.OutputType.CATEGORY_MASK)
with InteractiveSegmenter.create_from_options(options) as segmenter:
# segmenter is initialized and ready to use

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

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

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
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

הכנת הנתונים

מכינים את הקלט כקובץ תמונה או כמערך numpy, ואז ממירים אותו לאובייקט mediapipe.Image.

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

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

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

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

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

RegionOfInterest = vision.InteractiveSegmenterRegionOfInterest
# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
roi = RegionOfInterest(format=RegionOfInterest.Format.KEYPOINT,
                          keypoint=NormalizedKeypoint(x, y))
segmented_masks = segmenter.segment(mp_image, roi)

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

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

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

בקטעים הבאים מוסבר בפירוט על נתוני הפלט מהמשימה:

מסכה של קטגוריה

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

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

מסכת ביטחון

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