Python için önemli nokta algılama rehberi

MediaPipe Pose Landmarker görevi, bir resim veya videodaki insan vücutlarının önemli noktalarını algılamanıza olanak tanır. Bu görevi, vücudun önemli konumlarını belirlemek, duruşu analiz etmek ve hareketleri sınıflandırmak için kullanabilirsiniz. Bu görevde, tek resim veya videoyla çalışan makine öğrenimi (ML) modelleri kullanılır. Görev, vücut duruşu yer işaretlerini resim koordinatlarında ve 3 boyutlu dünya koordinatlarında döndürür.

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

Pose Landmarker için örnek kod, referans olarak kullanabileceğiniz bu görevin Python'da eksiksiz bir şekilde uygulanmasını sağlar. Bu kod, bu görevi test etmenize ve kendi poz yer işaretçinizi oluşturmaya başlamanıza yardımcı olur. Yalnızca web tarayıcınızı kullanarak Pose Landmarker örnek kodunu görüntüleyebilir, çalıştırabilir ve düzenleyebilirsiniz.

Raspberry Pi için Pose Landmarker'ı uyguluyorsanız Raspberry Pi örnek uygulamasına bakın.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Pose 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 Pose 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

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

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

model_path = '/absolute/path/to/pose_landmarker.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 Pose 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. 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
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Video

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the video mode:
options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Canlı yayın

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

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

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Bir resimle kullanmak üzere poz 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_poses Poz İşaretçisi tarafından algılanabilecek maksimum poz sayısı. Integer > 0 1
min_pose_detection_confidence Poz duruşu algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
min_pose_presence_confidence Poz duruşu yer işareti algılamada poz varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
min_tracking_confidence Poz izlemenin başarılı kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
output_segmentation_masks Poz İşaretçisi'nin, algılanan poz için segmentasyon maskesi çıkışı yapıp yapmadığını belirtir. Boolean False
result_callback Sonuç dinleyicisini, Poz Landmarker canlı yayın modundayken yer işaretçisi sonuçlarını asenkron olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. ResultListener N/A

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

Poz Landmarker, çıkarım tetiğelemek için detect, detect_for_video ve detect_async işlevlerini kullanır. Poz önemli noktaları algılama için bu işlem, giriş verilerini ön işleme tabi tutmayı ve resimdeki pozları algılamayı içerir.

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

Resim

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the image mode.
pose_landmarker_result = landmarker.detect(mp_image)
    

Video

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the video mode.
pose_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

Canlı yayın

# Send live image data to perform pose landmarking.
# The results are accessible via the `result_callback` provided in
# the `PoseLandmarkerOptions` object.
# The pose 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, Poz Landmarker görevine giriş çerçevesinin zaman damgasını da sağlayın.
  • Resim veya video modelinde çalışırken Poz Landmarker görevi, giriş resmini veya kareyi işlemeyi tamamlayana kadar mevcut iş parçacığını engeller.
  • Pose Landmarker görevi, canlı yayın modunda çalışırken hemen döndürülür ve mevcut iş parçacığı engellenmez. Her giriş karesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. Poz Landmarker görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa görev yeni giriş karesini yoksayar.

Bir resimde Poz İşaretçisi çalıştırmaya dair eksiksiz bir örnek için ayrıntıları kod örneğinde bulabilirsiniz.

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

Poz İşaretçisi, her algılama çalıştırması için bir poseLandmarkerResult nesnesi döndürür. Sonuç nesnesi, her bir poz yer işaretinin koordinatlarını içerir.

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

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

Çıkış, her bir yer işareti için hem normalleştirilmiş koordinatları (Landmarks) hem de dünya koordinatlarını (WorldLandmarks) içerir.

Çıkış, aşağıdaki normalleştirilmiş koordinatları (Landmarks) içerir:

  • x ve y: Resim genişliği (x) ve yüksekliği (y) ile 0,0 ile 1,0 arasında normalleştirilmiş yer işareti koordinatları.

  • z: Başlangıç noktası kalçaların orta noktasındaki derinlik olan yer işareti derinliği. 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.

  • visibility: Önemli noktanın resimde görünme olasılığı.

Çıkış, aşağıdaki dünya koordinatlarını (WorldLandmarks) içerir:

  • x, y ve z: Kalçaların orta noktası kaynak olarak kullanılarak metre cinsinden gerçek dünyadaki 3 boyutlu koordinatlar.

  • visibility: Önemli noktanın resimde görünme olasılığı.

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

Meditasyon yapan bir kadın. Modelin duruşu, uzuvlarının ve gövdesinin konumunu gösteren bir iskeletle vurgulanır.

İsteğe bağlı segmentasyon maskesi, her pikselin algılanan bir kişiye ait olma olasılığını gösterir. Aşağıdaki resim, görev çıktısının segmentasyon maskesidir:

Önceki resmin, kadının şeklini ana hatlarıyla gösteren segmentasyon maskesi

Poz İş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.