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