Udhëzues për njohjen e gjesteve për Python

Detyra MediaPipe Gesture Recognizer ju lejon të dalloni gjestet e duarve në kohë reale dhe ofron rezultatet e njohura të gjesteve të duarve dhe pikat referuese të duarve të zbuluara. Këto udhëzime ju tregojnë se si të përdorni Gesture Recognizer me aplikacionet Python.

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 Njohësin e Gjesteve 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 njohësit tuaj të gjesteve të dorës. Mund të shikoni, ekzekutoni dhe modifikoni shembullin e kodit të Njohësit të Gjesteve duke përdorur vetëm shfletuesin tuaj të internetit.

Nëse po zbatoni Gesture Recognizer 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 "Njohësin e gjesteve". 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 Gesture Recognizer 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 detyrave të Njohësit të Gjestit:

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

Model

Detyra MediaPipe Gesture Recognizer kërkon një paketë modeli të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion mbi modelet e trajnuara të disponueshme për Njohjen e Gjesteve, 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'

Specifikoni rrugën e modelit brenda parametrit Emri i modelit, siç tregohet më poshtë:

base_options = BaseOptions(model_asset_path=model_path)

Krijo detyrën

Detyra MediaPipe Gesture Recognizer 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 transmetime video të drejtpërdrejta.

Imazhi

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the image mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

Video

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the video mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

Transmetim i drejtpërdrejtë

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the live stream mode:
def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int):
    print('gesture recognition result: {}'.format(result))

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

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. Ka 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 mund të zbulohet nga GestureRecognizer . 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 të rezultatit të pranisë së dorës në modelin e zbulimit të pikës referimi me dorë. Në modalitetin "Video" dhe "Transmetimi i drejtpërdrejtë" i "Njohjes së gjesteve", nëse rezultati i sigurt i pranisë së dorës nga modeli i pikës së dorës është nën këtë prag, ai aktivizon modelin e zbulimit të pëllëmbës. Përndryshe, një algoritëm i lehtë i gjurmimit të dorës përdoret për të përcaktuar vendndodhjen e dorës(ave) për zbulimin e mëvonshëm 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 "Transmetimi" i "Njohësit të gjesteve", nëse gjurmimi dështon, "Njohja e gjesteve" aktivizon zbulimin me dorë. Përndryshe, zbulimi i dorës anashkalohet. 0.0 - 1.0 0.5
canned_gestures_classifier_options Opsionet për konfigurimin e sjelljes së klasifikuesit të gjesteve të konservuara. Gjestet e konservuara janë ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • Vendndodhja e emrave të shfaqur: vendndodhja për t'u përdorur për emrat e shfaqur të specifikuar përmes Metadatës së Modelit TFLite, nëse ka.
  • Rezultatet maksimale: numri maksimal i rezultateve të klasifikimit me pikët më të larta për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Pragu i rezultatit: rezultati nën të cilin rezultatet refuzohen. Nëse vendoset në 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Lista e lejeve të kategorive: lista e lejeve të emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave nuk është në këtë grup do të filtrohen. Reciprokisht ekskluzive me denylist.
  • Refuzimi i kategorive: lista mohuese e emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave është në këtë grup do të filtrohen. Reciprokisht ekskluzive me listën e lejeve.
    • Vendndodhja e emrave të shfaqur: any string
    • Rezultatet maksimale: any integer
    • Pragu i rezultatit: 0.0-1.0
    • Lista e lejeve të kategorisë: vector of strings
    • Mohues i kategorisë: vector of strings
    • Vendndodhja e emrave të shfaqur: "en"
    • Rezultatet maksimale: -1
    • Pragu i rezultatit: 0
    • Lista e lejeve të kategorisë: bosh
    • Refuzues i kategorisë: bosh
    custom_gestures_classifier_options Opsionet për konfigurimin e sjelljes së klasifikuesit të gjesteve të personalizuara.
  • Vendndodhja e emrave të shfaqur: vendndodhja për t'u përdorur për emrat e shfaqur të specifikuar përmes Metadatës së Modelit TFLite, nëse ka.
  • Rezultatet maksimale: numri maksimal i rezultateve të klasifikimit me pikët më të larta për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Pragu i rezultatit: rezultati nën të cilin rezultatet refuzohen. Nëse vendoset në 0, të gjitha rezultatet e disponueshme do të kthehen.
  • Lista e lejeve të kategorive: lista e lejeve të emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave nuk është në këtë grup do të filtrohen. Reciprokisht ekskluzive me denylist.
  • Refuzimi i kategorive: lista mohuese e emrave të kategorive. Nëse nuk janë bosh, rezultatet e klasifikimit kategoria e të cilave është në këtë grup do të filtrohen. Reciprokisht ekskluzive me listën e lejeve.
    • Vendndodhja e emrave të shfaqur: any string
    • Rezultatet maksimale: any integer
    • Pragu i rezultatit: 0.0-1.0
    • Lista e lejeve të kategorisë: vector of strings
    • Mohues i kategorisë: vector of strings
    • Vendndodhja e emrave të shfaqur: "en"
    • Rezultatet maksimale: -1
    • Pragu i rezultatit: 0
    • Lista e lejeve të kategorisë: bosh
    • Refuzues i kategorisë: bosh
    result_callback Vendos dëgjuesin e rezultateve që të marrë rezultatet e klasifikimit në mënyrë asinkrone kur njohësi i gjesteve është në modalitetin e transmetimit të drejtpërdrejtë. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM ResultListener 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

    Njohësi i gjesteve përdor funksionet e njohjes, njohjes_për_video dhe njohjes_asinkronizuar për të shkaktuar konkluzionet. Për njohjen e gjesteve, kjo përfshin përpunimin paraprak të të dhënave hyrëse, zbulimin e duarve në imazh, zbulimin e shenjave të dorës dhe njohjen e gjestit të dorës nga pikat referuese.

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

    Imazhi

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the image mode.
    gesture_recognition_result = recognizer.recognize(mp_image)
        

    Video

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the video mode.
    gesture_recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
        

    Transmetim i drejtpërdrejtë

    # Send live image data to perform gesture recognition.
    # The results are accessible via the `result_callback` provided in
    # the `GestureRecognizerOptions` object.
    # The gesture recognizer must be created with the live stream mode.
    recognizer.recognize_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 së Njohësit të gjesteve vulën kohore të kornizës së hyrjes.
    • Kur ekzekutohet në imazhin ose modelin e videos, detyra e Njohësit të Gjestit 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 "Njohjes së gjesteve" nuk e bllokon lidhjen aktuale, por kthehet menjëherë. Ai do të thërrasë dëgjuesin e tij të rezultateve me rezultatin e njohjes sa herë që ka përfunduar përpunimin e një kornize hyrëse. Nëse funksioni i njohjes thirret kur detyra e Njohjes së Gjesteve është e zënë me përpunimin e një kuadri tjetër, detyra do të injorojë kornizën e re të hyrjes.

    Për një shembull të plotë të ekzekutimit të një Njohësi Gjestesh në një imazh, shihni shembullin e kodit për detaje.

    Trajtoni dhe shfaqni rezultatet

    Njohësi i gjesteve gjeneron një objekt rezultati të zbulimit të gjesteve për çdo ekzekutim të njohjes. Objekti i rezultatit përmban pika referimi të dorës në koordinatat e imazhit, pika referimi të dorës në koordinatat e botës, aftësia e dorës (dora e majtë/djathtas) dhe kategoritë e gjesteve të duarve të duarve të zbuluara.

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

    Rezultati i GestureRecognizerResult përmban katër komponentë, dhe secili komponent është një grup, ku secili element përmban rezultatin e zbuluar të një dore të vetme të zbuluar.

    • Duartësia

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

    • Gjestet

      Kategoritë e njohura të gjesteve të duarve të zbuluara.

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

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      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)
    

    Imazhet e mëposhtme tregojnë një vizualizim të daljes së detyrës:

    Një dorë në një lëvizje gishti lart me strukturën skeletore të dorës të shënuar

    Shembulli i kodit të Njohësit të Gjesteve tregon se si të shfaqen rezultatet e njohjes të kthyera nga detyra, shikoni shembullin e kodit për detaje.