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

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

קוד לדוגמה

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

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

להורדת הקוד

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

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

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

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

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

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

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

הגדרה

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

יחסי תלות

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

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

דגם

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

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

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

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

במקטע התמונות האינטראקטיבי example code, המודל מוגדר ב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);

לדוגמה מפורטת יותר של הגדרת המשימה הזו אפשר למצוא InteractiveSegmenterHelper מחלקה setupInteractiveSegmenter().

אפשרויות תצורה

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

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

הכנת נתונים

פילוח התמונות האינטראקטיבי עובד עם תמונות, והמשימה מטפלת בקלט הנתונים לפני עיבוד, כולל שינוי גודל, סיבוב ונירמול ערכים. צריך להמיר את תמונת הקלט אובייקט 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();
RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

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

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

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

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

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

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

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

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

מסכת ביטחון

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