งานเครื่องมือตรวจจับวัตถุช่วยให้คุณตรวจจับการมีอยู่และตำแหน่งของ คลาสของวัตถุ เช่น ตัวตรวจจับวัตถุสามารถค้นหาตำแหน่งสุนัขที่อยู่ใน รูปภาพ วิธีการเหล่านี้จะแสดงวิธีใช้งานตัวตรวจจับวัตถุใน Android ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub คุณสามารถดูการทำงานนี้ได้โดยดู การสาธิตเว็บ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่างงาน MediaPipe คือการใช้งานตัวตรวจจับออบเจ็กต์แบบง่ายๆ แอปสำหรับ Android ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ Android จริงเพื่อ ตรวจพบวัตถุอย่างต่อเนื่อง และใช้รูปภาพและวิดีโอจาก เพื่อตรวจจับวัตถุแบบคงที่
คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสำหรับแอป Android ของคุณเอง หรืออ้างอิงถึงแอปนั้น เมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่าง Object Detector ถูกโฮสต์บน GitHub
ดาวน์โหลดโค้ด
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
- โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
- คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้การชำระเงินแบบกระจัดกระจายได้
เพื่อให้คุณมีเพียงไฟล์สำหรับแอปตัวอย่าง Object Detector ดังนี้
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/object_detection/android
หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณจะนำเข้าโปรเจ็กต์ได้ ลงใน Android Studio และเรียกใช้แอป ดูวิธีการได้ที่ คู่มือการการตั้งค่าสำหรับ Android
องค์ประกอบสำคัญ
ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับตัวตรวจจับวัตถุ แอปพลิเคชันตัวอย่าง:
- ObjectDetectorHelper.kt - เริ่มต้นเครื่องมือตรวจจับวัตถุ จากนั้นจัดการโมเดลและมอบสิทธิ์ รายการที่เลือก
- MainActivity.kt - ใช้งานแอปพลิเคชันและประกอบส่วนประกอบต่างๆ ของอินเทอร์เฟซผู้ใช้
- OverlayView.kt - จัดการและแสดงผลลัพธ์
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ โปรเจ็กต์โค้ดเพื่อใช้ตัวตรวจจับออบเจ็กต์ สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe ซึ่งรวมถึง โปรดดูข้อกำหนดเวอร์ชันของแพลตฟอร์ม คู่มือการตั้งค่าสำหรับ Android
การอ้างอิง
ตัวตรวจจับวัตถุใช้ไลบรารี com.google.mediapipe:tasks-vision
เพิ่มรายการนี้
จะขึ้นอยู่กับไฟล์ build.gradle
ของไฟล์
โปรเจ็กต์การพัฒนาแอป Android นำเข้าทรัพยากร Dependency ที่จำเป็นด้วย
โค้ดต่อไปนี้
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
รุ่น
งาน MediaPipe Object Detector ต้องการโมเดลที่ผ่านการฝึกอบรมที่ใช้งานร่วมกับ งาน ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่พร้อมใช้งานสำหรับตัวตรวจจับวัตถุได้ที่ ภาพรวมงานส่วนโมเดล
เลือกและดาวน์โหลดโมเดล จากนั้นเก็บโมเดลไว้ในไดเรกทอรีโปรเจ็กต์ของคุณ:
<dev-project-root>/src/main/assets
ใช้เมธอด BaseOptions.Builder.setModelAssetPath()
เพื่อระบุเส้นทาง
ที่โมเดลใช้อยู่ ดูตัวอย่างโค้ดได้ในส่วนถัดไป
สร้างงาน
คุณใช้ฟังก์ชัน createFromOptions
เพื่อสร้างงานได้
ฟังก์ชัน createFromOptions
ยอมรับตัวเลือกการกำหนดค่ารวมถึงการเรียกใช้
โหมด ภาษาของชื่อที่แสดง จำนวนผลลัพธ์สูงสุด เกณฑ์ความเชื่อมั่น
รายการที่อนุญาตและรายการที่ปฏิเสธ ถ้าไม่ได้ระบุตัวเลือกการกำหนดค่า
ระบบจะใช้ค่าเริ่มต้น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่า
ดูภาพรวมการกำหนดค่า
งานการตรวจจับวัตถุรองรับข้อมูลอินพุต 3 ประเภท ได้แก่ ภาพนิ่งและไฟล์วิดีโอ และสตรีมวิดีโอสด คุณต้องระบุโหมดการทำงานที่สอดคล้องกับ ประเภทข้อมูลอินพุตเมื่อสร้างงาน เลือกแท็บที่ตรงกับ ประเภทข้อมูลอินพุตเพื่อดูวิธีสร้างงานและเรียกใช้การอนุมาน
รูปภาพ
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.IMAGE) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
วิดีโอ
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.VIDEO) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
สตรีมแบบสด
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.LIVE_STREAM) .setMaxResults(5) .setResultListener((result, inputImage) -> { // Process the detection result here. }) .setErrorListener((result, inputImage) -> { // Process the classification errors here. }) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
การใช้งานโค้ดตัวอย่าง Object Detector ช่วยให้ผู้ใช้สลับ
โหมดการประมวลผลข้อมูล วิธีนี้ทำให้โค้ดการสร้างงานซับซ้อนขึ้นและ
อาจไม่เหมาะกับกรณีการใช้งานของคุณ คุณดูรหัสนี้ได้ใน
ObjectDetectorHelper
ฟังก์ชันคลาส setupObjectDetector()
ตัวเลือกการกำหนดค่า
งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป Android
ชื่อตัวเลือก | คำอธิบาย | ช่วงค่า | ค่าเริ่มต้น |
---|---|---|---|
runningMode |
ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ
โหมด: รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
displayNamesLocales |
ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ใน
ข้อมูลเมตาของโมเดลงาน (หากมี) ค่าเริ่มต้นคือ en สำหรับ
ภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้
โดยใช้ TensorFlow Lite Metadata Writer API
|
รหัสภาษา | en |
maxResults |
ตั้งค่าจำนวนผลลัพธ์การตรวจหาคะแนนสูงสุด (ไม่บังคับ) เป็น ผลตอบแทน | จำนวนบวกใดก็ได้ | -1 (แสดงผลลัพธ์ทั้งหมด) |
scoreThreshold |
ตั้งค่าเกณฑ์คะแนนการคาดการณ์ซึ่งจะลบล้างเกณฑ์ที่ระบุไว้ใน ข้อมูลเมตาของโมเดล (หากมี) ผลลัพธ์ที่ต่ำกว่าค่านี้ถูกปฏิเสธ | ทศนิยมใดก็ได้ | ไม่ได้ตั้งค่า |
categoryAllowlist |
ตั้งค่ารายการชื่อหมวดหมู่ที่อนุญาตซึ่งไม่บังคับ หากไม่ว่างเปล่า
ผลลัพธ์การตรวจจับที่มีชื่อหมวดหมู่ที่ไม่ได้อยู่ในชุดนี้จะ
ถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก
ตัวเลือกนี้ไม่เกี่ยวข้องกับ categoryDenylist และใช้
ทั้งคู่จะทําให้เกิดข้อผิดพลาด |
สตริงใดก็ได้ | ไม่ได้ตั้งค่า |
categoryDenylist |
ตั้งค่ารายการตัวเลือกชื่อหมวดหมู่ที่ไม่ได้รับอนุญาต ถ้า
ไม่ว่างเปล่า ระบบจะกรองผลลัพธ์การตรวจจับที่มีชื่อหมวดหมู่อยู่ในชุดนี้
ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้มีผลร่วมกัน
เฉพาะตัวสำหรับ categoryAllowlist และการใช้ทั้ง 2 อย่างจะทำให้เกิดข้อผิดพลาด |
สตริงใดก็ได้ | ไม่ได้ตั้งค่า |
resultListener |
ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์การตรวจจับ แบบไม่พร้อมกันเมื่อตัวตรวจจับวัตถุอยู่ในสตรีมแบบสด คุณจะใช้ตัวเลือกนี้ได้เมื่อตั้งค่า runningMode เป็น LIVE_STREAM เท่านั้น | ไม่เกี่ยวข้อง | ไม่ได้ตั้งค่า |
เตรียมข้อมูล
คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็น
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 values. Use these values // 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() MPImage mpImage = new MediaImageBuilder(mediaImage).build();
ในโค้ดตัวอย่าง Object Detector การจัดเตรียมข้อมูลจะดำเนินการใน
ObjectDetectorHelper
ชั้นเรียนใน detectImage()
, detectVideoFile()
, detectLivestreamFrame()
เรียกใช้งาน
ใช้เมธอด
ObjectDetector.detect...()
ที่เฉพาะเจาะจงสำหรับประเภทข้อมูลดังกล่าว ใช้
detect()
สำหรับรูปภาพแต่ละรูป
detectForVideo()
สำหรับเฟรมในไฟล์วิดีโอ และ
detectAsync()
สำหรับสตรีมวิดีโอ เมื่อคุณดำเนินการตรวจหาใน
สตรีมวิดีโอ โปรดตรวจสอบว่าคุณได้เรียกใช้การตรวจจับในชุดข้อความแยกต่างหากเพื่อหลีกเลี่ยงการตรวจพบ
บล็อกชุดข้อความอินเทอร์เฟซผู้ใช้
ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างง่ายๆ ของวิธีเรียกใช้ Object Detector ในโหมดข้อมูลที่แตกต่างกันเหล่านี้
รูปภาพ
ObjectDetectorResult detectionResult = objectDetector.detect(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. ObjectDetectorResult detectionResult = objectDetector.detectForVideo(image, frameTimestampMs);
สตรีมแบบสด
// Run inference on the frame. The detection results will be available // via the `resultListener` provided in the `ObjectDetectorOptions` when // the object detector was created. objectDetector.detectAsync(image, frameTimestampMs);
ตัวอย่างโค้ดเครื่องมือตรวจจับวัตถุแสดงการใช้งาน
โหมดอย่างละเอียดมากขึ้น
detect()
detectVideoFile()
,
และ detectAsync()
โค้ดตัวอย่างช่วยให้ผู้ใช้สลับโหมดการประมวลผลได้
ซึ่งอาจไม่จำเป็นสำหรับ
กรณีการใช้งานของคุณ
โปรดทราบดังต่อไปนี้
- เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้อง ระบุการประทับเวลาของเฟรมอินพุตกับงานตัวตรวจจับวัตถุ
- เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานของตัวตรวจจับวัตถุจะ บล็อกชุดข้อความปัจจุบันจนกว่าจะประมวลผลรูปภาพอินพุตเสร็จสิ้น หรือ เฟรม หากต้องการหลีกเลี่ยงการบล็อกเทรดปัจจุบัน ให้เรียกใช้การประมวลผลใน เทรดพื้นหลัง
- เมื่อทำงานในโหมดสตรีมแบบสด งานของตัวตรวจจับวัตถุจะไม่บล็อก ชุดข้อความปัจจุบันแต่จะแสดงอีกครั้งทันที ระบบจะเรียกใช้ผลลัพธ์ Listener พร้อมผลลัพธ์การตรวจจับทุกครั้งที่ประมวลผลเสร็จแล้ว เฟรมอินพุต หากมีการเรียกฟังก์ชันตรวจหาเมื่องานของตัวตรวจจับวัตถุ ไม่ว่างในการประมวลผลเฟรมอื่น เฟรมอินพุตใหม่จะถูกละเว้น
จัดการและแสดงผลลัพธ์
เมื่อเรียกใช้การอนุมาน งานตัวตรวจจับออบเจ็กต์จะแสดงผลแอตทริบิวต์
ObjectDetectorResult
ที่อธิบายออบเจ็กต์ที่พบ
ภาพอินพุต
ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน
โค้ดตัวอย่าง Object Detector แสดงวิธีแสดงการตรวจจับ
ผลลัพธ์ที่ส่งคืนจากงาน โปรดดู
OverlayView
เพื่อดูรายละเอียดเพิ่มเติม