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

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

קוד לדוגמה

דוגמת הקוד של MediaPipe Tasks היא הטמעה פשוטה של אפליקציה לחלוקת תמונות אינטראקטיביות לקטעים ל-Android. הדוגמה פועלת עם תמונות שנבחרו מהגלריה במכשיר.

אפשר להשתמש באפליקציה כנקודת התחלה לאפליקציית Android משלכם, או להיעזר בה כשמשנים אפליקציה קיימת. קוד הדוגמה של הכלי לחלוקת תמונות אינטראקטיביות מתארח ב-GitHub.

מורידים את הקוד

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

כדי להוריד את הקוד לדוגמה:

  1. משכפלים את מאגר git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. אפשר גם להגדיר את מכונה של git כך שתשתמש ב-sparse checkout, כך שיישארו רק הקבצים של אפליקציית הדוגמה Interactive Image Segmenter:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

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

רכיבים מרכזיים

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

  • InteractiveSegmentationHelper.kt – הפונקציה הזו מפעילה את המשימה 'חלוקת תמונות למקטעים אינטראקטיביים' ומטפלת בבחירת המודל ובבחירת הנציג.
  • OverlayView.kt – טיפול בתוצאות הפילוח ועיצוב שלהן.

הגדרה

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

יחסי תלות

הספרייה com.google.mediapipe:tasks-vision משמשת את הכלי Interactive Image Segmenter. מוסיפים את התלות הזו לקובץ build.gradle של פרויקט הפיתוח של אפליקציית Android. מייבאים את יחסי התלות הנדרשים באמצעות הקוד הבא:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

דגם

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

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

<dev-project-root>/src/main/assets

משתמשים ב-method‏ BaseOptions.Builder.setModelAssetPath() כדי לציין את הנתיב שבו המודל משתמש. השיטה הזו מוצגת בדוגמת הקוד בקטע הבא.

בקוד לדוגמה של הכלי לחלוקת תמונות אינטראקטיבית, המודל מוגדר במחלקה InteractiveSegmenterHelper.kt בפונקציה setupInteractiveSegmenter().

יצירת המשימה

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

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener(exception -> {
         // Process the segmentation errors here.
    })    
    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

דוגמה מפורטת יותר להגדרת המשימה הזו מופיעה בפונקציה setupInteractiveSegmenter() של הכיתה InteractiveSegmenterHelper.

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

למשימה הזו יש את אפשרויות התצורה הבאות לאפליקציות ל-Android:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
outputCategoryMask אם הערך מוגדר כ-True, הפלט כולל מסכת פילוח כתמונה מסוג uint8, שבה כל ערך פיקסל מציין אם הפיקסל הוא חלק מהאובייקט שנמצא באזור העניין. {True, False} False
outputConfidenceMasks אם הערך מוגדר כ-True, הפלט כולל מסכת פילוח בתור תמונה של ערך צף, כאשר כל ערך צף מייצג את רמת האמון שהפיקסל הוא חלק מהאובייקט שנמצא באזור העניין. {True, False} True
displayNamesLocale הגדרת השפה של התוויות לשימוש בשמות התצוגה שסופקו במטא-נתונים של מודל המשימה, אם הם זמינים. ברירת המחדל היא en לאנגלית. אפשר להוסיף תוויות מותאמות לשוק המקומי למטא-נתונים של מודל מותאם אישית באמצעות TensorFlow Lite Metadata Writer API קוד לוקאל en
errorListener הגדרת מאזין אופציונלי לשגיאות. לא רלוונטי לא מוגדר

הכנת הנתונים

הכלי Interactive Image Segmenter פועל עם תמונות, והמשימה מטפלת בעיבוד הנתונים של קלט הנתונים, כולל שינוי הגודל, סיבוב ונירמול הערכים. צריך להמיר את קובץ התמונה של הקלט לאובייקט com.google.mediapipe.framework.image.MPImage לפני שמעבירים אותו למשימה.

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage mpImage = new BitmapImageBuilder(bitmap).build();

בקוד לדוגמה של הכלי לפילוח תמונות אינטראקטיבי, הכנת הנתונים מתבצעת בכיתה InteractiveSegmenterHelper באמצעות הפונקציה segment().

הרצת המשימה

קוראים לפונקציה segment כדי להריץ את החיזוי וליצור פלחים. המשימה 'פילוח תמונות אינטראקטיבי' מחזירה את אזורי הפלחים שזוהו בתוך תמונה הקלט.

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

בקוד לדוגמה של הכלי לחלוקת תמונות אינטראקטיבית, הפונקציות segment מוגדרות בקובץ InteractiveSegmenterHelper.kt.

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

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

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

מסכת קטגוריה

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

כלב שעומד בתוך ערימה של עלים קווי המתאר של הכלב מהתמונה הקודמת

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

מסכת ביטחון

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