Udhëzues për zbulimin e objekteve për Python

Detyra MediaPipe Object Detector ju lejon të zbuloni praninë dhe vendndodhjen e klasave të shumta të objekteve. Këto udhëzime ju tregojnë se si të përdorni detyrën e Detektorit të Objekteve në Python. Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub .

Ju mund ta shihni këtë detyrë në veprim duke parë demonstrimin në ueb . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .

Shembull kodi

Shembulli i kodit për Detektorin e Objekteve ofron një zbatim të plotë të kësaj detyre në Python për referencën tuaj. Ky kod ju ndihmon të testoni këtë detyrë dhe të filloni ndërtimin e aplikacionit tuaj të klasifikimit të tekstit. Mund të shikoni, ekzekutoni dhe modifikoni kodin e shembullit të Detektorit të Objekteve duke përdorur vetëm shfletuesin tuaj të internetit.

Nëse po zbatoni Detektorin e Objekteve për Raspberry Pi, referojuni shembullit të aplikacionit Raspberry Pi .

Konfigurimi

Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit në mënyrë specifike për të përdorur Detektorin e Objekteve. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për Python .

Paketat

Detyra Object Detector kërkon paketën mediapipe pip. Ju mund të instaloni paketat e kërkuara me komandat e mëposhtme:

$ python -m pip install mediapipe

Importet

Importoni klasat e mëposhtme për të hyrë në funksionet e detyrës së Detektorit të Objekteve:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Model

Detyra MediaPipe Object Detector kërkon një model të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion mbi modelet e trajnuara të disponueshme për Detektorin e Objekteve, shihni seksionin Modelet e përmbledhjes së detyrave.

Zgjidhni dhe shkarkoni një model dhe më pas ruajeni në një direktori lokale:

model_path = '/absolute/path/to/lite-model_efficientdet_lite0_detection_metadata_1.tflite'

Përdorni parametrin e objektit BaseOptions model_asset_path për të specifikuar shtegun e modelit që do të përdoret. Për një shembull kodi, shihni seksionin tjetër.

Krijo detyrën

Përdorni funksionin create_from_options për të krijuar detyrën. Funksioni create_from_options pranon opsionet e konfigurimit duke përfshirë modalitetin e ekzekutimit, vendndodhjen e emrave të shfaqur, numrin maksimal të rezultateve, pragun e besimit, listën e lejimit të kategorive dhe listën e mohimit. Nëse nuk vendosni një opsion konfigurimi, detyra përdor vlerën e paracaktuar. Për më shumë informacion mbi opsionet e konfigurimit, shihni seksionin e opsioneve të konfigurimit .

Detyra Object Detector mbështet disa lloje të dhënash hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Zgjidhni skedën që korrespondon me llojin tuaj të të dhënave hyrëse për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.

Imazhi

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.
  # ...
    

Video

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.
  # ...
    

Transmetim i drejtpërdrejtë

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.
  # ...
    

Për një shembull të plotë të krijimit të një detektori objektesh për përdorim me një imazh, shihni shembullin e kodit .

Opsionet e konfigurimit

Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet Python:

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
running_mode Vendos modalitetin e ekzekutimit për detyrën. Ekzistojnë tre mënyra:

IMAGE: Modaliteti për hyrjet e një imazhi të vetëm.

VIDEO: Modaliteti për kornizat e dekoduara të një videoje.

LIVE_STREAM: Modaliteti për një transmetim të drejtpërdrejtë të të dhënave hyrëse, si p.sh. nga një aparat fotografik. Në këtë modalitet, resultListener duhet të thirret për të vendosur një dëgjues për të marrë rezultatet në mënyrë asinkrone.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
display_names Vendos gjuhën e etiketave për t'u përdorur për emrat e shfaqur të dhëna në meta të dhënat e modelit të detyrës, nëse disponohet. Parazgjedhja është en për anglisht. Ju mund të shtoni etiketa të lokalizuara në meta të dhënat e një modeli të personalizuar duke përdorur API-në e shkrimtarit metadata TensorFlow Lite Kodi lokal sq
max_results Vendos numrin maksimal opsional të rezultateve të zbulimit me pikët më të larta për t'u kthyer. Çdo numër pozitiv -1 (të gjitha rezultatet kthehen)
score_threshold Vendos pragun e rezultatit të parashikimit që tejkalon atë të dhënë në meta të dhënat e modelit (nëse ka). Rezultatet nën këtë vlerë refuzohen. Çdo noton Nuk është vendosur
category_allowlist Vendos listën opsionale të emrave të kategorive të lejuara. Nëse nuk janë bosh, rezultatet e zbulimit, emri i kategorisë së të cilave nuk është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me category_denylist dhe duke përdorur të dyja rezultatet në një gabim. Çdo varg Nuk është vendosur
category_denylist Vendos listën opsionale të emrave të kategorive që nuk lejohen. Nëse nuk janë bosh, rezultatet e zbulimit, emri i kategorisë së të cilave është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me category_allowlist dhe duke përdorur të dyja rezultatet në një gabim. Çdo varg Nuk është vendosur

Përgatitni të dhënat

Përgatitni hyrjen tuaj si një skedar imazhi ose një grup numpy, më pas konvertojeni atë në një objekt mediapipe.Image . Nëse hyrja juaj është një skedar video ose transmetim i drejtpërdrejtë nga një kamerë në internet, mund të përdorni një bibliotekë të jashtme si OpenCV për të ngarkuar kornizat tuaja hyrëse si grupe të pakëndshme.

Shembujt e mëposhtëm shpjegojnë dhe tregojnë se si të përgatiten të dhënat për përpunim për secilin nga llojet e të dhënave të disponueshme:

Imazhi

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)
    

Video

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)
    

Transmetim i drejtpërdrejtë

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)
    

Drejtoni detyrën

Ju mund të telefononi një nga funksionet e zbulimit për të shkaktuar përfundime. Detyra Object Detector do të kthejë objektet e zbuluara brenda imazhit ose kornizës hyrëse.

Imazhi

# Perform object detection on the provided single image.
detection_result = detector.detect(mp_image)
    

Video

# 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)
    

Transmetim i drejtpërdrejtë

# 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)
    

Për një shembull të plotë të ekzekutimit të një detektor objekti në një imazh, shihni shembullin e kodit për detaje.

Vini re sa vijon:

  • Kur ekzekutoni në modalitetin e videos ose në modalitetin e transmetimit të drejtpërdrejtë, duhet t'i jepni gjithashtu detyrës së Detektorit të Objekteve vulën kohore të kornizës hyrëse.
  • Kur ekzekutohet në imazhin ose modelin e videos, detyra e Detektorit të Objekteve do të bllokojë fillin aktual derisa të përfundojë përpunimin e imazhit ose kornizës hyrëse.
  • Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e Detektorit të Objekteve nuk e bllokon lidhjen aktuale, por kthehet menjëherë. Ai do të thërrasë dëgjuesin e tij të rezultateve me rezultatin e zbulimit sa herë që ka përfunduar përpunimin e një kornize hyrëse. Nëse funksioni i zbulimit thirret kur detyra e Detektorit të Objekteve është e zënë duke përpunuar një kornizë tjetër, korniza e re hyrëse do të shpërfillet.

Trajtoni dhe shfaqni rezultatet

Pas ekzekutimit të konkluzionit, detyra e Detektorit të Objekteve kthen një objekt ObjectDetectionResult i cili përshkruan objektet që ka gjetur në imazhin hyrës.

Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:

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

Imazhi i mëposhtëm tregon një vizualizim të daljes së detyrës:

Dy qen që janë të theksuar me kuti kufizuese

Shembulli i kodit të detektorit të objekteve tregon se si të shfaqen rezultatet e zbulimit të kthyera nga detyra, shikoni shembullin e kodit për detaje.