Python için hareket tanıma kılavuzu

MediaPipe Hareket Tanımlayıcı görevi, el hareketlerini gerçek zamanlı olarak tanımanızı sağlar. algılanan el hareketi sonuçlarını ve el önemli noktalarını sunar eller. Bu talimatlarda Hareket Tanımlayıcı'nın nasıl kullanılacağı gösterilmektedir en iyi uygulamaları anlatacağım.

Web sayfasını ziyaret ederek bu görevi demo özellikleri, modelleri ve yapılandırma seçenekleri hakkında Genel bakış'ı inceleyin.

Kod örneği

Hareket Tanıyıcı'nın örnek kodu, bu özelliğin eksiksiz bir şekilde uygulanmasını sağlar görevi görebilir. Bu kod, görevi test etmenize ve kendi el hareketi tanıyıcınızı oluşturmaya başladınız. Bu dosyaları görüntüleyebilir, çalıştırabilir Hareket Tanımlayıcı örneğini düzenle kod yalnızca web tarayıcınızı kullanarak.

Raspberry Pi için Hareket Tanımlayıcı'yı uyguluyorsanız şuraya bakın: Raspberry Pi örneği uygulamasında gösterilir.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Hareket Tanıyıcı'yı kullanmak için özel olarak kod projeleri oluşturalım. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı platform sürümü gereksinimleri hakkında daha fazla bilgi için Python'da kullanılabilir.

Paketler

MediaPipe Hareket Tanıyıcı görevi, mediapipe PyPI paketini gerektirir. Bu uygulamaları yükleyebilir ve bu bağımlılıkları aşağıdaki şekilde içe aktarın:

$ python -m pip install mediapipe

İçe aktarılanlar

Hareket Tanımlayı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, oluşturacağım. Hareket Tanıyıcı'nın mevcut eğitilmiş modelleri hakkında daha fazla bilgi için göreve genel bakışın Modeller bölümünü inceleyin.

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

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

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

base_options = BaseOptions(model_asset_path=model_path)

Görevi oluşturma

MediaPipe Hareket Tanıyıcı görevi,create_from_options görevi görebilir. create_from_options işlevi, yapılandırma için değerleri kabul eder pek çok seçenek sunar. Yapılandırma seçenekleri hakkında daha fazla bilgi için bkz. Yapılandırma seçenekleri.

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

Bu örnekler ayrıca resimler için görev yapısı, video dosyaları ve canlı video akışları kullanılabilir.

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çeneklerini içerir:

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
running_mode Görev için çalışma modunu ayarlar. Üç tane var modlar:

. IMAGE: Tek resimli giriş modu.
.
. VIDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.
.
. LIVE_STREAM: Giriş canlı yayını modu kameradan alınan veriler gibi. Bu modda, resultListener, sonuçları almak üzere bir dinleyici ayarlamak için çağrıldı eşzamansız olarak ayarlayabilirsiniz.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands Maksimum el sayısı şu kullanıcı tarafından algılanabilir: GestureRecognizer. Any integer > 0 1
min_hand_detection_confidence El algılama için minimum güven puanı için başarılı bir yöntem olarak nitelendiriliyor. 0.0 - 1.0 0.5
min_hand_presence_confidence Elde tutma puanının minimum güven puanı önemli nokta algılama modelidir. Hareket Tanıyıcı'nın Video ve Canlı yayın modunda ise el yer işareti modelinin el varlığı güven puanı aşağıdaysa avuç içi algılama modelini tetikler. Aksi halde, konumunu belirlemek için basit bir el izleme algoritması ellerinizi rahatça kullanabileceksiniz. 0.0 - 1.0 0.5
min_tracking_confidence El takibi için dikkate alınacak minimum güven puanı işidir. Bu, testteki eller arasındaki sınırlayıcı kutu IoU eşiğidir geçerli kareyi ve son kareyi gösterir. Video modunda ve Akış modunda: Hareket Tanıyıcı, izleme başarısız olursa Hareket Tanıyıcı eli tetikler tespit edebilir. Aksi takdirde, 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 ile belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç sayısı: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise tüm mevcut sonuçlar döndürülür.
  • Puan eşiği: Aşağıdaki sonuçların reddedildiği puan. 0 değerine 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 kümede bulunmayan sınıflandırma sonuçları filtrelenir. Ret listesiyle birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse, kategorisi bu kümede bulunan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte hariç tutulur.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuç sayısı: 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ç sayısı: -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 ile belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç sayısı: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise tüm mevcut sonuçlar döndürülür.
  • Puan eşiği: Aşağıdaki sonuçların reddedildiği puan. 0 değerine 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 kümede bulunmayan sınıflandırma sonuçları filtrelenir. Ret listesiyle birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse, kategorisi bu kümede bulunan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte hariç tutulur.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuç sayısı: 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ç sayısı: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    result_callback Sonuç işleyiciyi sınıflandırma sonuçlarını alacak şekilde ayarlar hareket tanıyıcı canlı yayın modundayken eşzamansız olarak ayarlayabilirsiniz. Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında kullanılabilir ResultListener Yok Yok

    Verileri hazırlama

    Girişinizi bir görüntü dosyası veya Numpy dizisi olarak hazırlayın ve daha sonra mediapipe.Image nesne algılandı. Girişiniz bir video dosyası veya şunun gibi harici bir kitaplık kullanabilirsiniz: Giriş çerçevelerinizi numpy olarak yüklemek için OpenCV dizi'dir.

    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ıyıcı, tanıyabileceğiniz, tanıyabileceğiniz_videolar ve tanıyabileceğiniz fonksiyonları kullanmaktır. Hareket tanıma için bu işlem giriş verilerini ön işleme, resimdeki elleri algılama, el algılama ve önemli noktalardaki el hareketlerini tanırsınız.

    Aşağıdaki kod, işlemin 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 şunları da yapmanız gerekir: Hareket Tanıyıcı görevine giriş çerçevesinin zaman damgasını sağlayın.
    • Görüntü veya video modelinde çalışırken Hareket Tanıma görevi giriş resmini işlemeyi bitirene kadar geçerli iş parçacığını engeller veya çerçeve.
    • Canlı yayın modunda çalışırken Hareket Tanıyıcı görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır dinleyiciye bildirme işlemini tamamladığında giriş çerçevesine sahip. Hareket Tanıyıcı açıkken tanıma işlevi çağrılırsa görev başka bir kareyi işlemekle meşgul. Görev, yeni girişi yoksayacak. çerçeve.

    Bir resimde Hareket Tanımlayıcı'yı çalıştırmanın tam bir örneği için koduna bakın örnek inceleyebilirsiniz.

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

    Hareket Tanıyıcı, her hareket için birer hareket algılama sonuç nesnesi oluşturur çalışmasıdır. Sonuç nesnesi, resim koordinatlarında el işaretleri içerir dünya koordinatlarındaki el önemli noktaları, el tercihi(sol/sağ el) ve el algılanan ellerin hareket kategorilerini içerir.

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

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

    • Uygun Olduğu El

      El tercihi, 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 el önemli noktası vardır. İlgili içeriği oluşturmak için kullanılan x ve y koordinatları, resim genişliğine göre [0,0, 1,0] değerine yüksekliğine dikkat edin. z koordinatı, belirgin işaret derinliğini gösterir oryantasyon yani bilek derinliği. Değer ne kadar küçükse kameraya kadar uzanıyorum. z boyutu ile yaklaşık olarak aynı ölçeği kullanır x.

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

      21 el önemli noktaları da dünya koordinatlarıyla gösterilir. Her bir önemli nokta gerçek dünya 3D koordinatlarını temsil eden x, y ve z birleşiminden oluşur metre cinsinden, başlangıç noktası avucunun geometrik merkezinde yer alır.

    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 görüntülerde, görev çıkışının görselleştirmesi gösterilmektedir:

    Hareket Tanıyıcı örnek kodu, tanımanın nasıl görüntüleneceğini gösterir daha fazla bilgi için koda bakın örnek inceleyebilirsiniz.