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

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

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

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

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

หากคุณใช้ Pose Landinger สำหรับ Raspberry Pi โปรดอ่านแอปตัวอย่าง Raspberry Pi

ตั้งค่า

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

กล่องพัสดุ

งาน MediaPipe Pose Marker ต้องใช้แพ็กเกจ Mediapipe PyPI คุณจะติดตั้งและนำเข้าทรัพยากร Dependency ต่อไปนี้ได้

$ python -m pip install mediapipe

การนำเข้า

นำเข้าชั้นเรียนต่อไปนี้เพื่อเข้าถึงฟังก์ชันงาน Pose Marker

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

รุ่น

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

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

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

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

สร้างงาน

งาน MediaPipe Pose Marker จะใช้ฟังก์ชัน 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.
  # ...
    

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

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

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

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

IMAGE: โหมดสำหรับการป้อนข้อมูลรูปภาพเดียว

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

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 Poseจุดสังเกตแสดงมาสก์การแบ่งกลุ่มสำหรับท่าทางที่ตรวจพบหรือไม่ Boolean False
result_callback ตั้งค่า Listener ผลลัพธ์ให้รับผลลัพธ์ของจุดสังเกต แบบไม่พร้อมกันเมื่อ Pose Marker อยู่ในโหมดสตรีมแบบสด ใช้ได้เมื่อตั้งค่าโหมดการทำงานเป็น 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)
    

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

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

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

แฮนเดิลและแสดงผลลัพธ์

Pose Landinger จะแสดงผลออบเจ็กต์ 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: แนวโน้มที่จุดสังเกตจะปรากฏให้เห็นภายในรูปภาพ

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

มาสก์การแบ่งกลุ่ม (ไม่บังคับ) แสดงถึงความเป็นไปได้ที่พิกเซลแต่ละพิกเซลจะเป็นของบุคคลที่ตรวจพบ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของเอาต์พุตงาน

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