HumanCenteredAI/olliedetection
0
1import streamlit as st2import numpy as np, cv2, pickle3from tensorflow.keras.models import load_model4from attention import Attention5from pose_utils import extract_pose_sequence6from utils.face_recognition import verify_user7from utils.feedback_rules import feedback_from_landmarks8import tempfile, mediapipe as mp9 10st.set_page_config(page_title="Ollie Mistake Detector", layout="wide")11st.title("🛹 Ollie Success & Mistake Classifier")12 13# Load model and encodings14model = load_model("models/ollie_classifier.h5", custom_objects={"Attention": Attention})15known_encodings, known_names = pickle.load(open("models/face_encodings.pkl", "rb"))16 17uploaded_file = st.file_uploader("Upload or record your ollie video (.mp4/.mov)", type=["mp4","mov"])18 19if uploaded_file:20 with tempfile.NamedTemporaryFile(delete=False) as temp:21 temp.write(uploaded_file.read())22 video_path = temp.name23 24 # Verify face (first frame)25 cap = cv2.VideoCapture(video_path)26 ret, frame = cap.read(); cap.release()27 user = verify_user(frame, known_encodings, known_names)28 29 if user:30 st.success(f"Face verified: {user}")31 seq = extract_pose_sequence(video_path)32 pred = model.predict(seq[np.newaxis, ...])[0]33 labels = ["Ollie Failure", "Ollie Successful"]34 result = labels[np.argmax(pred)]35 conf = np.max(pred)36 37 st.markdown(f"### 🧠 Prediction: **{result}** ({conf*100:.2f}%)")38 39 if result == "Ollie Failure":40 landmarks = {41 'hip_y': 0.4, 'foot_y': 0.3,42 'front_foot_slide': 0.02,43 'back_foot_pop': 0.03,44 'back_foot_lift': 0.0545 }46 feedback = feedback_from_landmarks(landmarks)47 st.warning(f"⚠️ Mistake detected: {feedback}")48 49 st.video(video_path)50 51 else:52 st.error("❌ Face not recognized. Please register your face.")53 