Udhëzues dore për zbulimin e pikave referuese për Python

Detyra MediaPipe Hand Landmarker ju lejon të zbuloni pikat referuese të duarve në një imazh. Këto udhëzime ju tregojnë se si të përdorni Hand Landmarker me Python. Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub .

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 Hand Landmarker 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 të ndërtoni vetë detektorin tuaj të pikës referimi. Mund të shikoni, ekzekutoni dhe modifikoni shembullin e kodit Hand Landmarker duke përdorur vetëm shfletuesin tuaj të internetit.

Nëse po zbatoni Hand Landmarker 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 Hand Landmarker. 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 MediaPipe Hand Landmarker kërkon paketën mediapipe PyPI. Ju mund t'i instaloni dhe importoni këto varësi me sa vijon:

$ python -m pip install mediapipe

Importet

Importoni klasat e mëposhtme për të hyrë në funksionet e detyrës Hand Landmarker:

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

Model

Detyra MediaPipe Hand Landmarker 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 Hand Landmarker, shihni seksionin Modelet e përmbledhjes së detyrave.

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

model_path = '/absolute/path/to/gesture_recognizer.task'

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

Detyra MediaPipe Hand Landmarker përdor funksionin create_from_options për të konfiguruar detyrën. Funksioni create_from_options pranon vlera për opsionet e konfigurimit që duhen trajtuar. Për më shumë informacion mbi opsionet e konfigurimit, shihni Opsionet e konfigurimit .

Kodi i mëposhtëm tregon se si të ndërtohet dhe konfigurohet kjo detyrë.

Këto mostra tregojnë gjithashtu variacionet e ndërtimit të detyrës për imazhe, skedarë video dhe transmetim të drejtpërdrejtë.

Imazhi

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the image mode:
options = HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with HandLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Video

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the video mode:
options = HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with HandLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Transmetim i drejtpërdrejtë

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
HandLandmarkerResult = mp.tasks.vision.HandLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the live stream mode:
def print_result(result: HandLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('hand landmarker result: {}'.format(result))

options = HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with HandLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Për një shembull të plotë të krijimit të një shënuesi të dorës 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
num_hands Numri maksimal i duarve të zbuluara nga detektori i pikës referuese Hand. Any integer > 0 1
min_hand_detection_confidence Rezultati minimal i besimit për zbulimin e dorës për t'u konsideruar i suksesshëm në modelin e zbulimit të pëllëmbës. 0.0 - 1.0 0.5
min_hand_presence_confidence Rezultati minimal i besimit për rezultatin e pranisë së dorës në modelin e zbulimit të pikës referimi me dorë. Në modalitetin "Video" dhe "Transmetimi i drejtpërdrejtë", nëse rezultati i besueshmërisë së pranisë së dorës nga modeli i pikës së dorës është nën këtë prag, "Shënuesi i dorës" aktivizon modelin e zbulimit të pëllëmbës. Përndryshe, një algoritëm i lehtë i gjurmimit të dorës përcakton vendndodhjen e dorës(ave) për zbulimet e mëvonshme të pikës referimi. 0.0 - 1.0 0.5
min_tracking_confidence Rezultati minimal i besimit që gjurmimi i dorës të konsiderohet i suksesshëm. Ky është pragu kufizues IoU i kutisë midis duarve në kuadrin aktual dhe kuadrit të fundit. Në modalitetin "Video" dhe "Transmetim" të "Hand Landmarker", nëse gjurmimi dështon, Hand Landmarker aktivizon zbulimin me dorë. Përndryshe, ai anashkalon zbulimin e dorës. 0.0 - 1.0 0.5
result_callback Vendos dëgjuesin e rezultateve që të marrë rezultatet e zbulimit në mënyrë asinkrone kur pikë referimi është në modalitetin e transmetimit të drejtpërdrejtë. Zbatohet vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM N/A N/A

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.

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

Shënuesi i dorës përdor funksionet detektoj, detect_for_video dhe detect_async për të nxjerrë konkluzione. Për zbulimin e pikave referuese me dorë, kjo përfshin parapërpunimin e të dhënave hyrëse, zbulimin e duarve në imazh dhe zbulimin e pikave referuese të dorës.

Kodi i mëposhtëm tregon se si të ekzekutohet përpunimi me modelin e detyrës.

Imazhi

# Perform hand landmarks detection on the provided single image.
# The hand landmarker must be created with the image mode.
hand_landmarker_result = landmarker.detect(mp_image)
    

Video

# Perform hand landmarks detection on the provided single image.
# The hand landmarker must be created with the video mode.
hand_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

Transmetim i drejtpërdrejtë

# Send live image data to perform hand landmarks detection.
# The results are accessible via the `result_callback` provided in
# the `HandLandmarkerOptions` object.
# The hand landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

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 Hand Landmarker vulën kohore të kornizës së hyrjes.
  • Kur ekzekutohet në imazhin ose modelin e videos, detyra Hand Landmarker 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 Hand Landmarker 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 Hand Landmarker është e zënë me përpunimin e një kuadri tjetër, detyra do të injorojë kornizën e re hyrëse.

Për një shembull të plotë të ekzekutimit të një shënuesi të dorës në një imazh, shihni shembullin e kodit për detaje.

Trajtoni dhe shfaqni rezultatet

Shënuesi i dorës gjeneron një objekt të rezultatit të pikës së dorës për çdo ekzekutim zbulimi. Objekti i rezultatit përmban pika referimi të dorës në koordinatat e imazhit, pikë referimi të dorës në koordinatat botërore dhe dorëzimin (dora e majtë/djathtas) e duarve të zbuluara.

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

Dalja HandLandmarkerResult përmban tre komponentë. Çdo komponent është një grup, ku secili element përmban rezultatet e mëposhtme për një dorë të vetme të zbuluar:

  • Duartësia

    Duartësia përfaqëson nëse duart e zbuluara janë duart e majta apo të djathta.

  • Pikat e referimit

    Ka 21 pika referimi, secila e përbërë nga koordinatat x , y dhe z . Koordinatat x dhe y normalizohen në [0.0, 1.0] nga gjerësia dhe lartësia e imazhit, respektivisht. Koordinata z përfaqëson thellësinë e pikës referuese, me thellësinë në kyçin e dorës që është origjina. Sa më e vogël të jetë vlera, aq më afër kamerës është pikë referimi. Madhësia e z përdor përafërsisht të njëjtën shkallë si x .

  • Monumentet e botës

    21 pikat referuese të dorës janë paraqitur gjithashtu në koordinatat botërore. Çdo pikë referimi përbëhet nga x , y dhe z , që përfaqësojnë koordinatat 3D të botës reale në metra me origjinën në qendrën gjeometrike të dorës.

HandLandmarkerResult:
  Handedness:
    Categories #0:
      index        : 0
      score        : 0.98396
      categoryName : Left
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : -3.41E-7
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
    ... (21 landmarks for a hand)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
    ... (21 world landmarks for a hand)

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

Një dorë në një lëvizje gishti lart me strukturën skeletore të dorës të përcaktuar

Shembulli i kodit Hand Landmarker demonstron se si të shfaqen rezultatet e kthyera nga detyra, shikoni shembullin e kodit për detaje.