Я использую 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 для обнаружения поз нескольких человек? Существуют ли какие-либо конкретные методы или параметры, которые я могу настроить для достижения лучших результатов?
Некоторые конкретные проблемы, с которыми я сталкиваюсь, включают:
Модель теряет представление о позах, когда люди двигаются или меняют ориентацию.
Модель с трудом различает похожие позы (например, два или более человека стоят с поднятыми руками). >
Точность модели снижается, если в кадре больше двух человек
Я использую Pose Landmarker от MediaPipe для обнаружения поз в видеопотоке, но у меня возникают проблемы с точностью и отслеживанием, когда в кадре находится несколько людей. Модель может распознавать позы одного или двух людей, но она становится неточной и теряет отслеживание поз, когда людей становится больше. Вот что я сделал на данный момент: [code]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()
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)
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() [/code] Я пробовал настроить параметры num_poses, min_pose_detection_confidence, min_pose_presence_confidence и min_tracking_confidence , но существенных изменений я не заметил. улучшения. Как повысить точность и отслеживание Pose Landmarker MediaPipe для обнаружения поз нескольких человек? Существуют ли какие-либо конкретные методы или параметры, которые я могу настроить для достижения лучших результатов? Некоторые конкретные проблемы, с которыми я сталкиваюсь, включают: [list] [*]Модель теряет представление о позах, когда люди двигаются или меняют ориентацию. [*]Модель с трудом различает похожие позы (например, два или более человека стоят с поднятыми руками). > [*]Точность модели снижается, если в кадре больше двух человек [/list]
function st_makeenvelope (двойная точность, двойная точность, двойная точность, двойная точность, целое число) не существует
Подсказка: Никакая функция не соответствует данным имени и типам аргументов. Вам может потребоваться добавить явные типы....
Я хотел бы создать фитнес-игру, которая бы использовала распознавание поз, чтобы различать такие движения, как стояние на месте, прыжки, бег и т. д. Первоначально я начал создавать эту программу, используя программное обеспечение Google Teachable...
Я хотел бы создать фитнес-игру, которая бы использовала распознавание поз, чтобы различать такие движения, как стояние на месте, прыжки, бег и т. д. Первоначально я начал создавать эту программу, используя программное обеспечение Google Teachable...
Матрица путаницы показывает, как реальные метки сравниваются с прогнозируемыми метками для задачи двоичной классификации.
Используя матрицу путаницы, вычислите следующее:
Точность: какая часть прогнозов оказалась верной?
Точность: какая доля...