Python için el ile ilgili önemli noktaları algılama rehberi

MediaPipe El Önemli Noktası Belirleyici görevi, bir resimdeki ellerin önemli noktalarını algılamanıza olanak tanır. Bu talimatlarda, El İşaretçisi'nin Python ile nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz.

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

El İşaretçisi için örnek kodda, bu görevin Python'da tam bir uygulaması referans olarak sunulmaktadır. Bu kod, bu görevi test etmenize ve kendi el yer işareti algılama aracınızı oluşturmaya başlamanıza yardımcı olur. Yalnızca web tarayıcınızı kullanarak El İşaretçisi örnek kodunu görüntüleyebilir, çalıştırabilir ve düzenleyebilirsiniz.

Raspberry Pi için El İşaretçisi'ni uyguluyorsanız Raspberry Pi örnek uygulamasına bakın.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Hand Landmarker'ı kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Python için kurulum kılavuzu başlıklı makaleyi inceleyin.

Paketler

MediaPipe Hand Landmarker görevi için mediapipe PyPI paketi gerekir. Bu bağımlılıkları aşağıdakilerle yükleyip içe aktarabilirsiniz:

$ python -m pip install mediapipe

İçe aktarılanlar

El İşaretçisi 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 Hand Landmarker görevi için bu görevle uyumlu bir eğitimli model gerekir. El İşaretçisi için mevcut eğitimli modeller hakkında daha fazla bilgi edinmek istiyorsanız göreve genel bakıştaki Modeller bölümüne bakın.

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

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

Kullanılacak modelin yolunu belirtmek için BaseOptions nesnesi model_asset_path parametresini kullanın. Kod örneği için sonraki bölüme bakın.

Görevi oluşturun

MediaPipe Hand Landmarker görevi, görevi ayarlamak için create_from_options işlevini kullanır. create_from_options işlevi, yapılandırma seçeneklerinin işleyeceği değerleri kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

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

Bu örneklerde, resimler, video dosyaları ve canlı yayın için görev oluşturmanın varyasyonları da gösterilmektedir.

Resim

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

Canlı yayın

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

Bir resimle kullanmak üzere el yer işaretçisi oluşturma ile ilgili eksiksiz bir örnek için kod örneğine bakın.

Yapılandırma seçenekleri

Bu görevde, Python uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

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 resim girişleri için kullanılan mod.

VIDEO: Bir videonun kod çözülmüş karelerinin modu.

LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands El yer işareti algılayıcısı tarafından algılanan maksimum el sayısı. Any integer > 0 1
min_hand_detection_confidence Avuç içi algılama modelinde el algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. 0.0 - 1.0 0.5
min_hand_presence_confidence El yer işareti algılama modelindeki el varlığı puanı için minimum güven puanı. Video modu ve canlı yayın modunda, el yer işareti modelinden elde edilen el varlığı güven puanı bu eşiğin altındaysa El Yer İşareti Belirleyici, avuç içi algılama modelini tetikler. Aksi takdirde, sonraki önemli nokta algılamaları için ellerin konumunu hafif bir el izleme algoritması belirler. 0.0 - 1.0 0.5
min_tracking_confidence El izlemenin başarılı kabul edilmesi için gereken minimum güven puanı. Bu, geçerli çerçevedeki ve son çerçevedeki eller arasındaki sınırlayıcı kutu IoU eşiğidir. El İşaretçisi'nin Video modu ve Akış modunda, izleme başarısız olursa El İşaretçisi el algılamayı tetikler. Aksi takdirde el algılama atlanır. 0.0 - 1.0 0.5
result_callback Sonuç dinleyicisini, el yer işaretleyicisi canlı yayın modundayken algılama sonuçlarını asenkron olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında geçerlidir Yok Yok

Verileri hazırlama

Girişinizi resim dosyası veya numpy dizisi olarak hazırlayın, ardından mediapipe.Image nesnesine dönüştürün. Girişiniz bir video dosyası veya web kamerasından canlı yayınsa giriş karelerinizi numpy 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

El Yer İşaretçisi, çıkarım başlatmak için detect, detect_for_video ve detect_async işlevlerini kullanır. El önemli noktaları algılama için giriş verilerini ön işleme, resimdeki elleri ve el önemli noktalarını algılama işlemleri yapılır.

Aşağıdaki kodda, işleme işleminin görev modeliyle nasıl yürütüleceği gösterilmektedir.

Resim

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

Canlı yayın

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

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

  • Video modunda veya canlı yayın modunda çalışırken El İşaretleyici görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
  • El yer işaretleyici görevi, resim veya video modelinde çalışırken giriş resmini ya da kareyi işlemeyi tamamlayana kadar mevcut iş parçacısını engeller.
  • El İşaretleyici görevi, canlı yayın modunda çalışırken mevcut iş parçacığını engellemez ancak hemen döndürülür. Her giriş çerçevesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. El İşaretleyici görevi başka bir kareyi işlerken algılama işlevi çağrılırsa görev yeni giriş karesini yoksayar.

Bir resimde El Yer İşaretçisi'nin çalıştırıldığı tam bir örnek için ayrıntılı bilgi içeren kod örneğine bakın.

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

El yer işaretleyici, her algılama çalıştırması için bir el yer işaretleyicisi sonuç nesnesi oluşturur. Sonuç nesnesi, resim koordinatlarında el yer işaretlerini, dünya koordinatlarında el yer işaretlerini ve algılanan ellerin el hakimiyetini(sol/sağ el) içerir.

Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:

HandLandmarkerResult çıkışı üç bileşen içerir. Her bileşen bir dizidir ve her öğe, algılanan tek bir el için aşağıdaki sonuçları içerir:

  • El tercihi

    El tercihi, algılanan ellerin sol el mi yoksa sağ el mi olduğunu gösterir.

  • Önemli noktalar

    Her biri x, y ve z koordinatlarından oluşan 21 el yer işareti vardır. x ve y koordinatları, sırasıyla resim genişliği ve yüksekliğine göre [0,0; 1,0] aralığında normalleştirilir. z koordinatı, bilekteki derinliğin orijin olduğu yer işareti derinliğini temsil eder. Değer ne kadar küçükse yer işareti kameraya o kadar yakındır. z büyüklüğü, x ile yaklaşık olarak aynı ölçeği kullanır.

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

    21 el yer işareti de dünya koordinatlarında sunulur. Her önemli nokta, x, y ve z değerlerinden oluşur. Bu değerler, orijini elin geometrik merkezinde olan, gerçek dünyadaki 3D koordinatları metre cinsinden temsil eder.

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)

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

Başparmağını kaldıran bir elin iskelet yapısının haritalandığı resim

El İşaretçisi örnek kodunda, görevden döndürülen sonuçların nasıl görüntüleneceği gösterilmektedir. Ayrıntılar için kod örneğine bakın.