งาน MediaPipe Object Detector จะช่วยให้คุณตรวจหาการมีอยู่และตำแหน่งของออบเจ็กต์หลายคลาสได้ วิธีการเหล่านี้จะแสดงวิธีใช้งาน Object Detector ใน Python ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้จะอยู่ใน GitHub
คุณสามารถดูงานนี้ในการใช้งานโดยดูการสาธิตบนเว็บ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ โปรดดูที่ภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่างสำหรับ Object Detector ช่วยให้การติดตั้งใช้งานงานนี้โดยสมบูรณ์ใน Python เป็นข้อมูลอ้างอิง โค้ดนี้ช่วยให้คุณทดสอบงานนี้และเริ่มสร้างแอปการแยกประเภทข้อความของคุณเองได้ คุณจะดู เรียกใช้ และแก้ไขโค้ดตัวอย่างตัวตรวจจับวัตถุได้โดยใช้เพียงเว็บเบราว์เซอร์
หากคุณใช้ Object Detector สำหรับ Raspberry Pi โปรดดูแอปตัวอย่าง Raspberry Pi
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้ตัวตรวจจับออบเจ็กต์โดยเฉพาะ ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ Python
กล่องพัสดุ
งานตัวตรวจจับออบเจ็กต์ต้องมีแพ็กเกจ Mediapipe คุณติดตั้งแพ็กเกจที่จำเป็นได้ด้วยคำสั่งต่อไปนี้
$ python -m pip install mediapipe
การนำเข้า
นำเข้าคลาสต่อไปนี้เพื่อเข้าถึงฟังก์ชันงานตัวตรวจจับออบเจ็กต์
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
รุ่น
งาน MediaPipe Object Detector ต้องใช้โมเดลที่ผ่านการฝึกซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่พร้อมใช้งานสำหรับตัวตรวจจับวัตถุได้ที่ภาพรวมงานส่วนโมเดล
เลือกและดาวน์โหลดโมเดล แล้วจัดเก็บไว้ในไดเรกทอรีในเครื่อง
model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'
ใช้พารามิเตอร์ BaseOptions
ของออบเจ็กต์ model_asset_path
เพื่อระบุเส้นทางของโมเดลที่จะใช้ โปรดดูตัวอย่างโค้ดในส่วนถัดไป
สร้างงาน
ใช้ฟังก์ชัน create_from_options
เพื่อสร้างงาน ฟังก์ชัน create_from_options
จะยอมรับตัวเลือกการกำหนดค่า ซึ่งรวมถึงโหมดการทำงาน ภาษาของชื่อที่แสดง จำนวนผลลัพธ์สูงสุด เกณฑ์ความเชื่อมั่น รายการที่อนุญาตของหมวดหมู่ และรายการปฏิเสธ หากคุณไม่ได้ตั้งค่าตัวเลือกการกำหนดค่า งานจะใช้ค่าเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ในส่วนตัวเลือกการกำหนดค่า
งานตัวตรวจจับวัตถุรองรับข้อมูลอินพุตหลายประเภท ได้แก่ ภาพนิ่ง ไฟล์วิดีโอ และสตรีมวิดีโอสด เลือกแท็บที่ตรงกับประเภทข้อมูลอินพุต เพื่อดูวิธีสร้างงานและใช้การอนุมาน
รูปภาพ
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.IMAGE) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
วิดีโอ
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), max_results=5, running_mode=VisionRunningMode.VIDEO) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
สตรีมแบบสด
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions DetectionResult = mp.tasks.components.containers.detections.DetectionResult ObjectDetector = mp.tasks.vision.ObjectDetector ObjectDetectorOptions = mp.tasks.vision.ObjectDetectorOptions VisionRunningMode = mp.tasks.vision.RunningMode def print_result(result: DetectionResult, output_image: mp.Image, timestamp_ms: int): print('detection result: {}'.format(result)) options = ObjectDetectorOptions( base_options=BaseOptions(model_asset_path='/path/to/model.tflite'), running_mode=VisionRunningMode.LIVE_STREAM, max_results=5, result_callback=print_result) with ObjectDetector.create_from_options(options) as detector: # The detector is initialized. Use it here. # ...
ดูตัวอย่างทั้งหมดสำหรับการสร้างตัวตรวจจับออบเจ็กต์เพื่อใช้กับรูปภาพได้ที่ตัวอย่างโค้ด
ตัวเลือกการกำหนดค่า
งานนี้มีตัวเลือกการกำหนดค่าสำหรับแอปพลิเคชัน Python ดังต่อไปนี้
ชื่อตัวเลือก | คำอธิบาย | ช่วงของค่า | ค่าเริ่มต้น |
---|---|---|---|
running_mode |
ตั้งค่าโหมดการทำงาน มี 3 โหมดดังนี้ IMAGE: โหมดสำหรับการป้อนข้อมูลรูปภาพเดียว วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ LIVE_Stream: โหมดสำหรับสตรีมแบบสดของข้อมูลอินพุต เช่น จากกล้อง ในโหมดนี้ ต้องมีการเรียกใช้ resultsListener เพื่อตั้งค่า Listener เพื่อรับผลลัพธ์แบบไม่พร้อมกัน |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names |
ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ในข้อมูลเมตาของโมเดลของงาน หากมี ค่าเริ่มต้นคือ en สำหรับภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลเป็นภาษาท้องถิ่นลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้โดยใช้ TensorFlow Lite Metadata Writer API
|
รหัสภาษา | en |
max_results |
ตั้งค่าจำนวนสูงสุดของผลลัพธ์การตรวจจับที่มีคะแนนสูงสุดที่จะแสดงได้ | ตัวเลขจำนวนบวกใดก็ได้ | -1 (แสดงผลลัพธ์ทั้งหมด) |
score_threshold |
ตั้งค่าเกณฑ์คะแนนการคาดการณ์ที่จะลบล้างเกณฑ์ที่ระบุไว้ในข้อมูลเมตาของโมเดล (หากมี) ผลลัพธ์ที่ต่ำกว่าค่านี้ถูกปฏิเสธ | จำนวนลอยตัวใดก็ได้ | ไม่ได้ตั้งค่า |
category_allowlist |
ตั้งค่ารายการตัวเลือกของชื่อหมวดหมู่ที่อนุญาต หากไม่ว่างเปล่า ผลการตรวจสอบที่ไม่มีชื่อหมวดหมู่ในชุดนี้จะถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก
ตัวเลือกนี้ใช้ด้วยกันกับ category_denylist ไม่ได้ และการใช้ทั้ง 2 รายการจะทำให้เกิดข้อผิดพลาด |
สตริงใดก็ได้ | ไม่ได้ตั้งค่า |
category_denylist |
ตั้งค่ารายการตัวเลือกของชื่อหมวดหมู่ที่ไม่ได้รับอนุญาต หาก
ไม่ว่างเปล่า ผลการตรวจหาที่มีชื่อหมวดหมู่ในชุดนี้จะถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้ใช้ด้วยกันกับ category_allowlist ไม่ได้เลย และใช้ทั้ง 2 ผลลัพธ์เกิดข้อผิดพลาด |
สตริงใดก็ได้ | ไม่ได้ตั้งค่า |
เตรียมข้อมูล
เตรียมอินพุตเป็นไฟล์ภาพหรืออาร์เรย์ตัวเลข แล้วแปลงเป็นออบเจ็กต์ mediapipe.Image
หากอินพุตเป็นไฟล์วิดีโอหรือสตรีมแบบสดจากเว็บแคม คุณจะใช้ไลบรารีภายนอก เช่น OpenCV เพื่อโหลดเฟรมอินพุตเป็นอาร์เรย์ตัวเลขได้
ตัวอย่างต่อไปนี้จะอธิบายและแสดงวิธีเตรียมข้อมูลสำหรับการประมวลผลสำหรับข้อมูลแต่ละประเภทที่มีอยู่
รูปภาพ
import mediapipe as mp # Load the input image from an image file. mp_image = mp.Image.create_from_file('/path/to/image') # Load the input image from a numpy array. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
วิดีโอ
import mediapipe as mp # Use OpenCV’s VideoCapture to load the input video. # Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS # You’ll need it to calculate the timestamp for each frame. # Loop through each frame in the video using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
สตรีมแบบสด
import mediapipe as mp # Use OpenCV’s VideoCapture to start capturing from the webcam. # Create a loop to read the latest frame from the camera using VideoCapture#read() # Convert the frame received from OpenCV to a MediaPipe’s Image object. mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
เรียกใช้งาน
คุณจะเรียกใช้ฟังก์ชันตรวจจับเพื่อทริกเกอร์การอนุมานได้ งานตัวตรวจจับวัตถุจะส่งคืนวัตถุที่ตรวจพบภายในรูปภาพหรือเฟรมอินพุต
รูปภาพ
# Perform object detection on the provided single image. detection_result = detector.detect(mp_image)
วิดีโอ
# Calculate the timestamp of the current frame frame_timestamp_ms = 1000 * frame_index / video_file_fps # Perform object detection on the video frame. detection_result = detector.detect_for_video(mp_image, frame_timestamp_ms)
สตรีมแบบสด
# Send the latest frame to perform object detection. # Results are sent to the `result_callback` provided in the `ObjectDetectorOptions`. detector.detect_async(mp_image, frame_timestamp_ms)
ดูตัวอย่างทั้งหมดของการเรียกใช้ตัวตรวจจับออบเจ็กต์กับรูปภาพได้จากตัวอย่างโค้ดสำหรับรายละเอียด
โปรดทราบดังต่อไปนี้
- เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุการประทับเวลาของเฟรมอินพุตในงานตัวตรวจจับวัตถุด้วย
- เมื่อเรียกใช้ในรูปภาพหรือวิดีโอหรือโมเดลวิดีโอ งานตัวตรวจจับวัตถุจะบล็อกเทรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จ
- เมื่อทำงานในโหมดสตรีมแบบสด งานตัวตรวจจับออบเจ็กต์จะไม่บล็อกเทรดปัจจุบัน แต่จะแสดงผลทันที โดยจะเรียกใช้ Listener ผลลัพธ์พร้อมกับผลการตรวจจับทุกครั้งที่ประมวลผลเฟรมอินพุตเสร็จ หากมีการเรียกฟังก์ชันตรวจจับเมื่องานตัวตรวจจับวัตถุกำลังไม่ว่างในการประมวลผลเฟรมอื่น ระบบจะไม่สนใจเฟรมอินพุตใหม่
แฮนเดิลและแสดงผลลัพธ์
เมื่อเรียกใช้การอนุมาน งานตัวตรวจจับออบเจ็กต์จะแสดงผลออบเจ็กต์ ObjectDetectionResult
ซึ่งอธิบายออบเจ็กต์ที่พบในรูปภาพอินพุต
ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้
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
รูปภาพต่อไปนี้แสดงภาพเอาต์พุตของงาน
โค้ดตัวอย่างตัวตรวจจับออบเจ็กต์แสดงวิธีแสดงผลลัพธ์การตรวจจับจากงาน ดูรายละเอียดได้ในตัวอย่างโค้ด