fsl-express / modules /mediapipe_generator.py
lasofeli's picture
Upload folder using huggingface_hub
bc971c7 verified
Raw
History Blame Contribute Delete
3.29 kB
import cv2 as cv
import numpy as np
import mediapipe as mp
import h5py
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_holistic = mp.solutions.holistic
def extract_to_array(landmark_list, num_landmarks, dims=3):
if not landmark_list:
return np.zeros((num_landmarks, dims))
return np.array([[lm.x, lm.y, lm.z, getattr(lm, 'visibility', 0.0)]
if dims == 4 else [lm.x, lm.y, lm.z]
for lm in landmark_list.landmark])
def save_holistic_sample(h5_path, class_id, sample_name, mediapipe_results):
pose_seq = np.array([extract_to_array(r.pose_landmarks, 33, 4) for r in mediapipe_results])
face_seq = np.array([extract_to_array(r.face_landmarks, 468, 3) for r in mediapipe_results])
lh_seq = np.array([extract_to_array(r.left_hand_landmarks, 21, 3) for r in mediapipe_results])
rh_seq = np.array([extract_to_array(r.right_hand_landmarks, 21, 3) for r in mediapipe_results])
with h5py.File(h5_path, 'a') as f:
grp = f.require_group(f"{class_id}/{sample_name}")
datasets = {
'pose': pose_seq,
'face': face_seq,
'left_hand': lh_seq,
'right_hand': rh_seq
}
for name, data in datasets.items():
if name in grp: del grp[name]
ds = grp.create_dataset(name, data=data, compression="gzip", chunks=True)
ds.attrs['dims'] = "x, y, z, visibility" if name == 'pose' else "x, y, z"
grp.attrs['frame_count'] = len(mediapipe_results)
def generate_mediapipe(filepath):
video_list = []
frame_count = 0
cap = cv.VideoCapture(filepath)
with mp_holistic.Holistic(
model_complexity=2
) as holistic:
while cap.isOpened():
ret, frame = cap.read()
frame_count += 1
if not ret:
break
results = holistic.process(cv.cvtColor(frame, cv.COLOR_BGR2RGB))
video_list.append(results)
cap.release()
cv.destroyAllWindows()
return video_list
def generate_mediapipe_gradio(filepath):
video_list = []
cap = cv.VideoCapture(filepath)
target_fps = 30
frame_interval_ms = 1000 / target_fps
max_w, max_h = 640, 360
orig_w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
orig_h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
scale = min(max_w / orig_w, max_h / orig_h)
new_dims = (int(orig_w * scale), int(orig_h * scale))
next_timestamp_to_capture = 0
with mp_holistic.Holistic(
model_complexity=2,
static_image_mode=False
) as holistic:
while cap.isOpened():
cap.set(cv.CAP_PROP_POS_MSEC, next_timestamp_to_capture)
ret, frame = cap.read()
if not ret:
break
resized_frame = cv.resize(frame, new_dims, interpolation=cv.INTER_AREA)
rgb_frame = cv.cvtColor(resized_frame, cv.COLOR_BGR2RGB)
results = holistic.process(rgb_frame)
video_list.append(results)
next_timestamp_to_capture += frame_interval_ms
cap.release()
cv.destroyAllWindows()
return video_list