คำแนะนำในการตรวจหาจุดสังเกตสำหรับ Python

งานเครื่องมือจุดสังเกตของ MediaPipe Pose ช่วยให้คุณตรวจหาจุดสังเกตต่างๆ ของร่างกายมนุษย์ในรูปภาพหรือ ในการสร้างสรรค์วิดีโอ คุณสามารถใช้งานนี้เพื่อระบุตำแหน่งของร่างกายที่สำคัญ วิเคราะห์ท่าทาง และจำแนกการเคลื่อนไหว งานนี้ใช้โมเดลแมชชีนเลิร์นนิง (ML) ที่ ทำงานร่วมกับรูปภาพหรือวิดีโอรายการเดียว งานจะแสดงเนื้อหาลักษณะจุดสังเกตในรูปภาพ และพิกัดโลก 3 มิติ

ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า ของงานนี้ โปรดดูภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างสำหรับเครื่องมือจุดสังเกตของ Pose ทำให้สามารถติดตั้งใช้งานได้อย่างสมบูรณ์ ใน Python เพื่อใช้เป็นข้อมูลอ้างอิง โค้ดนี้จะช่วยคุณทดสอบงานนี้และรับ เริ่มสร้างจุดสังเกต ที่เป็นท่าทางของคุณเอง คุณสามารถดู เรียกใช้ และ แก้ไข สร้างโค้ดตัวอย่างเครื่องมือจุดสังเกต โดยใช้แค่เว็บเบราว์เซอร์

ถ้าคุณใช้เครื่องมือจุดสังเกตของ Pose สำหรับ Raspberry Pi โปรดดูที่ ตัวอย่างของ Raspberry Pi แอป

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ ของ Google โดยเฉพาะเพื่อใช้ Poseจุดสังเกต สำหรับข้อมูลทั่วไปเกี่ยวกับ การตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณสำหรับการใช้งาน MediaPipe ซึ่งรวมถึง โปรดดูข้อกำหนดเวอร์ชันของแพลตฟอร์ม คู่มือการตั้งค่าสำหรับ Python

แพ็กเกจ

งานเครื่องมือจุดสังเกตของ MediaPipe Pose ต้องการแพ็กเกจ PyPI ของ Mediapipe คุณติดตั้งและนำเข้าทรัพยากร Dependency เหล่านี้ได้ด้วยฟีเจอร์ต่อไปนี้

$ python -m pip install mediapipe

การนำเข้า

นำเข้าชั้นเรียนต่อไปนี้เพื่อเข้าถึงฟังก์ชันงานเครื่องมือจุดสังเกต

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

รุ่น

งานเครื่องมือจุดสังเกตของ MediaPipe Pose ต้องใช้โมเดลที่ผ่านการฝึก ซึ่งสามารถใช้ร่วมกับ งาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกและพร้อมใช้งานสำหรับเครื่องมือจุดสังเกตของท่าทาง โปรดดูที่ ภาพรวมงานส่วนโมเดล

เลือกและดาวน์โหลดโมเดล จากนั้นเก็บโมเดลไว้ในไดเรกทอรีในเครื่อง:

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

ใช้พารามิเตอร์ BaseOptions ออบเจ็กต์ model_asset_path เพื่อระบุเส้นทาง ของโมเดลที่จะใช้ ดูตัวอย่างโค้ดได้ในส่วนถัดไป

สร้างงาน

งานเครื่องมือจุดสังเกตของ MediaPipe Pose ใช้ฟังก์ชัน create_from_options เพื่อ ตั้งค่างาน ฟังก์ชัน create_from_options ยอมรับค่า เพื่อจัดการกับตัวเลือกการกำหนดค่า สำหรับข้อมูลเพิ่มเติม โปรดดู ตัวเลือกการกำหนดค่า

โค้ดต่อไปนี้แสดงวิธีสร้างและกำหนดค่างานนี้

ตัวอย่างเหล่านี้ยังแสดงรูปแบบของการสร้างงานสำหรับรูปภาพต่างๆ ด้วย ไฟล์วิดีโอและสตรีมแบบสด

รูปภาพ

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

วิดีโอ

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

สตรีมแบบสด

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

สำหรับตัวอย่างที่สมบูรณ์ของการสร้างเครื่องมือจุดสังเกตสำหรับท่าทางสำหรับใช้กับรูปภาพ โปรดดูที่ ตัวอย่างโค้ด

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอปพลิเคชัน Python

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
running_mode ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ โหมด:

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses จำนวนท่าทางสูงสุดที่ตรวจพบโดย เครื่องมือแนะนำท่าโพส Integer > 0 1
min_pose_detection_confidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการตรวจจับท่าทาง ถือว่าประสบความสำเร็จ Float [0.0,1.0] 0.5
min_pose_presence_confidence คะแนนความเชื่อมั่นขั้นต่ำของการแสดงท่าทาง ในการตรวจหาจุดสังเกตของท่าทาง Float [0.0,1.0] 0.5
min_tracking_confidence คะแนนความเชื่อมั่นขั้นต่ำสำหรับการติดตามท่าทาง จะถือว่าประสบความสำเร็จ Float [0.0,1.0] 0.5
output_segmentation_masks เครื่องมือจุดสังเกตของท่าทางจะแสดงมาสก์การแบ่งกลุ่มสำหรับที่ตรวจพบหรือไม่ โพสท่า Boolean False
result_callback ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์ของจุดสังเกต แบบไม่พร้อมกันเมื่อเครื่องมือจุดสังเกตท่าทางอยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น ResultListener N/A

เตรียมข้อมูล

ให้เตรียมอินพุตเป็นไฟล์รูปภาพหรืออาร์เรย์แบบตัวเลข จากนั้นแปลงเป็นออบเจ็กต์ mediapipe.Image หากข้อมูลที่คุณป้อนเป็นไฟล์วิดีโอ หรือสตรีมแบบสดจากเว็บแคม คุณจะใช้ไลบรารีภายนอกได้ เช่น OpenCV เพื่อโหลดเฟรมอินพุตเป็นตัวเลข อาร์เรย์

รูปภาพ

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)
    

วิดีโอ

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)
    

สตรีมแบบสด

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)
    

เรียกใช้งาน

เครื่องมือจุดสังเกตของท่าทางใช้ detect, detect_for_video และ detect_async เพื่อทริกเกอร์การอนุมาน สำหรับการโพสท่าสำคัญ ขั้นตอนนี้เกี่ยวข้องกับ ประมวลผลข้อมูลอินพุตล่วงหน้าและตรวจจับท่าทางในรูปภาพ

โค้ดต่อไปนี้แสดงวิธีดำเนินการประมวลผลด้วยโมเดลงาน

รูปภาพ

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

วิดีโอ

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

สตรีมแบบสด

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

โปรดทราบดังต่อไปนี้

  • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด ระบุการประทับเวลาของเฟรมอินพุตให้กับงานเครื่องมือทำเครื่องหมายตำแหน่ง
  • เมื่อเรียกใช้ในภาพหรือโมเดลวิดีโอ งานเครื่องมือทำจุดสังเกต บล็อกชุดข้อความปัจจุบันจนกว่าจะประมวลผลรูปภาพอินพุตเสร็จสิ้น หรือ เฟรม
  • เมื่อทำงานในโหมดสตรีมแบบสด งานเครื่องมือบุ๊กมาร์กท่าโพสจะแสดงขึ้น ทันทีและไม่บล็อกชุดข้อความปัจจุบัน ซึ่งจะเรียกใช้ผลลัพธ์ Listener ของคุณพร้อมผลการตรวจหาทุกครั้งที่เสร็จสิ้นการประมวลผล เฟรมอินพุต หากมีการเรียกฟังก์ชันการตรวจจับเมื่องานเครื่องมือจุดสังเกตในการกำหนดท่าทาง ไม่ว่างในการประมวลผลเฟรมอื่น งานจะไม่สนใจเฟรมอินพุตใหม่

สำหรับตัวอย่างทั้งหมดของการเรียกใช้เครื่องมือจุดสังเกตสำหรับท่าทางในภาพ โปรดดูที่ ตัวอย่างโค้ด เพื่อดูรายละเอียด

จัดการและแสดงผลลัพธ์

เครื่องมือจุดสังเกตของตำแหน่งจะแสดงออบเจ็กต์ poseLandmarkerResult สำหรับการตรวจจับแต่ละรายการ วิ่งได้ ออบเจ็กต์ผลลัพธ์มีพิกัดสำหรับจุดสังเกตของท่าทางแต่ละท่าทาง

ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

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)

เอาต์พุตมีทั้งพิกัดมาตรฐาน (Landmarks) และพิกัดโลก พิกัด (WorldLandmarks) สำหรับแต่ละจุดสังเกต

เอาต์พุตมีพิกัดมาตรฐานต่อไปนี้ (Landmarks):

  • x และ y: พิกัดแลนด์มาร์กที่ปรับให้เป็นมาตรฐานระหว่าง 0.0 ถึง 1.0 ตามค่า ความกว้าง (x) และความสูงของรูปภาพ (y)

  • z: ความลึกที่สำคัญ โดยมีความลึกที่กึ่งกลางของสะโพกเท่ากับ ยิ่งค่าน้อย จุดสังเกตก็ยิ่งอยู่ใกล้กล้อง ขนาด z ใช้สเกลใกล้เคียงกับ x

  • visibility: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ

เอาต์พุตจะมีพิกัดโลกดังต่อไปนี้ (WorldLandmarks)

  • x, y และ z: พิกัด 3 มิติในโลกจริง หน่วยเป็นเมตร จุดกึ่งกลางของสะโพกเป็นจุดกำเนิด

  • visibility: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน

มาสก์การแบ่งกลุ่มตัวเลือกจะแสดงแนวโน้มของพิกเซลแต่ละพิกเซลที่อยู่ใน แก่บุคคลที่ตรวจจับได้ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของ เอาต์พุตของงาน:

โค้ดตัวอย่างเครื่องมือจุดสังเกตของโพสสาธิตวิธีการแสดง ผลลัพธ์ที่ส่งคืนจากงาน โปรดดู ตัวอย่างโค้ด เพื่อดูรายละเอียด