Skip to content

Instantly share code, notes, and snippets.

@lanzani
Last active April 15, 2024 03:24
Show Gist options
  • Save lanzani/f85175d8fbdafcabb7d480dd1bb769d9 to your computer and use it in GitHub Desktop.
Save lanzani/f85175d8fbdafcabb7d480dd1bb769d9 to your computer and use it in GitHub Desktop.
Use mediapipe to find multiple person 3d keypoints
import cv2
import numpy as np
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
from mediapipe.framework.formats import landmark_pb2
# Model available to download here: https://developers.google.com/mediapipe/solutions/vision/pose_landmarker#models
model_path = "pose_landmarker_full.task"
video_source = 0
num_poses = 4
min_pose_detection_confidence = 0.5
min_pose_presence_confidence = 0.5
min_tracking_confidence = 0.5
def draw_landmarks_on_image(rgb_image, detection_result):
pose_landmarks_list = detection_result.pose_landmarks
annotated_image = np.copy(rgb_image)
# Loop through the detected poses to visualize.
for idx in range(len(pose_landmarks_list)):
pose_landmarks = pose_landmarks_list[idx]
pose_landmarks_proto = landmark_pb2.NormalizedLandmarkList()
pose_landmarks_proto.landmark.extend([
landmark_pb2.NormalizedLandmark(
x=landmark.x,
y=landmark.y,
z=landmark.z) for landmark in pose_landmarks
])
mp.solutions.drawing_utils.draw_landmarks(
annotated_image,
pose_landmarks_proto,
mp.solutions.pose.POSE_CONNECTIONS,
mp.solutions.drawing_styles.get_default_pose_landmarks_style())
return annotated_image
to_window = None
last_timestamp_ms = 0
def print_result(detection_result: vision.PoseLandmarkerResult, output_image: mp.Image,
timestamp_ms: int):
global to_window
global last_timestamp_ms
if timestamp_ms < last_timestamp_ms:
return
last_timestamp_ms = timestamp_ms
# print("pose landmarker result: {}".format(detection_result))
to_window = cv2.cvtColor(
draw_landmarks_on_image(output_image.numpy_view(), detection_result), cv2.COLOR_RGB2BGR)
base_options = python.BaseOptions(model_asset_path=model_path)
options = vision.PoseLandmarkerOptions(
base_options=base_options,
running_mode=vision.RunningMode.LIVE_STREAM,
num_poses=num_poses,
min_pose_detection_confidence=min_pose_detection_confidence,
min_pose_presence_confidence=min_pose_presence_confidence,
min_tracking_confidence=min_tracking_confidence,
output_segmentation_masks=False,
result_callback=print_result
)
with vision.PoseLandmarker.create_from_options(options) as landmarker:
# Use OpenCV’s VideoCapture to start capturing from the webcam.
cap = cv2.VideoCapture(video_source)
# Create a loop to read the latest frame from the camera using VideoCapture#read()
while cap.isOpened():
success, image = cap.read()
if not success:
print("Image capture failed.")
break
# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(
image_format=mp.ImageFormat.SRGB,
data=cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
timestamp_ms = int(cv2.getTickCount() / cv2.getTickFrequency() * 1000)
landmarker.detect_async(mp_image, timestamp_ms)
if to_window is not None:
cv2.imshow("MediaPipe Pose Landmark", to_window)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
@dablro12
Copy link

dablro12 commented Mar 28, 2024

Thank your for hardly sarching. If I did't find your medium post, I have a long time to make multi-person algorithms

@lanzani
Copy link
Author

lanzani commented Mar 28, 2024

You are welcome! Thank you for stopping by :)

Really appreciate :)

@lanzani
Copy link
Author

lanzani commented Mar 28, 2024

If you want, you can write a medium tutorial on how to use mediapipe pose estimation with multi people and I will add your post to jetson-docs.com's blog :)

@dablro12
Copy link

If you want, you can write a medium tutorial on how to use mediapipe pose estimation with multi people and I will add your post to jetson-docs.com's blog :)

It’s an interesting thing!, cuz I knew blazed pose detection model from mediapipe document was made of single person detection. so i want to know why this model is operating from multiple person. Did you know how it detect multiple person? if you know, Can you reply for me?

@lanzani
Copy link
Author

lanzani commented Mar 28, 2024

Cool! I'm curious too! I don't know how mediapipe does it, but let me know if you find something interesting :)

@dablro12
Copy link

dablro12 commented Mar 29, 2024

I find how to using this model with multiple person, Blaze Pose model from mediapipe pose model is operating only Pose Detect (two types of Modules from this model). then If we set all component of multiple pose(option num pose >= 2), 1st module(detector) were detect multi pose landmark at first video frame and 2nd module(Tracker) were using from frist frame pose landmark. so we can use multiple pose detection model

다운로드

+) if you want to know detail of model. Enter my post link of multiple pose detetion model architecture.

Link : https://dablro12.tistory.com/12

In order to widely inform Koreans about this met
hod, I wrote it in the Korean version.
It's a hassle, but please understand.

@phamtrantriem
Copy link

I find how to using this model with multiple person, Blaze Pose model from mediapipe pose model is operating only Pose Detect (two types of Modules from this model). then If we set all component of multiple pose(option num pose >= 2), 1st module(detector) were detect multi pose landmark at first video frame and 2nd module(Tracker) were using from frist frame pose landmark. so we can use multiple pose detection model

다운로드

+) if you want to know detail of model. Enter my post link of multiple pose detetion model architecture.

Link : https://dablro12.tistory.com/12

In order to widely inform Koreans about this met hod, I wrote it in the Korean version. It's a hassle, but please understand.

did it work? I'm gonna convert it into mediapipe flugin unity

@dablro12
Copy link

dablro12 commented Apr 15, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment