งานเครื่องมือจุดสังเกตของ 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
: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ
รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน
มาสก์การแบ่งกลุ่มตัวเลือกจะแสดงแนวโน้มของพิกเซลแต่ละพิกเซลที่อยู่ใน แก่บุคคลที่ตรวจจับได้ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของ เอาต์พุตของงาน:
โค้ดตัวอย่างเครื่องมือจุดสังเกตของโพสสาธิตวิธีการแสดง ผลลัพธ์ที่ส่งคืนจากงาน โปรดดู ตัวอย่างโค้ด เพื่อดูรายละเอียด