Spaces:
Sleeping
Sleeping
File size: 9,114 Bytes
206a6f8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
import streamlit as st
import json
from streamlit_lottie import st_lottie
# Load Lottie animation from a JSON file
def load_lottiefile(filepath: str):
with open(filepath, "r") as f:
return json.load(f)
st.set_page_config(layout="wide")
st.markdown("<h1 style='text-align: center;'>Workout Easz</h1>", unsafe_allow_html=True)
lottie_animation = load_lottiefile("ltt.json")
st_lottie(lottie_animation, height=300, key="header_animation")
# Disclaimer
st.markdown("""
<div style="text-align: center; color: #FF0000;">
<strong>Disclaimer:</strong>
The performance of pose detection depends on the model's accuracy. As of now, our application uses a model with approximately 50% pose detection accuracy. Results may vary based on the quality of the video input and the model's limitations.
</div>
""", unsafe_allow_html=True)
# Introduction and Key Points
with st.expander("Introduction to MediaPipe"):
st.header("Introduction to MediaPipe")
st.write("""
MediaPipe is an open-source framework developed by Google for building multimodal machine learning pipelines. Its Pose solution is designed for high-fidelity body pose tracking, detecting 33 key body landmarks in real-time[1][2].
""")
with st.expander("Extraction of 33 Key Points"):
st.header("Extraction of 33 Key Points")
st.write("""
MediaPipe Pose detects 33 key body landmarks, each with x, y, z coordinates, and a visibility score. These landmarks represent various parts of the body, such as the nose, eyes, ears, shoulders, elbows, wrists, hips, knees, ankles, and feet[1][2].
""")
st.image("pose_landmarks_index.png", caption="MediaPipe Pose Landmarks", width=400)
# Squat Analysis
squat_expander = st.expander("Squat Form Analysis")
with squat_expander:
st.header("Squat Form Analysis")
# Key Landmarks for Squat Analysis
st.subheader("1. Key Landmarks for Squat Analysis")
st.write("""
For squat analysis, we focus on the following key landmarks:
- Shoulder (left and right)
- Hip (left and right)
- Knee (left and right)
- Ankle (left and right)
These landmarks are essential for calculating the joint angles critical for analyzing squat form[3].
""")
# Calculation of Joint Angles for Squat
st.subheader("2. Calculation of Joint Angles for Squat")
# Knee Angle
st.write("**a. Knee Angle**")
st.write("""
The knee angle is formed by the hip, knee, and ankle. It is calculated using the arctangent function:
""")
st.latex(r"\theta_{\text{knee}} = \left| \frac{180}{\pi} \times \left( \arctan2(y_{\text{ankle}} - y_{\text{knee}}, x_{\text{ankle}} - x_{\text{knee}}) - \arctan2(y_{\text{hip}} - y_{\text{knee}}, x_{\text{hip}} - x_{\text{knee}}) \right) \right|")
# Hip Angle
st.write("**b. Hip Angle**")
st.write("""
The hip angle is formed by the shoulder, hip, and knee. It is calculated similarly:
""")
st.latex(r"\theta_{\text{hip}} = \left| \frac{180}{\pi} \times \left( \arctan2(y_{\text{knee}} - y_{\text{hip}}, x_{\text{knee}} - x_{\text{hip}}) - \arctan2(y_{\text{shoulder}} - y_{\text{hip}}, x_{\text{shoulder}} - x_{\text{hip}}) \right) \right|")
# Back Angle
st.write("**c. Back Angle**")
st.write("""
The back angle is formed by the shoulder, hip, and ankle:
""")
st.latex(r"\theta_{\text{back}} = \left| \frac{180}{\pi} \times \left( \arctan2(y_{\text{ankle}} - y_{\text{hip}}, x_{\text{ankle}} - x_{\text{hip}}) - \arctan2(y_{\text{shoulder}} - y_{\text{hip}}, x_{\text{shoulder}} - x_{\text{hip}}) \right) \right|")
# Form Issue Detection for Squat
st.subheader("3. Form Issue Detection for Squat")
st.write("**Ideal Angle Ranges:**")
st.write("""
- Knee Angle: 90 to 110 degrees
- Hip Angle: 80 to 100 degrees
- Back Angle: 70 to 90 degrees
""")
st.write("**Detection of Deviations:**")
st.write("""
- Knees Bending Too Much: Knee angle < 90 degrees
- Hips Bending Too Much: Hip angle < 80 degrees
- Back Leaning Too Much: Back angle < 70 degrees
""")
# Providing Suggestions for Squat
st.subheader("4. Providing Suggestions for Squat")
st.write("""
Based on the detected form issues, specific suggestions are provided:
1. Knees Bending Too Much:
- Suggestion: "Watch your knee bend. Ensure your knees do not bend excessively and maintain proper alignment with your toes."
2. Hips Bending Too Much:
- Suggestion: "Keep your hips higher. Avoid excessive hip bending by maintaining a more upright posture."
3. Back Leaning Too Much:
- Suggestion: "Maintain a straighter back. Focus on keeping your back straight and avoid leaning forward excessively."
""")
# Push-up Analysis
pushup_expander = st.expander("Push-up Form Analysis")
with pushup_expander:
st.header("Push-up Form Analysis")
# Key Landmarks for Push-up Analysis
st.subheader("1. Key Landmarks for Push-up Analysis")
st.write("""
For push-up analysis, we focus on the following key landmarks:
- Shoulder (left and right)
- Elbow (left and right)
- Wrist (left and right)
- Hip (left and right)
- Ankle (left and right)
These landmarks are crucial for calculating the joint angles and body alignment in push-ups[3].
""")
# Calculation of Joint Angles for Push-up
st.subheader("2. Calculation of Joint Angles for Push-up")
# Elbow Angle
st.write("**a. Elbow Angle**")
st.write("""
The elbow angle is formed by the shoulder, elbow, and wrist. It is calculated using:
""")
st.latex(r"\theta_{\text{elbow}} = \left| \frac{180}{\pi} \times \left( \arctan2(y_{\text{wrist}} - y_{\text{elbow}}, x_{\text{wrist}} - x_{\text{elbow}}) - \arctan2(y_{\text{shoulder}} - y_{\text{elbow}}, x_{\text{shoulder}} - x_{\text{elbow}}) \right) \right|")
# Body Alignment Angle
st.write("**b. Body Alignment Angle**")
st.write("""
The body alignment angle is formed by the shoulder, hip, and ankle. It is calculated as:
""")
st.latex(r"\theta_{\text{alignment}} = \left| \frac{180}{\pi} \times \left( \arctan2(y_{\text{ankle}} - y_{\text{hip}}, x_{\text{ankle}} - x_{\text{hip}}) - \arctan2(y_{\text{shoulder}} - y_{\text{hip}}, x_{\text{shoulder}} - x_{\text{hip}}) \right) \right|")
# Form Issue Detection for Push-up
st.subheader("3. Form Issue Detection for Push-up")
st.write("**Ideal Angle Ranges:**")
st.write("""
- Elbow Angle: 90 to 110 degrees (at the bottom of the push-up)
- Body Alignment Angle: 170 to 180 degrees (straight body)
""")
st.write("**Detection of Deviations:**")
st.write("""
- Incomplete Push-up: Elbow angle > 110 degrees at the bottom
- Elbow Flaring: Elbow angle < 90 degrees
- Sagging Hips: Body alignment angle < 170 degrees
""")
# Providing Suggestions for Push-up
st.subheader("4. Providing Suggestions for Push-up")
st.write("""
Based on the detected form issues, specific suggestions are provided:
1. Incomplete Push-up:
- Suggestion: "Lower your body further. Aim to bring your chest closer to the ground for a full range of motion."
2. Elbow Flaring:
- Suggestion: "Keep your elbows closer to your body. Tuck them in to engage your chest and triceps more effectively."
3. Sagging Hips:
- Suggestion: "Maintain a straight body line. Engage your core to keep your hips aligned with your shoulders and ankles."
""")
# Conclusion
with st.expander("Conclusion",expanded=False):
st.write("""
By leveraging MediaPipe's pose estimation capabilities, this application can effectively analyze both squat and push-up forms. It calculates key joint angles and body alignments, compares them to ideal ranges, and provides specific suggestions for improvement. This approach enables users to receive real-time feedback on their exercise technique, helping them to perform exercises correctly and reduce the risk of injury[1][2][3].
""")
# Version Updates
with st.expander("Version Updates", expanded=False):
st.header("Version Updates")
st.subheader("Current Version")
st.write("""
**Current Update:** As of today, our application now includes both squat and push-up form analysis.
""")
st.subheader("Previous Versions")
st.write("""
**Initial Release:** Squat workout analysis, released on July 19th.
""")
st.write("""
Stay tuned for more updates as we continue to enhance our application's features and performance.
""")
# References
with st.expander("References"):
st.header("References")
st.write("""
[1] [MediaPipe Pose Documentation](https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/pose.md)
[2] [Google AI Edge - MediaPipe Pose Landmarker](https://ai.google.dev/edge/mediapipe/solutions/vision/pose_landmarker)
[3] [Real-time Human Pose Estimation using MediaPipe](https://sigmoidal.ai/en/real-time-human-pose-estimation-using-mediapipe/)
[4] [Kaggle Dataset for Push-Up Analysis](https://www.kaggle.com/datasets/mohamadashrafsalama/pushup)
""")
|