Python için önemli nokta algılama rehberi

MediaPipe Pose Interester görevi, bir görüntü veya videodaki insan vücudunun önemli noktalarını tespit etmenizi sağlar. Bu görevi önemli vücut konumlarını belirlemek, duruşunuzu analiz etmek ve hareketleri sınıflandırmak için kullanabilirsiniz. Bu görev, tek görüntüler veya videolarla çalışan makine öğrenimi (ML) modellerini kullanır. Görev, vücut pozisyonu yer işaretlerini resim koordinatlarında ve 3 boyutlu dünya koordinatlarında üretir.

Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.

Kod örneği

Pose {9/}er örnek kodu, size referans olması açısından bu görevin Python'da eksiksiz bir uygulamasını sunmaktadır. Bu kod, görevi test etmenize ve kendi poz belirleyicinizi oluşturmaya başlamanıza yardımcı olur. Pose Builderer örnek kodunu yalnızca web tarayıcınızı kullanarak görüntüleyebilir, çalıştırabilir ve düzenleyebilirsiniz.

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

Kurulum

Bu bölümde, geliştirme ortamınızı oluşturmak için atılacak önemli adımlar ve projelerinizi, özellikle PoseSIGNer'ı kullanacak şekilde kodlamak için izlemeniz gereken temel adımlar açıklanmaktadır. 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 Pose {9/}er görevi için mediapipe PyPI paketi gerekir. Bu bağımlılıkları aşağıdakileri kullanarak yükleyebilir ve içe aktarabilirsiniz:

$ python -m pip install mediapipe

İçe Aktarımlar

Pose Referans Aracı 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 pozisyon simgesi için bu görevle uyumlu, eğitilmiş bir model gerekir. Posegrounder için eğitilmiş modeller hakkında daha fazla bilgi almak ü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/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şturma

MediaPipe Pose sitenizin işareti 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. Daha fazla bilgi 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ı yayın için görev yapısının varyasyonlarını da gösterir.

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

Resimle birlikte kullanmak üzere bir Pose Referans Aracı oluşturmanın tam bir örneği için kod örneğine bakın.

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_poses Pose İşaretleyici tarafından tespit edilebilen maksimum poz sayısı. Integer > 0 1
min_pose_detection_confidence Poz 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 önemli nokta algılamasında pozisyon varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
min_tracking_confidence Poz izlemenin başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
output_segmentation_masks Posegrounder'ın algılanan poz için segmentasyon maskesi oluşturup oluşturmadığı. Boolean False
result_callback Sonuç işleyiciyi, Posegrounder canlı yayın modundayken belirgin işaretleyici sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma modu LIVE_STREAM olarak ayarlandığında kullanılabilir ResultListener N/A

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 bir video dosyası veya bir web kamerasından 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

Pose Referans Aracı, çıkarımları tetiklemek için detect, detect_for_video ve detect_async işlevlerini kullanır. Poz belirginleştirmesi için bu işlem, giriş verilerinin ön işlenmesini ve resimdeki pozların algılanmasını içerir.

Aşağıdaki kod, işlemenin görev modeliyle 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, Pose İşaretleyici görevine giriş karesinin zaman damgasını da sağlayın.
  • Resim veya video modelinde çalışırken, Pose verici görevi, giriş resmini veya çerçevesini işlemeyi bitirene kadar geçerli iş parçacığını engeller.
  • Canlı yayın modunda çalışırken, Pose Referans Aracı görevi anında geri döner ve mevcut ileti dizisini engellemez. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyiciyi çağırır. Konum İşaretçisi görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa görev yeni giriş çerçevesini yoksayar.

Bir resimde Pose İşaretleyici'nin çalıştırılmasıyla ilgili eksiksiz bir örnek için kod örneğine göz atın.

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

Pose İşaretleyici, her algılama çalıştırması için bir poseLandmarkerResult nesnesi döndürür. Sonuç nesnesi, her bir poz önemli noktası için koordinatları içerir.

Aşağıda, bu görevden alınan çı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ış, her önemli nokta 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: Önemli nokta koordinatları, resim genişliği (x) ve yüksekliğine (y) göre 0,0 ile 1,0 arasında normalleştirilmiştir.

  • z: Referans noktası olarak kalçaların orta noktasındaki derinliğin yer aldığı belirgin nokta derinliği. Değer ne kadar küçükse yer işareti kameraya o kadar yakın olur. Z'nin büyüklüğü, yaklaşık olarak x ile 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: Kalçaların orta noktası başlangıç noktası olmak üzere metre cinsinden gerçek dünyadan 3 boyutlu koordinatlar.

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

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

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

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