คู่มือการแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟสำหรับ Android

งานตัวแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟของ MediaPipe จะรับตำแหน่งในรูปภาพ ประมาณขอบเขตของออบเจ็กต์ในตำแหน่งนั้น และแสดงผลการแบ่งกลุ่มสำหรับออบเจ็กต์เป็นข้อมูลรูปภาพ วิธีการเหล่านี้แสดงวิธีใช้เครื่องมือแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟกับแอป Android ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม

ตัวอย่างโค้ด

ตัวอย่างโค้ด MediaPipe Tasks คือการใช้งานแอปแยกส่วนรูปภาพแบบอินเทอร์แอกทีฟสําหรับ Android ตัวอย่างนี้ใช้ได้กับรูปภาพที่เลือกจากแกลเลอรีของอุปกรณ์

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป Android ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างเครื่องมือแบ่งส่วนรูปภาพแบบอินเทอร์แอกทีฟโฮสต์อยู่ใน GitHub

ดาวน์โหลดรหัส

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คําสั่งต่อไปนี้
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. คุณอาจกำหนดค่าอินสแตนซ์ 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() เพื่อระบุเส้นทางที่โมเดลใช้ วิธีการนี้จะแสดงในตัวอย่างโค้ดในส่วนถัดไป

ในเครื่องมือแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟ โค้ดตัวอย่าง ระบบจะกำหนดรูปแบบในคลาส 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 ตั้งค่าโปรแกรมรับฟังข้อผิดพลาด (ไม่บังคับ) ไม่มี ไม่ได้ตั้งค่า

เตรียมข้อมูล

เครื่องมือแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟจะทำงานกับรูปภาพ และงานจะจัดการกับอินพุตข้อมูล รวมถึงการประมวลผลข้อมูลเบื้องต้น ซึ่งรวมถึงการปรับขนาด การหมุน และการปรับค่าให้เป็นมาตรฐาน คุณต้องแปลงรูปภาพอินพุตให้เป็นออบเจ็กต์ 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

จัดการและแสดงผลลัพธ์

เมื่อทำการอนุมาน งานที่แยกส่วนรูปภาพแบบอินเทอร์แอกทีฟจะแสดงผลลัพธ์เป็นออบเจ็กต์ ImageSegmenterResult ซึ่งมีผลลัพธ์ของงานแยกส่วน เนื้อหาของเอาต์พุตอาจมีมาสก์หมวดหมู่ มาสก์ความเชื่อมั่น หรือทั้ง 2 อย่าง ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณตั้งค่าเมื่อกําหนดค่างาน

ส่วนต่อไปนี้จะอธิบายข้อมูลเอาต์พุตจากงานนี้เพิ่มเติม

มาสก์หมวดหมู่

รูปภาพต่อไปนี้แสดงภาพแสดงผลของเอาต์พุตงานสำหรับมาสก์หมวดหมู่และค่าพร้อมระบุจุดที่น่าสนใจ พิกเซลแต่ละพิกเซลคือuint8ค่าที่ระบุว่าพิกเซลเป็นส่วนหนึ่งของวัตถุที่อยู่ในบริเวณที่น่าสนใจหรือไม่ วงกลมสีดําและขาวในรูปภาพที่สองระบุพื้นที่ความสนใจที่เลือก

สุนัขยืนอยู่ท่ามกลางกองใบไม้ รูปร่างของสุนัขที่วาดเส้นขอบจากรูปภาพก่อนหน้า

เอาต์พุตมาสก์รูปภาพและหมวดหมู่ต้นฉบับ รูปภาพต้นทางจากชุดข้อมูล Pascal VOC 2012

มาสก์ความเชื่อมั่น

เอาต์พุตสำหรับหน้ากากความเชื่อมั่นมีค่าเป็นทศนิยมระหว่าง [0, 1] สำหรับแชแนลอินพุตรูปภาพแต่ละช่อง ค่าที่สูงขึ้นบ่งบอกถึงความมั่นใจที่มากขึ้นว่าพิกเซลรูปภาพเป็นส่วนหนึ่งของวัตถุที่อยู่ในพื้นที่สนใจ