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)
""")