Python için önemli nokta algılama rehberi

MediaPipe Poz İşaretçisi görevi, bir görüntüdeki insan vücuduna ait önemli noktaları tespit etmenizi ya da videosunu izleyin. Bu görevi vücutla ilgili önemli konumları belirlemek, duruşunuzu analiz etmek, ve hareketleri kategorilere ayırabilirsiniz. Bu görev, makine öğrenimi (ML) modellerini kullanır. tek resim veya videoyla çalışır. Görev, görüntüdeki vücut duruşunda önemli noktaları gösterir koordinatlarla ve 3 boyutlu dünya koordinatlarında gösterir.

Bu talimatlarda açıklanan kod örneğini şu adreste bulabilirsiniz: GitHub'a gidin. Özellikler, modeller ve yapılandırma seçenekleri hakkında daha fazla bilgi Bu görev hakkında daha fazla bilgi için Genel Bakış'ı inceleyin.

Kod örneği

Poz İşaretçisi için örnek kodu, bu özelliğin tam bir uygulamasını sağlar: görevi görebilir. Bu kod, görevi test etmenize ve kendi poz işaretleyicinizi oluşturmaya başladınız. Bu dosyaları görüntüleyebilir, çalıştırabilir düzenleme Poz İşaretçisi örnek kodu yalnızca web tarayıcınızı kullanarak.

Raspberry Pi için Konum İşaretçisi'ni uyguluyorsanız 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 Poz İşaretçisi'ni kullanmak için özel olarak proje kodlayacak. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı daha fazla bilgi için Python kurulum kılavuzu.

Paketler

MediaPipe Konum İşaretçisi görevi, mediapipe PyPI paketini gerektirir. Bu bağımlılıkları aşağıdakileri kullanarak 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 İşaretçisi görevi, bu görevi görebilir. Poz İşaretleyici için mevcut eğitilmiş modeller hakkında daha fazla bilgi için bkz. göreve genel bakış Modeller bölümü.

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

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

Yolu belirtmek için BaseOptions nesnesi model_asset_path parametresini kullanın modelin tüm özellikleridir. Kod örneği için sonraki bölüme bakın.

Görevi oluşturma

MediaPipe Konum İşaretçisi görevi, aşağıdaki işlemler için create_from_options işlevini kullanır: görevi ayarlayın. create_from_options işlevi, değerleri kabul eder tercih edebilirsiniz. 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ı, ve canlı yayın yapabilirsiniz.

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 İşaretçisi oluşturmaya ilişkin tam bir örnek için bkz. kod örneği hakkında daha fazla bilgi edinin.

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_poses tarafından algılanabilecek maksimum poz sayısı Poz İşaretçisi. Integer > 0 1
min_pose_detection_confidence Poz algılamanın olması için gereken minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
min_pose_presence_confidence Pozlamanın minimum güven puanı puanının yüksek olması gerekir. Float [0.0,1.0] 0.5
min_tracking_confidence Poz izleme için minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
output_segmentation_masks Poz İşaretçisi'nin algılanan öğe için bir segmentasyon maskesi verip vermediği poz verin. Boolean False
result_callback Sonuç işleyiciyi işaretleyici sonuçlarını alacak şekilde ayarlar otomatik olarak senkronize edilir. Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında kullanılabilir ResultListener N/A

Verileri hazırlama

Girişinizi bir görüntü dosyası veya Numpy dizisi olarak hazırlayın ve daha sonra bunu bir mediapipe.Image nesnesine dönüştürün. Girişiniz bir video dosyasıysa bir web kamerasından canlı yayın yapmak için 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

Poz İşaretçisi, detect, detect_for_video ve detect_async özelliklerini kullanır. fonksiyonları kullanmaktır. Poz işareti oluşturma için, ve resimdeki duruşların algılanmasında sorun yoktur.

Aşağıdaki kod, görev modeliyle işlemin nasıl yürütüleceğini gösterir.

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 de Poz İşaretçisi görevine giriş çerçevesinin zaman damgasını sağlayın.
  • Resimde veya video modelinde çalışırken, Poz İşaretçisi görevi giriş resmini işlemeyi tamamlayana kadar geçerli iş parçacığını engeller veya çerçeve.
  • Canlı yayın modunda çalışırken Poz İşaretçisi görevi geri dönüyor derhal geçerli olur ve mevcut ileti dizisi engellenmez. Sonucu çağırır dinleyiciye bir öğeyi işlemeyi bitirdiği her seferinde giriş çerçevesine sahip. Poz İşaretçisi görevi sırasında algılama işlevi çağrılırsa başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayacak.

Bir resim üzerinde Poz İşaretçisi çalıştırmaya ilişkin kapsamlı bir örnek için bkz. kod örneği inceleyebilirsiniz.

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

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

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

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ış, hem normalleştirilmiş koordinatlar (Landmarks) hem de dünya içeriyor koordinatları (WorldLandmarks) girin.

Çıkış şu normalleştirilmiş koordinatları içerir (Landmarks):

  • x ve y: Önemli nokta koordinatları: resim genişliği (x) ve yüksekliği (y).

  • z: Yer işareti derinliği; kalçaların orta noktasına kadar gelen derinliği kaynak. Değer ne kadar küçükse önemli nokta kameraya o kadar yakındır. İlgili içeriği oluşturmak için kullanılan z büyüklüğü, x ile hemen hemen aynı ölçeği kullanır.

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

Çıkış şu dünya koordinatlarını içerir (WorldLandmarks):

  • x, y ve z: Metre cinsinden gerçek 3 boyutlu koordinatlar kalçanın orta noktasını bulun.

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

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

İsteğe bağlı segmentasyon maskesi, her bir pikselin ait olma olasılığını temsil eder. geri bildirim gönderebilirsiniz. Aşağıdaki resimde, Google Etiket Yöneticisi'nin görev çıkışı:

Poz İşaretleyici örnek kodu, daha fazla bilgi edinmek için kod örneği inceleyebilirsiniz.