Spaces:
Build error
Build error
Download app.py from sems/pose-think: direct link, hf CLI and curl.
- Browser
- Download file 45 kB
-
https://huggingface.co/spaces/sems/pose-think/resolve/main/app.py
- Command line
-
hf download hf://spaces/sems/pose-think/app.py
-
curl -L -o app.py https://huggingface.co/spaces/sems/pose-think/resolve/main/app.py
45 kB
| # Pose-Think: AI-Powered Movement Analysis Suite - REAL-TIME VERSION | |
| import cv2 | |
| import mediapipe as mp | |
| import gradio as gr | |
| import numpy as np | |
| # MediaPipe initialization | |
| mp_pose = mp.solutions.pose | |
| mp_hands = mp.solutions.hands | |
| mp_drawing = mp.solutions.drawing_utils | |
| def analyze_posture(image, analysis_type="basic", age=None, height=None, weight=None): | |
| """Advanced AI-powered posture analysis with biomechanical insights""" | |
| if image is None: | |
| return None, "β No image detected / GΓΆrΓΌntΓΌ tespit edilemedi" | |
| # Convert BGR to RGB for MediaPipe processing | |
| rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
| output_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR) | |
| feedback = [] | |
| technical_analysis = [] | |
| health_recommendations = [] | |
| # Enhanced profile analysis with biomechanical calculations | |
| if analysis_type == "enhanced" and (age or height or weight): | |
| profile_info = [] | |
| biomechanical_analysis = [] | |
| if age: | |
| profile_info.append(f"Age: {age} years") | |
| # Age-related biomechanical insights | |
| if age < 25: | |
| biomechanical_analysis.append("𧬠YOUNG ADULT: Peak bone density period (20-30 years)") | |
| biomechanical_analysis.append("πͺ Muscle elasticity optimal - Focus on movement patterns") | |
| biomechanical_analysis.append("β‘ High metabolic rate supports posture correction") | |
| elif age < 45: | |
| biomechanical_analysis.append("𧬠ADULT: Bone density maintenance phase") | |
| biomechanical_analysis.append("πͺ Muscle tone declining ~1% annually after 30") | |
| biomechanical_analysis.append("β οΈ Early prevention of postural deviations critical") | |
| elif age < 65: | |
| biomechanical_analysis.append("𧬠MIDDLE-AGED: Accelerated bone density loss (~1-2%/year)") | |
| biomechanical_analysis.append("πͺ Sarcopenia onset - muscle mass loss 3-8%/decade") | |
| biomechanical_analysis.append("𦴠Increased risk of vertebral compression fractures") | |
| else: | |
| biomechanical_analysis.append("𧬠SENIOR: Significant structural changes in spine") | |
| biomechanical_analysis.append("πͺ Advanced sarcopenia - strength loss 1.5-3%/year") | |
| biomechanical_analysis.append("β οΈ High priority: Fall prevention and spinal stability") | |
| if height and weight: | |
| bmi = weight / ((height/100) ** 2) | |
| profile_info.append(f"BMI: {bmi:.1f} kg/mΒ²") | |
| # BMI-based biomechanical analysis | |
| if bmi < 18.5: | |
| biomechanical_analysis.append(f"π UNDERWEIGHT (BMI {bmi:.1f}): Reduced muscle mass affects postural stability") | |
| biomechanical_analysis.append("β οΈ Low body weight may indicate insufficient core strength") | |
| health_recommendations.append("π Increase protein intake (1.6-2.2g/kg body weight)") | |
| health_recommendations.append("ποΈ Resistance training to build postural muscles") | |
| elif bmi < 25: | |
| biomechanical_analysis.append(f"β NORMAL WEIGHT (BMI {bmi:.1f}): Optimal loading for spinal structures") | |
| biomechanical_analysis.append("πͺ Good weight distribution reduces joint stress") | |
| elif bmi < 30: | |
| biomechanical_analysis.append(f"β οΈ OVERWEIGHT (BMI {bmi:.1f}): Increased anterior load on lumbar spine") | |
| biomechanical_analysis.append("π Extra weight creates ~4x increased knee joint stress") | |
| biomechanical_analysis.append("𦴠Elevated risk of lower crossed syndrome") | |
| health_recommendations.append("π Cardio exercise: 150min/week moderate intensity") | |
| health_recommendations.append("π§ Core strengthening to counter anterior weight shift") | |
| else: | |
| biomechanical_analysis.append(f"π¨ OBESE (BMI {bmi:.1f}): Significant postural compensation patterns") | |
| biomechanical_analysis.append("π Increased thoracic kyphosis and lumbar lordosis likely") | |
| biomechanical_analysis.append("β οΈ High risk: sleep apnea affecting cervical posture") | |
| health_recommendations.append("π©Ί Medical consultation recommended for weight management") | |
| health_recommendations.append("π Low-impact exercise (swimming, aqua therapy)") | |
| if profile_info: | |
| feedback.append(f"π€ BIOMETRIC PROFILE: {' | '.join(profile_info)}") | |
| feedback.append("") | |
| if biomechanical_analysis: | |
| feedback.extend(biomechanical_analysis) | |
| feedback.append("") | |
| if analysis_type == "hand": | |
| # Advanced Hand Analysis with Biomechanical Insights | |
| with mp_hands.Hands( | |
| static_image_mode=False, | |
| max_num_hands=2, | |
| min_detection_confidence=0.5, | |
| min_tracking_confidence=0.5 | |
| ) as hands: | |
| results = hands.process(rgb_image) | |
| if results.multi_hand_landmarks: | |
| hand_count = len(results.multi_hand_landmarks) | |
| feedback.append(f"β HAND DETECTION: {hand_count} hand(s) identified") | |
| technical_analysis.append("π¬ TECHNICAL ANALYSIS:") | |
| for idx, hand_landmarks in enumerate(results.multi_hand_landmarks): | |
| mp_drawing.draw_landmarks(output_image, hand_landmarks, mp_hands.HAND_CONNECTIONS) | |
| # Advanced finger analysis | |
| landmarks = hand_landmarks.landmark | |
| fingers_up = 0 | |
| finger_angles = [] | |
| tip_ids = [4, 8, 12, 16, 20] # Thumb, Index, Middle, Ring, Pinky tips | |
| pip_ids = [3, 6, 10, 14, 18] # PIP joints | |
| mcp_ids = [2, 5, 9, 13, 17] # MCP joints | |
| finger_names = ["Thumb", "Index", "Middle", "Ring", "Pinky"] | |
| # Calculate finger extension angles | |
| for i in range(5): | |
| tip_y = landmarks[tip_ids[i]].y | |
| pip_y = landmarks[pip_ids[i]].y | |
| mcp_y = landmarks[mcp_ids[i]].y | |
| if tip_y < pip_y: # Finger extended | |
| fingers_up += 1 | |
| # Calculate extension angle | |
| if i > 0: # Not thumb | |
| extension_angle = abs(np.arctan2(tip_y - mcp_y, landmarks[tip_ids[i]].x - landmarks[mcp_ids[i]].x) * 180 / np.pi) | |
| finger_angles.append(f"{finger_names[i]}: {extension_angle:.1f}Β°") | |
| # Hand analysis results | |
| hand_side = "Right" if idx == 0 else "Left" | |
| feedback.append(f"ποΈ {hand_side} HAND ANALYSIS:") | |
| feedback.append(f" β’ Fingers Extended: {fingers_up}/5") | |
| feedback.append(f" β’ Hand Symmetry: {'Normal' if hand_count == 2 else 'Single hand detected'}") | |
| # Technical measurements | |
| if finger_angles: | |
| technical_analysis.append(f"π {hand_side} Hand Extension Angles:") | |
| for angle in finger_angles: | |
| technical_analysis.append(f" β’ {angle}") | |
| # Grip strength estimation based on finger positions | |
| if fingers_up == 0: | |
| feedback.append(" β’ Grip Pattern: FULL FIST - Strong grip indication") | |
| technical_analysis.append("πͺ Estimated grip strength: HIGH (all digits flexed)") | |
| elif fingers_up == 5: | |
| feedback.append(" β’ Grip Pattern: OPEN HAND - Relaxed extension") | |
| technical_analysis.append("π€ Hand state: RELAXED (full extension)") | |
| else: | |
| feedback.append(f" β’ Grip Pattern: PARTIAL ({fingers_up} digits extended)") | |
| technical_analysis.append(f"β‘ Mixed pattern: {fingers_up} extensors active") | |
| # Neurological assessment | |
| wrist_landmark = landmarks[0] # Wrist center | |
| middle_finger_tip = landmarks[12] # Middle finger tip | |
| hand_span = np.sqrt((middle_finger_tip.x - wrist_landmark.x)**2 + | |
| (middle_finger_tip.y - wrist_landmark.y)**2) | |
| technical_analysis.append(f"π§ Neurological Indicators:") | |
| technical_analysis.append(f" β’ Hand-span ratio: {hand_span:.3f}") | |
| technical_analysis.append(f" β’ Fine motor control: {'GOOD' if fingers_up > 0 else 'GRIP DOMINANT'}") | |
| if fingers_up == 1: # Pointing gesture | |
| technical_analysis.append("βοΈ Index pointing detected - Precise motor control active") | |
| elif fingers_up == 2: # Peace sign or similar | |
| technical_analysis.append("βοΈ Dual digit extension - Good finger independence") | |
| # Overall hand health assessment | |
| feedback.append("") | |
| feedback.append("π₯ HAND HEALTH ASSESSMENT:") | |
| if hand_count == 2: | |
| feedback.append("β Bilateral hand function - Normal neurological presentation") | |
| health_recommendations.append("π€² Continue bilateral activities for brain health") | |
| else: | |
| feedback.append("β οΈ Single hand visible - Ensure bilateral movement patterns") | |
| health_recommendations.append("π Practice bilateral coordination exercises") | |
| else: | |
| feedback.append("β NO HANDS DETECTED") | |
| feedback.append("ποΈ Position hands clearly in camera view") | |
| technical_analysis.append("π Detection Parameters:") | |
| technical_analysis.append(" β’ Minimum confidence: 50%") | |
| technical_analysis.append(" β’ Tracking confidence: 50%") | |
| technical_analysis.append(" β’ Max hands: 2") | |
| health_recommendations.append("π‘ Ensure good lighting for hand visibility") | |
| health_recommendations.append("πΌοΈ Use contrasting background for better detection") | |
| else: | |
| # Posture analysis | |
| with mp_pose.Pose( | |
| static_image_mode=False, | |
| model_complexity=1, | |
| enable_segmentation=False, | |
| min_detection_confidence=0.5, | |
| min_tracking_confidence=0.5 | |
| ) as pose: | |
| results = pose.process(rgb_image) | |
| if results.pose_landmarks: | |
| mp_drawing.draw_landmarks(output_image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) | |
| landmarks = results.pose_landmarks.landmark | |
| visible_parts = [] | |
| # Check visible parts | |
| if landmarks[mp_pose.PoseLandmark.NOSE.value].visibility > 0.5: | |
| visible_parts.append("Head") | |
| # Advanced Shoulder Analysis with Biomechanical Assessment | |
| left_shoulder = landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value] | |
| right_shoulder = landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value] | |
| if left_shoulder.visibility > 0.5 and right_shoulder.visibility > 0.5: | |
| visible_parts.append("Shoulders") | |
| # Calculate shoulder level difference in degrees and millimeters | |
| shoulder_diff = abs(left_shoulder.y - right_shoulder.y) | |
| shoulder_angle = np.arctan2(right_shoulder.y - left_shoulder.y, | |
| right_shoulder.x - left_shoulder.x) * 180 / np.pi | |
| # Estimate actual measurements (assuming average shoulder width of 40cm) | |
| shoulder_width_pixels = abs(right_shoulder.x - left_shoulder.x) | |
| if shoulder_width_pixels > 0: | |
| pixel_to_mm = 400 / shoulder_width_pixels # 400mm average shoulder width | |
| height_diff_mm = shoulder_diff * pixel_to_mm * 1000 # Convert to mm | |
| else: | |
| height_diff_mm = 0 | |
| technical_analysis.append("π¬ SHOULDER BIOMECHANICS:") | |
| technical_analysis.append(f" β’ Shoulder angle: {abs(shoulder_angle):.1f}Β° from horizontal") | |
| technical_analysis.append(f" β’ Height difference: ~{height_diff_mm:.0f}mm") | |
| technical_analysis.append(f" β’ Asymmetry ratio: {(shoulder_diff * 100):.1f}%") | |
| if shoulder_diff > 0.05: # >5% asymmetry | |
| if left_shoulder.y < right_shoulder.y: | |
| feedback.append(f"β οΈ LEFT SHOULDER ELEVATED: {height_diff_mm:.0f}mm higher") | |
| technical_analysis.append("π§ Possible causes: Left upper trap hyperactivity") | |
| technical_analysis.append("𦴠Compensation: Right lateral flexion likely") | |
| health_recommendations.append("π Left upper trapezius stretching (30s x 3)") | |
| health_recommendations.append("πͺ Right side strengthening exercises") | |
| else: | |
| feedback.append(f"β οΈ RIGHT SHOULDER ELEVATED: {height_diff_mm:.0f}mm higher") | |
| technical_analysis.append("π§ Possible causes: Right upper trap hyperactivity") | |
| technical_analysis.append("𦴠Compensation: Left lateral flexion likely") | |
| health_recommendations.append("π Right upper trapezius stretching (30s x 3)") | |
| health_recommendations.append("πͺ Left side strengthening exercises") | |
| # Additional clinical insights | |
| if shoulder_diff > 0.08: # >8% asymmetry | |
| feedback.append("π¨ SIGNIFICANT ASYMMETRY - Clinical assessment recommended") | |
| technical_analysis.append("β οΈ Risk factors: Scoliosis, muscle imbalance, ergonomic issues") | |
| health_recommendations.append("π©Ί Consider physiotherapy evaluation") | |
| else: | |
| feedback.append("β SHOULDERS LEVEL - Excellent postural symmetry") | |
| technical_analysis.append("β Normal shoulder girdle alignment") | |
| feedback.append(f"π Asymmetry: {height_diff_mm:.0f}mm (Normal: <20mm)") | |
| # Advanced Elbow Joint Analysis with Biomechanical Calculations | |
| left_elbow = landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value] | |
| right_elbow = landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value] | |
| if left_elbow.visibility > 0.5 and right_elbow.visibility > 0.5: | |
| visible_parts.append("Elbows") | |
| # Enhanced elbow angle calculations with clinical interpretation | |
| try: | |
| def calculate_angle(a, b, c): | |
| """Calculate angle between three points using vector math""" | |
| a = np.array(a) | |
| b = np.array(b) | |
| c = np.array(c) | |
| radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0]) | |
| angle = np.abs(radians * 180.0 / np.pi) | |
| if angle > 180.0: | |
| angle = 360 - angle | |
| return angle | |
| def interpret_elbow_angle(angle, side): | |
| """Clinical interpretation of elbow angles""" | |
| if angle > 165: | |
| return f"β {side} elbow: FULL EXTENSION ({angle:.1f}Β°) - Excellent mobility" | |
| elif angle > 140: | |
| return f"β {side} elbow: GOOD EXTENSION ({angle:.1f}Β°) - Normal range" | |
| elif angle > 90: | |
| return f"β οΈ {side} elbow: MODERATE FLEXION ({angle:.1f}Β°) - Check for tension" | |
| else: | |
| return f"π¨ {side} elbow: EXCESSIVE FLEXION ({angle:.1f}Β°) - Requires attention" | |
| # Left elbow biomechanical analysis | |
| left_shoulder_pos = [left_shoulder.x, left_shoulder.y] | |
| left_elbow_pos = [left_elbow.x, left_elbow.y] | |
| left_wrist_pos = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, | |
| landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y] | |
| left_angle = calculate_angle(left_shoulder_pos, left_elbow_pos, left_wrist_pos) | |
| feedback.append(interpret_elbow_angle(left_angle, "LEFT")) | |
| # Right elbow biomechanical analysis | |
| right_shoulder_pos = [right_shoulder.x, right_shoulder.y] | |
| right_elbow_pos = [right_elbow.x, right_elbow.y] | |
| right_wrist_pos = [landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].x, | |
| landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].y] | |
| right_angle = calculate_angle(right_shoulder_pos, right_elbow_pos, right_wrist_pos) | |
| feedback.append(interpret_elbow_angle(right_angle, "RIGHT")) | |
| # Bilateral comparison and clinical insights | |
| angle_difference = abs(left_angle - right_angle) | |
| technical_analysis.append("οΏ½ ELBOW JOINT BIOMECHANICS:") | |
| technical_analysis.append(f" β’ Left elbow angle: {left_angle:.1f}Β° (Normal: 0-150Β°)") | |
| technical_analysis.append(f" β’ Right elbow angle: {right_angle:.1f}Β° (Normal: 0-150Β°)") | |
| technical_analysis.append(f" β’ Bilateral difference: {angle_difference:.1f}Β°") | |
| if angle_difference > 15: | |
| feedback.append(f"β οΈ ELBOW ASYMMETRY: {angle_difference:.1f}Β° difference") | |
| technical_analysis.append("π§ Possible causes: Unilateral muscle imbalance") | |
| health_recommendations.append("π Bilateral stretching and strengthening") | |
| health_recommendations.append("ποΈ Focus on weaker side strengthening") | |
| else: | |
| feedback.append(f"β ELBOW SYMMETRY: Good bilateral balance ({angle_difference:.1f}Β°)") | |
| # Movement quality assessment | |
| avg_angle = (left_angle + right_angle) / 2 | |
| if avg_angle < 90: | |
| technical_analysis.append("π Pattern: FLEXION DOMINANT - Possible anterior head posture") | |
| health_recommendations.append("π± Reduce screen time and improve ergonomics") | |
| health_recommendations.append("π§ Chest stretches and posterior deltoid strengthening") | |
| elif avg_angle > 150: | |
| technical_analysis.append("π Pattern: EXTENSION DOMINANT - Good postural alignment") | |
| health_recommendations.append("β Maintain current activity patterns") | |
| # Clinical range of motion assessment | |
| if left_angle < 30 or right_angle < 30: | |
| feedback.append("π¨ SEVERE FLEXION CONTRACTURE detected") | |
| technical_analysis.append("β οΈ ROM limitation: May indicate joint pathology") | |
| health_recommendations.append("π©Ί Urgent: Consult orthopedic specialist") | |
| except Exception as e: | |
| feedback.append("β οΈ ELBOW ANALYSIS ERROR: Unable to calculate joint angles") | |
| technical_analysis.append(f"π§ Error details: {str(e)[:50]}...") | |
| technical_analysis.append("π‘ Ensure clear visibility of shoulder-elbow-wrist alignment") | |
| # Advanced Hip Analysis with Pelvic Biomechanics | |
| left_hip = landmarks[mp_pose.PoseLandmark.LEFT_HIP.value] | |
| right_hip = landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value] | |
| if left_hip.visibility > 0.5 and right_hip.visibility > 0.5: | |
| visible_parts.append("Hips") | |
| # Calculate pelvic obliquity and rotation | |
| hip_diff = abs(left_hip.y - right_hip.y) | |
| pelvic_angle = np.arctan2(right_hip.y - left_hip.y, | |
| right_hip.x - left_hip.x) * 180 / np.pi | |
| # Estimate pelvic measurements | |
| hip_width_pixels = abs(right_hip.x - left_hip.x) | |
| if hip_width_pixels > 0: | |
| pixel_to_mm = 300 / hip_width_pixels # 300mm average hip width | |
| pelvic_tilt_mm = hip_diff * pixel_to_mm * 1000 | |
| else: | |
| pelvic_tilt_mm = 0 | |
| technical_analysis.append("π¬ PELVIC BIOMECHANICS:") | |
| technical_analysis.append(f" β’ Pelvic obliquity: {abs(pelvic_angle):.1f}Β° from horizontal") | |
| technical_analysis.append(f" β’ Hip height difference: ~{pelvic_tilt_mm:.0f}mm") | |
| technical_analysis.append(f" β’ Frontal plane deviation: {(hip_diff * 100):.1f}%") | |
| if hip_diff > 0.03: # >3% asymmetry | |
| if left_hip.y < right_hip.y: | |
| feedback.append(f"β οΈ LEFT HIP ELEVATED: {pelvic_tilt_mm:.0f}mm higher") | |
| technical_analysis.append("𦴠Pelvic pattern: Left lateral pelvic tilt") | |
| technical_analysis.append("π§ Compensation: Right hip adductor tightness likely") | |
| health_recommendations.append("π§ Right hip adductor stretching (30s x 3)") | |
| health_recommendations.append("πͺ Left gluteus medius strengthening") | |
| health_recommendations.append("π Single-leg balance exercises") | |
| else: | |
| feedback.append(f"β οΈ RIGHT HIP ELEVATED: {pelvic_tilt_mm:.0f}mm higher") | |
| technical_analysis.append("𦴠Pelvic pattern: Right lateral pelvic tilt") | |
| technical_analysis.append("π§ Compensation: Left hip adductor tightness likely") | |
| health_recommendations.append("π§ Left hip adductor stretching (30s x 3)") | |
| health_recommendations.append("πͺ Right gluteus medius strengthening") | |
| health_recommendations.append("π Single-leg balance exercises") | |
| # Clinical implications | |
| if hip_diff > 0.05: # >5% asymmetry | |
| feedback.append("π¨ SIGNIFICANT PELVIC OBLIQUITY - Assessment recommended") | |
| technical_analysis.append("β οΈ Risk factors: Scoliosis, leg length discrepancy, SI joint dysfunction") | |
| health_recommendations.append("π©Ί Consider pelvic assessment by physiotherapist") | |
| health_recommendations.append("π Leg length measurement recommended") | |
| else: | |
| feedback.append("β HIPS LEVEL - Excellent pelvic alignment") | |
| technical_analysis.append("β Normal frontal plane pelvic position") | |
| feedback.append(f"π Pelvic obliquity: {pelvic_tilt_mm:.0f}mm (Normal: <15mm)") | |
| # Advanced Cervical Spine and Head Position Analysis | |
| nose = landmarks[mp_pose.PoseLandmark.NOSE.value] | |
| if nose.visibility > 0.5: | |
| shoulder_center_x = (left_shoulder.x + right_shoulder.x) / 2 | |
| shoulder_center_y = (left_shoulder.y + right_shoulder.y) / 2 | |
| # Calculate forward head posture | |
| head_offset_x = abs(nose.x - shoulder_center_x) | |
| head_offset_y = nose.y - shoulder_center_y | |
| # Calculate craniovertebral angle approximation | |
| cv_angle = np.arctan2(head_offset_y, head_offset_x) * 180 / np.pi | |
| technical_analysis.append("π¬ CERVICAL SPINE BIOMECHANICS:") | |
| technical_analysis.append(f" β’ Forward head posture: {head_offset_x:.3f} ratio") | |
| technical_analysis.append(f" β’ Craniovertebral angle: ~{abs(cv_angle):.1f}Β°") | |
| technical_analysis.append(f" β’ Head position: {head_offset_y:.3f} vertical offset") | |
| if head_offset_x > 0.08: # Significant forward head posture | |
| if nose.x < shoulder_center_x: | |
| feedback.append(f"β οΈ FORWARD HEAD POSTURE: Left deviation ({head_offset_x:.2f})") | |
| technical_analysis.append("π§ Pattern: Left cervical side-bending with rotation") | |
| health_recommendations.append("π Right cervical rotation stretches") | |
| health_recommendations.append("οΏ½ Deep neck flexor strengthening") | |
| else: | |
| feedback.append(f"β οΈ FORWARD HEAD POSTURE: Right deviation ({head_offset_x:.2f})") | |
| technical_analysis.append("π§ Pattern: Right cervical side-bending with rotation") | |
| health_recommendations.append("π Left cervical rotation stretches") | |
| health_recommendations.append("πͺ Deep neck flexor strengthening") | |
| # Forward head posture implications | |
| if abs(cv_angle) < 45: # Severe forward head posture | |
| feedback.append("οΏ½ SEVERE FORWARD HEAD POSTURE detected") | |
| technical_analysis.append("β οΈ Risk: Upper cervical hyperextension, suboccipital tension") | |
| health_recommendations.append("π± Immediate ergonomic assessment required") | |
| health_recommendations.append("π©Ί Consider cervical spine evaluation") | |
| # Muscle imbalance analysis | |
| technical_analysis.append("πͺ Muscle imbalance pattern:") | |
| technical_analysis.append(" β’ Tight: Upper trapezius, levator scapulae, suboccipitals") | |
| technical_analysis.append(" β’ Weak: Deep neck flexors, lower trapezius") | |
| health_recommendations.append("π§ Chin tuck exercises (10 reps x 3 sets)") | |
| health_recommendations.append("π Upper trapezius and levator scapulae stretching") | |
| health_recommendations.append("π₯οΈ Monitor height adjustment (top 1/3 at eye level)") | |
| else: | |
| feedback.append("β NECK CENTERED - Optimal cervical alignment") | |
| technical_analysis.append("β Normal cervical lordosis maintenance") | |
| if abs(cv_angle) > 50: # Good craniovertebral angle | |
| feedback.append(f"π Craniovertebral angle: {abs(cv_angle):.1f}Β° (Excellent: >50Β°)") | |
| # Enhanced Age-Specific Biomechanical Recommendations | |
| if analysis_type == "enhanced" and age: | |
| feedback.append("") | |
| feedback.append("π― AGE-SPECIFIC BIOMECHANICAL ANALYSIS:") | |
| if age < 25: | |
| feedback.append("𧬠YOUNG ADULT PHASE (Peak Development):") | |
| feedback.append(" β’ Bone density: Peak accumulation period (90% by age 20)") | |
| feedback.append(" β’ Muscle mass: Optimal growth potential") | |
| feedback.append(" β’ Neuroplasticity: High adaptation capacity") | |
| technical_analysis.append("π Physiological advantages:") | |
| technical_analysis.append(" β’ Collagen synthesis: Peak efficiency") | |
| technical_analysis.append(" β’ Proprioception: Excellent balance control") | |
| technical_analysis.append(" β’ Recovery rate: 24-48 hours optimal") | |
| health_recommendations.extend([ | |
| "π High-impact activities encouraged (bone loading)", | |
| "π€Έ Proprioceptive training for injury prevention", | |
| "πͺ Establish proper movement patterns now", | |
| "π Ergonomic education for lifelong habits" | |
| ]) | |
| elif age < 45: | |
| feedback.append("𧬠ADULT PHASE (Maintenance Period):") | |
| feedback.append(" β’ Bone density: Peak maintained, slow decline begins (~30)") | |
| feedback.append(" β’ Muscle mass: 1% annual loss after age 30") | |
| feedback.append(" β’ Flexibility: Gradual decrease without intervention") | |
| technical_analysis.append("π Physiological changes:") | |
| technical_analysis.append(" β’ Type II muscle fibers: Beginning to decline") | |
| technical_analysis.append(" β’ Connective tissue: Reduced elasticity") | |
| technical_analysis.append(" β’ Hormonal: Growth hormone decline affects recovery") | |
| health_recommendations.extend([ | |
| "ποΈ Resistance training 2-3x/week (muscle preservation)", | |
| "π§ Daily stretching routine (maintain flexibility)", | |
| "βοΈ Weight management crucial for joint health", | |
| "πΌ Workplace ergonomics assessment recommended" | |
| ]) | |
| elif age < 65: | |
| feedback.append("𧬠MIDDLE-AGE PHASE (Active Intervention):") | |
| feedback.append(" β’ Bone density: Accelerated loss (1-2% annually)") | |
| feedback.append(" β’ Sarcopenia: 3-8% muscle loss per decade") | |
| feedback.append(" β’ Balance: Proprioceptive decline increases fall risk") | |
| technical_analysis.append("οΏ½ Critical interventions needed:") | |
| technical_analysis.append(" β’ Calcium absorption: Reduced efficiency") | |
| technical_analysis.append(" β’ Postural muscles: Significant weakening") | |
| technical_analysis.append(" β’ Spinal discs: Dehydration and height loss") | |
| health_recommendations.extend([ | |
| "𦴠Weight-bearing exercise essential (bone preservation)", | |
| "βοΈ Balance training 3x/week (fall prevention)", | |
| "π Vitamin D3 + K2 supplementation consideration", | |
| "π©Ί Annual bone density screening recommended" | |
| ]) | |
| else: # 65+ | |
| feedback.append("𧬠SENIOR PHASE (Preservation Focus):") | |
| feedback.append(" β’ Bone health: High fracture risk, especially vertebral") | |
| feedback.append(" β’ Muscle power: 1.5-3% annual decline") | |
| feedback.append(" β’ Postural control: Significant balance impairment") | |
| technical_analysis.append("οΏ½ Age-related structural changes:") | |
| technical_analysis.append(" β’ Kyphosis progression: Thoracic curvature increase") | |
| technical_analysis.append(" β’ Disc height: 20-30% reduction from peak") | |
| technical_analysis.append(" β’ Reaction time: Slowed protective responses") | |
| health_recommendations.extend([ | |
| "πΆ Daily walking program (maintain bone loading)", | |
| "πΊ Chair-based exercises if mobility limited", | |
| "π Home safety assessment for fall prevention", | |
| "π₯ Group exercise classes for social engagement" | |
| ]) | |
| # Comprehensive visible parts summary with clinical significance | |
| if visible_parts: | |
| feedback.insert(0, f"β ANATOMICAL VISIBILITY: {', '.join(visible_parts)}") | |
| feedback.insert(1, f"π DETECTION CONFIDENCE: {len(visible_parts)}/4 major regions") | |
| feedback.insert(2, "") | |
| # Analysis completeness score | |
| completeness_score = (len(visible_parts) / 4) * 100 | |
| technical_analysis.insert(0, f"π¬ ANALYSIS COMPLETENESS: {completeness_score:.0f}%") | |
| if completeness_score == 100: | |
| technical_analysis.insert(1, "β Full-body biomechanical assessment possible") | |
| elif completeness_score >= 75: | |
| technical_analysis.insert(1, "β‘ Comprehensive postural analysis achieved") | |
| else: | |
| technical_analysis.insert(1, "β οΈ Limited analysis - optimize camera positioning") | |
| else: | |
| feedback.append("β POSE NOT DETECTED") | |
| feedback.append("π POSITIONING REQUIREMENTS:") | |
| feedback.append(" β’ Distance: 2-3 meters from camera") | |
| feedback.append(" β’ Lighting: Bright, even illumination") | |
| feedback.append(" β’ Background: Plain, contrasting surface") | |
| feedback.append(" β’ Posture: Stand naturally, arms relaxed") | |
| technical_analysis.append("π§ DETECTION PARAMETERS:") | |
| technical_analysis.append(" β’ Model complexity: Level 1 (balanced speed/accuracy)") | |
| technical_analysis.append(" β’ Detection confidence: 50% minimum") | |
| technical_analysis.append(" β’ Tracking confidence: 50% minimum") | |
| technical_analysis.append(" β’ Segmentation: Disabled (faster processing)") | |
| health_recommendations.extend([ | |
| "π‘ Improve lighting conditions for better detection", | |
| "πΌοΈ Use solid background wall behind you", | |
| "π Position entire body within camera frame", | |
| "π Wear fitted clothing for clearer body outline" | |
| ]) | |
| # Compile comprehensive feedback with technical insights | |
| final_feedback = [] | |
| # Add main feedback | |
| final_feedback.extend(feedback) | |
| # Add technical analysis section | |
| if technical_analysis: | |
| final_feedback.append("") | |
| final_feedback.append("οΏ½ βββ TECHNICAL BIOMECHANICAL ANALYSIS βββ") | |
| final_feedback.extend(technical_analysis) | |
| # Add health recommendations section | |
| if health_recommendations: | |
| final_feedback.append("") | |
| final_feedback.append("π₯ βββ EVIDENCE-BASED RECOMMENDATIONS βββ") | |
| final_feedback.extend(health_recommendations) | |
| # Add general wellness footer | |
| final_feedback.append("") | |
| final_feedback.append("π SCIENTIFIC BASIS:") | |
| final_feedback.append("β’ Analysis based on biomechanical research and clinical guidelines") | |
| final_feedback.append("β’ Recommendations follow evidence-based physiotherapy protocols") | |
| final_feedback.append("β’ For persistent issues, consult qualified healthcare professionals") | |
| return output_image, "\n".join(final_feedback) | |
| # Global variables for real-time settings | |
| current_analysis_type = "basic" | |
| current_age = None | |
| current_height = None | |
| current_weight = None | |
| def update_settings(analysis_type, age, height, weight): | |
| """Update global settings for real-time analysis""" | |
| global current_analysis_type, current_age, current_height, current_weight | |
| current_analysis_type = analysis_type | |
| current_age = age | |
| current_height = height | |
| current_weight = weight | |
| return f"β Settings updated: {analysis_type} mode" | |
| def live_analysis(image): | |
| """Live analysis function for real-time processing""" | |
| global current_analysis_type, current_age, current_height, current_weight | |
| return analyze_posture(image, current_analysis_type, current_age, current_height, current_weight) | |
| # Real-time Gradio Interface with enhanced AI feedback | |
| with gr.Blocks(title="π― Pose-Think: Advanced AI Movement Analysis", css=""" | |
| .gradio-container { | |
| max-width: 1400px !important; | |
| } | |
| .feedback-box { | |
| font-family: 'Monaco', 'Consolas', monospace; | |
| font-size: 12px; | |
| line-height: 1.4; | |
| } | |
| """) as demo: | |
| gr.Markdown(""" | |
| # π― Pose-Think: Advanced AI Movement Analysis Suite | |
| ## β‘ REAL-TIME biomechanical analysis with clinical insights | |
| **Enhanced AI feedback with technical measurements, biomechanical analysis, and evidence-based recommendations!** | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### βοΈ Analysis Configuration") | |
| # Analysis type selection | |
| analysis_type = gr.Radio( | |
| choices=[ | |
| ("π― Basic Posture", "basic"), | |
| ("π― Enhanced Posture", "enhanced"), | |
| ("π€ Hand Tracking", "hand") | |
| ], | |
| value="basic", | |
| label="Analysis Type" | |
| ) | |
| # Profile info (for enhanced mode) | |
| gr.Markdown("### π€ Biometric Profile (Enhanced Mode)") | |
| age_input = gr.Number(label="Age (years)", minimum=10, maximum=100, value=None) | |
| height_input = gr.Number(label="Height (cm)", minimum=100, maximum=250, value=None) | |
| weight_input = gr.Number(label="Weight (kg)", minimum=30, maximum=200, value=None) | |
| # Settings update button | |
| update_btn = gr.Button("βοΈ Update Analysis Settings", variant="primary", size="lg") | |
| settings_status = gr.Textbox( | |
| label="Configuration Status", | |
| value="Ready for advanced real-time analysis", | |
| interactive=False, | |
| lines=2 | |
| ) | |
| # Update settings when button clicked | |
| update_btn.click( | |
| fn=update_settings, | |
| inputs=[analysis_type, age_input, height_input, weight_input], | |
| outputs=[settings_status] | |
| ) | |
| # Technical info | |
| gr.Markdown(""" | |
| ### π¬ Technical Features: | |
| - **Biomechanical calculations** | |
| - **Clinical angle measurements** | |
| - **Evidence-based recommendations** | |
| - **Age-specific analysis** | |
| - **Real-time processing** | |
| """) | |
| with gr.Column(scale=2): | |
| # Real-time interface | |
| gr.Markdown("### πΉ Live Biomechanical Analysis") | |
| live_interface = gr.Interface( | |
| fn=live_analysis, | |
| inputs=gr.Image(sources=["webcam"], streaming=True), | |
| outputs=[ | |
| gr.Image(label="π― Live Analysis with Landmarks"), | |
| gr.Textbox( | |
| label="π Advanced AI Feedback & Technical Analysis", | |
| lines=25, | |
| max_lines=30, | |
| elem_classes=["feedback-box"] | |
| ) | |
| ], | |
| live=True, | |
| allow_flagging="never", | |
| show_progress=False, | |
| title=None, | |
| description="Advanced real-time biomechanical analysis with clinical insights" | |
| ) | |
| # Enhanced instructions and features | |
| gr.Markdown(""" | |
| ## οΏ½ Advanced Analysis Features | |
| ### β‘ **Real-Time Capabilities:** | |
| - **π΄ Live Camera Stream**: Continuous biomechanical analysis | |
| - **β‘ Instant Technical Feedback**: Clinical measurements in real-time | |
| - **π§ Dynamic Configuration**: Update settings while analyzing | |
| - **π Scientific Analysis**: Evidence-based biomechanical insights | |
| ### π― **Enhanced Analysis Modes:** | |
| #### π― **Basic Posture Analysis:** | |
| - Shoulder symmetry with angle calculations | |
| - Elbow joint range of motion assessment | |
| - Pelvic alignment and hip level analysis | |
| - Cervical spine positioning evaluation | |
| - Technical measurements in degrees and millimeters | |
| #### π― **Enhanced Posture Analysis:** | |
| - All basic features PLUS: | |
| - BMI-based biomechanical load analysis | |
| - Age-specific physiological insights | |
| - Clinical risk factor assessment | |
| - Evidence-based exercise recommendations | |
| - Personalized intervention strategies | |
| #### π€ **Advanced Hand Analysis:** | |
| - Individual finger extension angles | |
| - Grip strength pattern assessment | |
| - Fine motor control evaluation | |
| - Neurological function indicators | |
| - Bilateral symmetry comparison | |
| ### π **Technical Measurements:** | |
| - **Joint Angles**: Precise degree measurements using vector mathematics | |
| - **Asymmetry Ratios**: Percentage deviations from optimal alignment | |
| - **Distance Calculations**: Millimeter-level position assessments | |
| - **Range of Motion**: Clinical interpretation of movement patterns | |
| - **Biomechanical Loads**: Force distribution analysis | |
| ### οΏ½ **Clinical Insights:** | |
| - **Muscle Imbalance Patterns**: Identification of tight/weak muscle groups | |
| - **Postural Syndromes**: Recognition of common dysfunction patterns | |
| - **Risk Assessments**: Injury probability and prevention strategies | |
| - **Age-Related Changes**: Physiological adaptations and interventions | |
| - **Evidence-Based Protocols**: Research-backed exercise prescriptions | |
| ### π‘ **Optimization Tips:** | |
| - **πΈ Camera Setup**: 2-3 meters distance, eye-level positioning | |
| - **π‘ Lighting**: Bright, even illumination from front | |
| - **πΌοΈ Background**: Plain, contrasting wall surface | |
| - **π Clothing**: Fitted garments for clear body outline | |
| - **β‘ Performance**: Close unnecessary applications for smooth processing | |
| ### π©Ί **Disclaimer:** | |
| This tool provides educational biomechanical analysis and should not replace professional medical assessment. | |
| For persistent pain or significant postural deviations, consult qualified healthcare professionals. | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch( | |
| ) | |