Как повысить точность и отслеживание определения поз нескольких человек с помощью MediaPipe?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как повысить точность и отслеживание определения поз нескольких человек с помощью MediaPipe?

Сообщение Anonymous »

Я использую Pose Landmarker от MediaPipe для обнаружения поз в видеопотоке, но у меня возникают проблемы с точностью и отслеживанием, когда в кадре находится несколько людей. Модель может распознавать позы одного или двух людей, но она становится неточной и теряет отслеживание поз, когда людей становится больше.
Вот что я сделал на данный момент:

Код: Выделить всё

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_path = "pose_landmarker_full.task"

video_source = 'sample5.mp4'

def is_webcam_active(index):
cap = cv2.VideoCapture(index)
if not cap.isOpened():
print(f"Webcam {index} is not active or cannot be accessed")
return False
else:
print(f"Webcam {index} is active")
cap.release()
return True

# detect which webcam is active
webcam_0 = 0
webcam_1 = 1
webcam_2 = 2
active_webcam = None

# check if both webcams are active
if is_webcam_active(webcam_0):
active_webcam = webcam_0
elif is_webcam_active(webcam_1):
active_webcam = webcam_1
elif is_webcam_active(webcam_2):
active_webcam = webcam_2
else:
print("************ERROR:  webcams are not active")
exit()

video_source = active_webcam

num_poses = 3
min_pose_detection_confidence = 0.5
min_pose_presence_confidence = 0.4
min_tracking_confidence = 0.5

mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

def draw_landmarks_on_frame(frame, detection_result):
pose_landmarks_list = detection_result.pose_landmarks

# 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(
frame,
pose_landmarks_proto,
mp_pose.POSE_CONNECTIONS,
mp.solutions.drawing_styles.get_default_pose_landmarks_style())
return frame

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)

fps = 0
prev_tick = cv2.getTickCount()

base_options = python.BaseOptions(model_asset_path=model_path)
options = vision.PoseLandmarkerOptions(
base_options=base_options,
running_mode=vision.RunningMode.VIDEO,
num_poses=num_poses,
min_pose_detection_confidence=min_pose_detection_confidence,
min_pose_presence_confidence=min_pose_detection_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, frame = cap.read()
if not success:
print("Image capture failed.")
break

frame = cv2.resize(frame, (600, 800))

blank_frame = np.zeros((800, 600, 3), dtype=np.uint8)
# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(
image_format=mp.ImageFormat.SRGB,
data=cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
timestamp_ms = int(cv2.getTickCount() / cv2.getTickFrequency() * 1000)
#landmarker.detect_async(mp_image, timestamp_ms)
results = landmarker.detect_for_video(mp_image, timestamp_ms)

if results.pose_landmarks:

# Process the results
blank_frame = draw_landmarks_on_frame(blank_frame, results)
#mp_drawing.draw_landmarks(frame, results.pose_landmarks, custom_connections)

cv2.imshow('INPUT', frame)
cv2.imshow('OUTPUT', blank_frame)
curr_tick = cv2.getTickCount()
fps = 1 / ((curr_tick - prev_tick) / cv2.getTickFrequency())
prev_tick = curr_tick

# Print the FPS
print(f"FPS: {fps:.2f}")

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()
Я пробовал настроить параметры num_poses, min_pose_detection_confidence, min_pose_presence_confidence и min_tracking_confidence , но существенных изменений я не заметил. улучшения.
Как повысить точность и отслеживание Pose Landmarker MediaPipe для обнаружения поз нескольких человек? Существуют ли какие-либо конкретные методы или параметры, которые я могу настроить для достижения лучших результатов?
Некоторые конкретные проблемы, с которыми я сталкиваюсь, включают:
  • Модель теряет представление о позах, когда люди двигаются или меняют ориентацию.
  • Модель с трудом различает похожие позы (например, два или более человека стоят с поднятыми руками). >
  • Точность модели снижается, если в кадре больше двух человек


Подробнее здесь: https://stackoverflow.com/questions/787 ... ing-mediap
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»