งานเครื่องมือแบ่งส่วนรูปภาพแบบอินเทอร์แอกทีฟของ MediaPipe จะใช้ตำแหน่งในรูปภาพ ประมาณขอบเขตของออบเจ็กต์ ณ ตำแหน่งนั้น และแสดงการแบ่งกลุ่มของออบเจ็กต์เป็นข้อมูลรูปภาพ คำแนะนำเหล่านี้จะแสดงวิธีใช้เครื่องมือแบ่งรูปภาพแบบอินเทอร์แอกทีฟกับแอป Android ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้จะอยู่ใน GitHub ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ได้ที่ภาพรวม
ตัวอย่างโค้ด
ตัวอย่างโค้ดงาน MediaPipe เป็นการใช้งานแอปเครื่องมือแบ่งรูปภาพแบบอินเทอร์แอกทีฟสำหรับ 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/interactive_segmentation/android
หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ไปยัง Android Studio และเรียกใช้แอปได้ โปรดดูวิธีการที่หัวข้อคู่มือการตั้งค่าสำหรับ Android
องค์ประกอบหลัก
ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับแอปพลิเคชันตัวอย่าง การแบ่งกลุ่มภาพนี้
- InteractiveSegmentationHelper.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()
เพื่อระบุเส้นทางที่โมเดลใช้ วิธีการนี้จะแสดงในตัวอย่างโค้ดในส่วนถัดไป
ในโค้ดตัวอย่างในการแบ่งกลุ่มรูปภาพแบบอินเทอร์แอกทีฟ โมเดลจะได้รับการกำหนดในคลาส 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 |
ตั้งค่า 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. 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
ที่ระบุว่าพิกเซลนั้นเป็นส่วนหนึ่งของวัตถุที่ตั้งอยู่บริเวณที่สนใจหรือไม่ วงกลมสีขาวดำในรูปที่ 2 แสดงถึงส่วนที่สนใจที่เลือกไว้
เอาต์พุตมาสก์รูปภาพและหมวดหมู่ต้นฉบับ รูปภาพต้นฉบับจากชุดข้อมูล Pascal VOC 2012
หน้ากากสร้างความมั่นใจ
เอาต์พุตสำหรับมาสก์ความเชื่อมั่นมีค่าทศนิยมระหว่าง [0, 1]
สำหรับแชแนลอินพุตรูปภาพแต่ละช่อง ค่าที่สูงขึ้นบ่งบอกถึงความมั่นใจที่สูงขึ้นว่าพิกเซลภาพเป็นส่วนหนึ่งของวัตถุที่ตั้งอยู่ในบริเวณที่สนใจ