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

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

קוד לדוגמה

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

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

הורדת הקוד

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

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

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, אפשר להגדיר את מכונת ה-Git לשימוש בקופה עם נתונים ספורים, כדי שיהיו לכם רק את הקבצים של האפליקציה לדוגמה של 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. במדריך ההגדרה ל-Android תוכלו לקרוא מידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסת הפלטפורמה.

יחסי תלות

הכלי 'פלח תמונות אינטראקטיבי' משתמש בספרייה com.google.mediapipe:tasks-vision. מוסיפים את התלות הזאת לקובץ 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((result, inputImage) -> {
         // 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 user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image 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.

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

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

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

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

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

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

מסכת ביטחון

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