راهنمای تشخیص اشیا برای پایتون

وظیفه MediaPipe Object Detector به شما امکان می دهد حضور و مکان چندین کلاس از اشیاء را تشخیص دهید. این دستورالعمل به شما نشان می دهد که چگونه از وظیفه آشکارساز شی در پایتون استفاده کنید. نمونه کد توضیح داده شده در این دستورالعمل ها در GitHub موجود است.

می توانید با مشاهده نسخه نمایشی وب، این کار را در عمل مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این کار، به نمای کلی مراجعه کنید.

نمونه کد

کد مثال برای Object Detector اجرای کامل این کار را در پایتون برای مرجع شما فراهم می کند. این کد به شما کمک می کند تا این کار را آزمایش کنید و شروع به ساخت برنامه طبقه بندی متن خود کنید. می‌توانید کد نمونه‌ی Object Detector را فقط با استفاده از مرورگر وب خود مشاهده، اجرا و ویرایش کنید.

اگر در حال پیاده‌سازی Object Detector برای 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.
  # ...
    

برای یک مثال کامل از ایجاد یک آشکارساز شی برای استفاده با یک تصویر، به مثال کد مراجعه کنید.

گزینه های پیکربندی

این کار دارای گزینه های پیکربندی زیر برای برنامه های پایتون است:

نام گزینه توضیحات محدوده ارزش مقدار پیش فرض
running_mode حالت اجرا را برای کار تنظیم می کند. سه حالت وجود دارد:

IMAGE: حالت برای ورودی های تک تصویر.

VIDEO: حالت برای فریم های رمزگشایی شده یک ویدیو.

LIVE_STREAM: حالت پخش زنده داده های ورودی، مانند دوربین. در این حالت، resultListener باید فراخوانی شود تا شنونده ای را برای دریافت نتایج به صورت ناهمزمان تنظیم کند.
{ 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 منحصر به فرد است و از هر دو نتیجه در یک خطا استفاده می کند. هر رشته تنظیم نشده است

داده ها را آماده کنید

ورودی خود را به عنوان یک فایل تصویری یا یک آرایه numpy آماده کنید، سپس آن را به یک شی 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)
    

برای مثال کامل اجرای Object Detector بر روی یک تصویر، برای جزئیات بیشتر به مثال کد مراجعه کنید.

به موارد زیر توجه کنید:

  • هنگام اجرا در حالت ویدیو یا حالت پخش زنده، باید به وظیفه آشکارساز اشیا، مهر زمانی قاب ورودی را نیز ارائه دهید.
  • هنگامی که در تصویر یا مدل ویدیو اجرا می شود، وظیفه آشکارساز شی، رشته فعلی را مسدود می کند تا زمانی که پردازش تصویر یا فریم ورودی به پایان برسد.
  • هنگامی که در حالت پخش زنده اجرا می شود، وظیفه آشکارساز شی موضوع فعلی را مسدود نمی کند، اما بلافاصله برمی گردد. هر بار که پردازش یک فریم ورودی را تمام کند، شنونده نتیجه خود را با نتیجه تشخیص فراخوانی می کند. اگر زمانی که وظیفه آشکارساز شی مشغول پردازش فریم دیگری است، تابع تشخیص فراخوانی شود، فریم ورودی جدید نادیده گرفته می شود.

کنترل و نمایش نتایج

پس از اجرای استنتاج، وظیفه آشکارساز شی یک شی 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 نحوه نمایش نتایج تشخیص برگشتی از کار را نشان می دهد، برای جزئیات به مثال کد مراجعه کنید.