คำแนะนำการตรวจจับออบเจ็กต์สำหรับ Python

งาน MediaPipe Object Detector ช่วยให้คุณตรวจจับการมีอยู่และตำแหน่งของ คลาสของวัตถุ วิธีการเหล่านี้จะแสดงวิธีใช้ตัวตรวจจับวัตถุ ใน Python ตัวอย่างโค้ดที่อธิบายในวิธีการเหล่านี้มีอยู่ใน GitHub

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

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

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

ถ้าคุณใช้เครื่องมือตรวจจับวัตถุสำหรับ Raspberry Pi โปรดดูที่ ตัวอย่างของ Raspberry Pi แอป

ตั้งค่า

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

แพ็กเกจ

งานตัวตรวจจับวัตถุต้องการแพ็กเกจ PIP ของ 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 แบบ โหมด:

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

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

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 และใช้ ทั้งคู่จะทําให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
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

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน

โค้ดตัวอย่าง Object Detector แสดงวิธีแสดงการตรวจจับ ผลลัพธ์ที่ส่งคืนจากงาน โปรดดู ตัวอย่างโค้ด เพื่อดูรายละเอียด