งานเครื่องมือแบ่งกลุ่มรูปภาพ MediaPipe ให้คุณแบ่งรูปภาพออกเป็นภูมิภาคต่างๆ ตามเนื้อหาที่กำหนดไว้ล่วงหน้า หมวดหมู่สำหรับการใช้เอฟเฟกต์ภาพ เช่น การเบลอพื้นหลัง เหล่านี้ แสดงวิธีการใช้การแบ่งกลุ่มภาพกับแอป Android โค้ด ตัวอย่างที่อธิบายในวิธีการเหล่านี้ GitHub สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม
ตัวอย่างโค้ด
ตัวอย่างโค้ดงาน MediaPipe แบ่งออกเป็น 2 แบบ แอปตัวแบ่งกลุ่มรูปภาพสำหรับ Android:
ตัวอย่างใช้กล้องบนอุปกรณ์ Android จริงเพื่อ แบ่งกลุ่มรูปภาพในฟีดกล้องแบบสด หรือคุณจะเลือกรูปภาพและ วิดีโอจากแกลเลอรีของอุปกรณ์ คุณสามารถใช้แอปเป็นจุดเริ่มต้นสำหรับ แอป Android ของคุณเอง หรืออ้างอิงถึงแอปดังกล่าวเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างเครื่องมือแบ่งกลุ่มรูปภาพถูกโฮสต์บน GitHub
ส่วนต่อไปนี้เกี่ยวข้องกับ เครื่องมือแบ่งกลุ่มรูปภาพที่มีการมาสก์หมวดหมู่ แอป
ดาวน์โหลดโค้ด
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
- โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
- คุณสามารถกำหนดค่าอินสแตนซ์ 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 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();
วิดีโอ
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 video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
สตรีมแบบสด
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s 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 ชุดข้อมูล