Python için hareket tanıma kılavuzu

MediaPipe Hareket Tanıyıcısı görevi, el hareketlerini gerçek zamanlı olarak tanımanızı sağlar ve algılanan el hareketi sonuçlarını ve algılanan ellerin önemli el işaretlerini sağlar. Bu talimatlarda, Hareket Tanıma Aracı'nın Python uygulamalarıyla nasıl kullanılacağı gösterilmektedir.

Web demosunu görüntüleyerek bu görevi çalışırken görebilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış bölümüne bakın.

Kod örneği

Hareket Tanıyıcı örnek kodu, size referans olması açısından bu görevin Python'da eksiksiz bir uygulamasını sunmaktadır. Bu kod, bu görevi test etmenize ve kendi el hareket tanıyıcınızı oluşturmaya başlamanıza yardımcı olur. Hareket Tanıyıcı örnek kodunu yalnızca web tarayıcınızı kullanarak görüntüleyebilir, çalıştırabilir ve düzenleyebilirsiniz.

Raspberry Pi için Hareket Tanıyıcı'yı uyguluyorsanız Raspberry Pi örnek uygulamasına bakın.

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın temel adımları açıklanmaktadır ve projelerinizi özel olarak Hareket Tanıyıcı'yı kullanacak şekilde kodlamalısınız. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgileri Python için kurulum kılavuzu bölümünde bulabilirsiniz.

Paketler

MediaPipe Hareket Tanıyıcı görevi için mediapipe PyPI paketi gerekir. Bu bağımlılıkları aşağıdakilerle yükleyebilir ve içe aktarabilirsiniz:

$ python -m pip install mediapipe

İçe Aktarımlar

Hareket Tanıyıcı görev işlevlerine erişmek için aşağıdaki sınıfları içe aktarın:

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

Model

MediaPipe Hareket Tanıyıcı görevi, bu görevle uyumlu, eğitilmiş bir model paketi gerektirir. Hareket Tanıyıcı için eğitilmiş modeller hakkında daha fazla bilgi edinmek üzere göreve genel bakış Modeller bölümüne bakın.

Modeli seçip indirin ve ardından yerel bir dizinde depolayın:

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

Aşağıda gösterildiği gibi, Model Adı parametresinde modelin yolunu belirtin:

base_options = BaseOptions(model_asset_path=model_path)

Görevi oluşturma

MediaPipe Hareket Tanıyıcı görevi, görevi ayarlamak için create_from_options işlevini kullanır. create_from_options işlevi, işlenecek yapılandırma seçeneklerinin değerlerini kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri bölümüne bakın.

Aşağıdaki kod bu görevin nasıl oluşturulacağını ve yapılandırılacağını gösterir.

Bu örnekler resimler, video dosyaları ve canlı video akışları için görev yapısının varyasyonlarını da gösterir.

Resim

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

Canlı yayın

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

Yapılandırma seçenekleri

Bu görev, Python uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
running_mode Görevin çalışma modunu ayarlar. Üç mod vardır:

RESİM: Tek resimli girişler için mod.

VİDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.

LIVE_STREAM: Kamera gibi giriş verilerini içeren bir canlı yayın modu. Bu modda, sonuçları eşzamansız olarak almak üzere bir işleyici ayarlamak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands GestureRecognizer, maksimum el sayısını algılayabilir. Any integer > 0 1
min_hand_detection_confidence El algılamasının, avuç içi algılama modelinde başarılı olarak değerlendirilebilmesi için gereken minimum güven puanı. 0.0 - 1.0 0.5
min_hand_presence_confidence El önemli nokta algılama modelinde el varlığının minimum güven puanı. Hareket Tanıma Aracı'nın Video ve Canlı yayın modunda, el önemli nokta modelindeki el varlığı güven puanı bu eşiğin altındaysa avuç içi algılama modelini tetikler. Aksi takdirde, daha sonraki önemli nokta tespiti için ellerin konumunu belirlemek üzere hafif bir el takip algoritması kullanılır. 0.0 - 1.0 0.5
min_tracking_confidence Elle izlemenin başarılı olarak kabul edilmesi için gereken minimum güven puanı. Bu, geçerli çerçevede ve son karede bulunan eller arasındaki sınırlayıcı kutu IoU eşiğidir. Hareket Tanıyıcı'nın Video ve Yayın modunda, izleme başarısız olursa Hareket Tanıyıcı el algılamayı tetikler. Aksi halde, el algılama özelliği atlanır. 0.0 - 1.0 0.5
canned_gestures_classifier_options Hazır hareketler sınıflandırıcı davranışını yapılandırma seçenekleri. Hazır hareketler: ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • Görünen adlar yerel ayarı: Varsa TFLite Model Meta Verileri aracılığıyla belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise mevcut tüm sonuçlar döndürülür.
  • Puan eşiği: Altına düşen sonuçların reddedildiği puan. 0 olarak ayarlanırsa mevcut tüm sonuçlar döndürülür.
  • Kategori izin verilenler listesi: Kategori adlarının izin verilenler listesi. Boş değilse kategorisi bu grupta bulunmayan sınıflandırma sonuçları filtrelenir. Reddetme listesi ile birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse kategorisi bu grupta yer alan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte kullanılamaz.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuçlar: any integer
    • Puan eşiği: 0.0-1.0
    • Kategori izin verilenler listesi: vector of strings
    • Kategori ret listesi: vector of strings
    • Görünen adlar yerel ayarı: "en"
    • Maksimum sonuçlar: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    custom_gestures_classifier_options Özel hareketler sınıflandırıcı davranışını yapılandırma seçenekleri.
  • Görünen adlar yerel ayarı: Varsa TFLite Model Meta Verileri aracılığıyla belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise mevcut tüm sonuçlar döndürülür.
  • Puan eşiği: Altına düşen sonuçların reddedildiği puan. 0 olarak ayarlanırsa mevcut tüm sonuçlar döndürülür.
  • Kategori izin verilenler listesi: Kategori adlarının izin verilenler listesi. Boş değilse kategorisi bu grupta bulunmayan sınıflandırma sonuçları filtrelenir. Reddetme listesi ile birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse kategorisi bu grupta yer alan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte kullanılamaz.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuçlar: any integer
    • Puan eşiği: 0.0-1.0
    • Kategori izin verilenler listesi: vector of strings
    • Kategori ret listesi: vector of strings
    • Görünen adlar yerel ayarı: "en"
    • Maksimum sonuçlar: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    result_callback Hareket tanıyıcı canlı yayın modundayken sınıflandırma sonuçlarını eşzamansız olarak almak için sonuç işleyiciyi ayarlar. Yalnızca çalıştırma modu LIVE_STREAM olarak ayarlandığında kullanılabilir ResultListener Yok Yok

    Verileri hazırlama

    Girişinizi görüntü dosyası veya numpy dizisi olarak hazırlayıp mediapipe.Image nesnesine dönüştürün. Girişiniz, web kamerasından bir video dosyası veya canlı yayın ise giriş karelerinizi sayı dizileri olarak yüklemek için OpenCV gibi harici bir kitaplık kullanabilirsiniz.

    Resim

    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)
        

    Canlı yayın

    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)
        

    Görevi çalıştırma

    Hareket Tanıma Aracı, çıkarımları tetiklemek için find, define_for_video ve include_async işlevlerini kullanır. Hareket tanıma için bu, giriş verilerinin ön işlenmesini, resimdeki ellerin algılanmasını, el işaretlerinin ve önemli noktalardaki el hareketlerinin tanınmasını içerir.

    Aşağıdaki kod, işlemenin görev modeliyle nasıl yürütüldüğünü gösterir.

    Resim

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

    Canlı yayın

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

    Aşağıdakileri göz önünde bulundurun:

    • Video modunda veya canlı yayın modunda çalışırken Hareket Tanıyıcı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
    • Hareket Tanımlayıcı görevi, resim veya video modelinde çalıştırılırken giriş resmini veya çerçevesini işlemeyi bitirene kadar geçerli iş parçacığını engeller.
    • Hareket Tanıma Aracı, canlı yayın modunda çalışırken geçerli iş parçacığını engellemez ancak hemen geri döner. Bir giriş çerçevesini işlemeyi tamamladığında tanıma sonucuyla birlikte sonuç işleyicisini çağırır. Hareket Tanıyıcı görevi başka bir kareyi işlemekle meşgulken tanıma işlevi çağrılırsa görev yeni giriş çerçevesini yoksayar.

    Bir resimde Hareket Tanıyıcı'nın çalıştırılmasıyla ilgili eksiksiz bir örnek için ayrıntılı bilgi edinmek üzere kod örneğine bakın.

    Sonuçları işleme ve görüntüleme

    Hareket Tanıyıcı, her tanıma çalıştırması için bir hareket algılama sonuç nesnesi oluşturur. Sonuç nesnesi; resim koordinatlarında el yer işaretleri, dünya koordinatlarındaki el yer işaretleri, el tercihi(sol/sağ el) kategorileri ve algılanan ellerin el hareketi kategorilerini içerir.

    Aşağıda, bu görevden alınan çıkış verilerinin bir örneği gösterilmektedir:

    Sonuçta elde edilen GestureRecognizerResult, dört bileşen içerir ve her bileşen bir dizidir. Bu dizide her öğe, algılanan tek bir elin algılanan sonucunu içerir.

    • Uygun Olduğu El

      El bilgisi, algılanan ellerin sol el mi yoksa sağ el mi olduğunu belirtir.

    • Hareketler

      Algılanan ellerin tanınan hareket kategorileri.

    • Önemli noktalar

      Her biri x, y ve z koordinatlarından oluşan 21 önemli nokta vardır. x ve y koordinatları, sırasıyla resim genişliği ve yüksekliğine göre [0,0, 1,0] olacak şekilde normalleştirilir. z koordinatı, önemli nokta derinliğini temsil eder. Bilekteki derinlik ise başlangıç noktasıdır. Değer ne kadar küçükse nokta kameraya o kadar yakın olur. z ölçeğinin büyüklüğü, x ile yaklaşık olarak aynı ölçeği kullanır.

    • Dünyanın Sınırları

      21 önemli nokta, dünya koordinatlarında da gösterilir. Her önemli nokta, x, y ve z öğelerinden oluşur. Bu noktalar, başlangıç noktası elin geometrik merkezinde olmak üzere gerçek dünyadaki 3D koordinatları metre cinsinden temsil eder.

    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)
    

    Aşağıdaki resimlerde görev çıktısının görselleştirmesi gösterilmektedir:

    Hareket Tanıyıcı örnek kodu, görevden döndürülen tanıma sonuçlarının nasıl görüntüleneceğini gösterir. Ayrıntılar için kod örneğine bakın.