คู่มือการแบ่งกลุ่มรูปภาพสำหรับ Android

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

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

ตัวอย่างโค้ดงาน MediaPipe แบ่งออกเป็น 2 แบบ แอปตัวแบ่งกลุ่มรูปภาพสำหรับ Android:

ตัวอย่างใช้กล้องบนอุปกรณ์ 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/image_segmentation/android
    

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

องค์ประกอบสำคัญ

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับภาพนี้ การประยุกต์ใช้ตัวอย่างการแบ่งกลุ่มลูกค้า:

  • ImageSegmenterHelper.kt เริ่มต้นงานเครื่องมือแบ่งกลุ่มรูปภาพ รวมถึงจัดการโมเดลและมอบสิทธิ์ มากมาย
  • CameraFragment.kt ระบุอินเทอร์เฟซผู้ใช้และรหัสควบคุมสำหรับกล้อง
  • GalleryFragment.kt มีอินเทอร์เฟซผู้ใช้และโค้ดควบคุมสำหรับการเลือกรูปภาพและวิดีโอ
  • OverlayView.kt - จัดการและจัดรูปแบบผลการแบ่งกลุ่ม

ตั้งค่า

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

การอ้างอิง

เครื่องมือแบ่งกลุ่มรูปภาพใช้ไลบรารี com.google.mediapipe:tasks-vision เพิ่มรายการนี้ จะขึ้นอยู่กับไฟล์ build.gradle ของไฟล์ โปรเจ็กต์การพัฒนาแอป Android นำเข้าทรัพยากร Dependency ที่จำเป็นด้วย โค้ดต่อไปนี้

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

รุ่น

งานเครื่องมือแบ่งกลุ่มรูปภาพ MediaPipe ต้องใช้โมเดลที่ผ่านการฝึก ซึ่งสามารถใช้ร่วมกับ งาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่ใช้ได้สำหรับเครื่องมือแบ่งกลุ่มรูปภาพ โปรดดู ภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล จากนั้นเก็บโมเดลไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ:

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

ใช้เมธอด BaseOptions.Builder.setModelAssetPath() เพื่อระบุเส้นทาง ที่โมเดลใช้อยู่ มีการอ้างอิงเมธอดนี้ในตัวอย่างโค้ดถัดไป

ในตัวแบ่งกลุ่มรูปภาพ โค้ดตัวอย่าง มีการกำหนดโมเดลในImageSegmenterHelper.kt ในฟังก์ชัน setupImageSegmenter()

สร้างงาน

คุณใช้ฟังก์ชัน createFromOptions เพื่อสร้างงานได้ ฟังก์ชัน createFromOptions ยอมรับตัวเลือกการกำหนดค่า รวมถึงเอาต์พุตมาสก์ ประเภทต่างๆ ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่างานได้ที่ ตัวเลือกการกำหนดค่า

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

รูปภาพ

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

วิดีโอ

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

สตรีมแบบสด

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

การใช้โค้ดตัวอย่างของเครื่องมือแบ่งกลุ่มรูปภาพช่วยให้ผู้ใช้สลับระหว่าง โหมดการประมวลผลข้อมูล วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและ อาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูรหัสนี้ได้ใน ImageSegmenterHelper ตามฟังก์ชัน setupImageSegmenter()

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
runningMode ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ โหมด:

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่ม เป็นรูปภาพ uint8 โดยที่ค่าพิกเซลแต่ละค่าจะระบุหมวดหมู่ที่ชนะ {True, False} False
outputConfidenceMasks หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่ม เป็นภาพค่าจำนวนลอยตัว โดยที่ค่าจำนวนลอยตัวแต่ละค่าแสดงความเชื่อมั่น ตารางคะแนนของหมวดหมู่ {True, False} True
displayNamesLocale ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ใน ข้อมูลเมตาของโมเดลงาน (หากมี) ค่าเริ่มต้นคือ en สำหรับ ภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้ โดยใช้ TensorFlow Lite Metadata Writer API รหัสภาษา en
resultListener ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์การแบ่งกลุ่ม แบบไม่พร้อมกันเมื่อตัวแบ่งกลุ่มรูปภาพอยู่ในโหมด LIVE_STREAM ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น ไม่มี ไม่มี
errorListener ตั้งค่า Listener ข้อผิดพลาดที่ไม่บังคับ ไม่มี ไม่ได้ตั้งค่า

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

เครื่องมือแบ่งกลุ่มรูปภาพใช้งานได้กับรูปภาพ ไฟล์วิดีโอ และวิดีโอสตรีมแบบสด งาน จัดการการประมวลผลอินพุตข้อมูลล่วงหน้า ซึ่งรวมถึงการปรับขนาด การหมุน และค่า การแปลงเป็นรูปแบบมาตรฐาน

คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็น 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.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

วิดีโอ

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

// Load a video file on the user's device using MediaMetadataRetriever

// From the videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. Youll need them
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

สตรีมแบบสด

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

// Create a CameraXs ImageAnalysis to continuously receive frames
// from the devices camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Androids ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Androids Image object and convert it to
// a MediaPipes Image object.
android.media.Image mediaImage = imageProxy.getImage()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

ในโค้ดตัวอย่างเครื่องมือแบ่งกลุ่มรูปภาพ การจัดเตรียมข้อมูลจะได้รับการจัดการใน ImageSegmenterHelper ตามฟังก์ชัน segmentLiveStreamFrame()

เรียกใช้งาน

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

รูปภาพ

ImageSegmenterResult segmenterResult = imagesegmenter.segment(image);
    

วิดีโอ

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

สตรีมแบบสด

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

โปรดทราบดังต่อไปนี้

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

ในโค้ดตัวอย่างของเครื่องมือแบ่งกลุ่มรูปภาพ ฟังก์ชัน segment ได้รับการกำหนดไว้ใน ImageSegmenterHelper.kt

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

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

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

ความเชื่อมั่นของหมวดหมู่

รูปภาพต่อไปนี้แสดงภาพเอาต์พุตงานสำหรับหมวดหมู่ มาส์กความมั่นใจ เอาต์พุตมาสก์ความเชื่อมั่นมีค่าแบบลอยระหว่าง [0, 1]

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

ค่าของหมวดหมู่

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

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