pose-think / app.py
sems's picture
Upload app.py
2a53ad6 verified
raw
history blame
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(
)