Files changed (5) hide show
  1. Dockerfile +31 -0
  2. MediaPipe_Model .pkl +3 -0
  3. app.py +822 -0
  4. pose_links.txt +125 -0
  5. requirements.txt +10 -0
Dockerfile ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use Python 3.11 slim image as base
2
+ FROM python:3.11-slim
3
+
4
+ # Set working directory
5
+ WORKDIR /code
6
+
7
+ # Install system dependencies
8
+ RUN apt-get update && apt-get install -y \
9
+ libgl1-mesa-glx \
10
+ libglib2.0-0 \
11
+ && rm -rf /var/lib/apt/lists/*
12
+
13
+ # Set MPLCONFIGDIR to a writable directory
14
+ ENV MPLCONFIGDIR=/tmp/.config/matplotlib
15
+
16
+ # Copy requirements file
17
+ COPY requirements.txt .
18
+
19
+ # Install Python dependencies
20
+ RUN pip install --no-cache-dir -r requirements.txt
21
+
22
+ # Copy the application code
23
+ COPY app.py .
24
+ COPY MediaPipe_Model.pkl .
25
+ COPY pose_links.txt .
26
+
27
+ # Expose the port the app runs on
28
+ EXPOSE 7860
29
+
30
+ # Command to run the application
31
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860", "--proxy-headers"]
MediaPipe_Model .pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:18789ce8a6d6acffa6e3eb0de4374400b9c7d73c6c2f5b2204ab2649ccdddf2e
3
+ size 230764769
app.py ADDED
@@ -0,0 +1,822 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, UploadFile, File, HTTPException
2
+ from fastapi.responses import JSONResponse
3
+ import uvicorn
4
+ import cv2
5
+ import numpy as np
6
+ import joblib
7
+ import mediapipe as mp
8
+ import tempfile
9
+ import os
10
+ import pandas as pd
11
+ import matplotlib.pyplot as plt
12
+ from typing import Optional
13
+
14
+ # MediaPipe setup
15
+ mp_pose = mp.solutions.pose
16
+ mp_drawing = mp.solutions.drawing_utils
17
+ pose = mp_pose.Pose()
18
+
19
+ # Load model and mappings
20
+ model = joblib.load("MediaPipe_Model.pkl")
21
+
22
+ label_to_pose_name = {
23
+ 0: 'adho mukha svanasana',
24
+ 1: 'adho mukha vriksasana',
25
+ 2: 'agnistambhasana', 3: 'ananda balasana', 4: 'anantasana', 5: 'anjaneyasana', 6: 'ardha bhekasana', 7: 'ardha chandrasana', 8: 'ardha matsyendrasana', 9: 'ardha pincha mayurasana', 10: 'ardha uttanasana', 11: 'ashtanga namaskara', 12: 'astavakrasana', 13: 'baddha konasana', 14: 'bakasana', 15: 'balasana', 16: 'bhairavasana', 17: 'bharadvajasana i', 18: 'bhekasana', 19: 'bhujangasana', 20: 'bhujapidasana', 21: 'bitilasana', 22: 'camatkarasana', 23: 'chakravakasana', 24: 'chaturanga dandasana', 25: 'dandasana', 26: 'dhanurasana', 27: 'durvasasana', 28: 'dwi pada viparita dandasana', 29: 'eka pada koundinyanasana i', 30: 'eka pada koundinyanasana ii', 31: 'eka pada rajakapotasana', 32: 'eka pada rajakapotasana ii', 33: 'ganda bherundasana', 34: 'garbha pindasana', 35: 'garudasana', 36: 'gomukhasana', 37: 'halasana', 38: 'hanumanasana', 39: 'janu sirsasana', 40: 'kapotasana', 41: 'krounchasana', 42: 'kurmasana', 43: 'lolasana', 44: 'makara adho mukha svanasana', 45: 'makarasana', 46: 'malasana', 47: 'marichyasana i', 48: 'marichyasana iii', 49: 'marjaryasana', 50: 'matsyasana', 51: 'mayurasana', 52: 'natarajasana', 53: 'padangusthasana', 54: 'padmasana', 55: 'parighasana', 56: 'paripurna navasana', 57: 'parivrtta janu sirsasana', 58: 'parivrtta parsvakonasana', 59: 'parivrtta trikonasana', 60: 'parsva bakasana', 61: 'parsvottanasana', 62: 'pasasana', 63: 'paschimottanasana', 64: 'phalakasana', 65: 'pincha mayurasana', 66: 'prasarita padottanasana', 67: 'purvottanasana', 68: 'salabhasana', 69: 'salamba bhujangasana', 70: 'salamba sarvangasana', 71: 'salamba sirsasana', 72: 'savasana', 73: 'setu bandha sarvangasana', 74: 'simhasana', 75: 'sukhasana', 76: 'supta baddha konasana', 77: 'supta matsyendrasana', 78: 'supta padangusthasana', 79: 'supta virasana', 80: 'tadasana', 81: 'tittibhasana', 82: 'tolasana', 83: 'tulasana', 84: 'upavistha konasana', 85: 'urdhva dhanurasana', 86: 'urdhva hastasana', 87: 'urdhva mukha svanasana', 88: 'urdhva prasarita eka padasana', 89: 'ustrasana', 90: 'utkatasana', 91: 'uttana shishosana', 92: 'uttanasana', 93: 'utthita ashwa sanchalanasana', 94: 'utthita hasta padangustasana', 95: 'utthita parsvakonasana', 96: 'utthita trikonasana', 97: 'vajrasana', 98: 'vasisthasana', 99: 'viparita karani', 100: 'virabhadrasana i', 101: 'virabhadrasana ii', 102: 'virabhadrasana iii', 103: 'virasana', 104: 'vriksasana', 105: 'vrischikasana', 106: 'yoganidrasana'
26
+ }
27
+
28
+ # CSV file containing image links
29
+ csv_path = r"C:\Users\Hp\Desktop\YOGA\pose_links.csv"
30
+
31
+ # Reference angles for feedback
32
+ reference_angles = {
33
+ "adho mukha svanasana": {
34
+ "left_elbow": 150,
35
+ "right_elbow": 150,
36
+ "left_hip": 120,
37
+ "right_hip": 120,
38
+ "neck": 90,
39
+ "shoulders": 120,
40
+ # Add more joints as necessary
41
+ },
42
+ "adho mukha vriksasana": {
43
+ "left_elbow": 180,
44
+ "right_elbow": 180,
45
+ "neck": 90,
46
+ "shoulders": 120,
47
+ # Add more joints
48
+ },
49
+ "agnistambhasana": {
50
+ "left_knee": 90,
51
+ "right_knee": 90,
52
+ "left_hip": 90,
53
+ "right_hip": 90,
54
+ "neck": 0,
55
+ "shoulders": 120,
56
+ # Add more joints
57
+ },
58
+ "ananda balasana": {
59
+ "left_knee": 90,
60
+ "right_knee": 90,
61
+ "left_hip": 90,
62
+ "right_hip": 90,
63
+ "neck": 0,
64
+ "shoulders": 120,
65
+ # Add more joints
66
+ },
67
+ "anantasana": {
68
+ "left_leg": 90, # Leg extended upwards
69
+ "right_leg": 0, # Bent leg support
70
+ "neck": 0,
71
+ "shoulders": 120,
72
+ # Add more joints
73
+ },
74
+ "anjaneyasana": {
75
+ "left_knee": 90,
76
+ "right_knee": 180,
77
+ "left_hip": 90,
78
+ "right_hip": 90,
79
+ "neck": 0,
80
+ "shoulders": 120,
81
+ # Add more joints
82
+ },
83
+ "ardha bhekasana": {
84
+ "left_leg": 90,
85
+ "right_leg": 0,
86
+ "left_hip": 90,
87
+ "neck": 0,
88
+ "shoulders": 120,
89
+ # Add more joints
90
+ },
91
+ "ardha chandrasana": {
92
+ "left_leg": 90,
93
+ "right_leg": 180,
94
+ "neck": 0,
95
+ "shoulders": 120,
96
+ # Add more joints
97
+ },
98
+ "ardha matsyendrasana": {
99
+ "left_knee": 90,
100
+ "right_knee": 90,
101
+ "left_hip": 60,
102
+ "right_hip": 60,
103
+ "neck": 0,
104
+ "shoulders": 120,
105
+ # Add more joints
106
+ },
107
+ "ardha pincha mayurasana": {
108
+ "left_elbow": 150,
109
+ "right_elbow": 150,
110
+ "neck": 90,
111
+ "shoulders": 120,
112
+ # Add more joints
113
+ },
114
+ "ardha uttanasana": {
115
+ "left_knee": 180,
116
+ "right_knee": 180,
117
+ "neck": 0,
118
+ "shoulders": 120,
119
+ # Add more joints
120
+ },
121
+ "ashtanga namaskara": {
122
+ "left_elbow": 90,
123
+ "right_elbow": 90,
124
+ "neck": 0,
125
+ "shoulders": 120,
126
+ # Add more joints
127
+ },
128
+ "astavakrasana": {
129
+ "left_leg": 90,
130
+ "right_leg": 90,
131
+ "left_hip": 45,
132
+ "neck": 0,
133
+ "shoulders": 120,
134
+ # Add more joints
135
+ },
136
+ "baddha konasana": {
137
+ "left_knee": 90,
138
+ "right_knee": 90,
139
+ "left_hip": 90,
140
+ "neck": 0,
141
+ "shoulders": 120,
142
+ # Add more joints
143
+ },
144
+ "bakasana": {
145
+ "left_elbow": 90,
146
+ "right_elbow": 90,
147
+ "neck": 0,
148
+ "shoulders": 120,
149
+ # Add more joints
150
+ },
151
+ "balasana": {
152
+ "left_knee": 90,
153
+ "right_knee": 90,
154
+ "left_hip": 90,
155
+ "neck": 0,
156
+ "shoulders": 120,
157
+ # Add more joints
158
+ },
159
+ "bhairavasana": {
160
+ "left_knee": 90,
161
+ "right_knee": 90,
162
+ "left_hip": 60,
163
+ "right_hip": 60,
164
+ "neck": 0,
165
+ "shoulders": 120,
166
+ # Add more joints
167
+ },
168
+ "bharadvajasana i": {
169
+ "left_knee": 90,
170
+ "right_knee": 90,
171
+ "left_hip": 60,
172
+ "right_hip": 60,
173
+ "neck": 0,
174
+ "shoulders": 120,
175
+ # Add more joints
176
+ },
177
+ "bhekasana": {
178
+ "left_leg": 90,
179
+ "right_leg": 0,
180
+ "left_hip": 90,
181
+ "neck": 0,
182
+ "shoulders": 120,
183
+ # Add more joints
184
+ },
185
+ "bhujangasana": {
186
+ "left_elbow": 120,
187
+ "right_elbow": 120,
188
+ "neck": 0,
189
+ "shoulders": 120,
190
+ # Add more joints
191
+ },
192
+ "bhujapidasana": {
193
+ "left_elbow": 90,
194
+ "right_elbow": 90,
195
+ "neck": 0,
196
+ "shoulders": 120,
197
+ # Add more joints
198
+ },
199
+ "bitilasana": {
200
+ "left_knee": 90,
201
+ "right_knee": 90,
202
+ "neck": 0,
203
+ "shoulders": 120,
204
+ # Add more joints
205
+ },
206
+ "camatkarasana": {
207
+ "left_leg": 90,
208
+ "right_leg": 90,
209
+ "neck": 0,
210
+ "shoulders": 120,
211
+ # Add more joints
212
+ },
213
+ "chakravakasana": {
214
+ "left_knee": 90,
215
+ "right_knee": 90,
216
+ "neck": 0,
217
+ "shoulders": 120,
218
+ # Add more joints
219
+ },
220
+ "chaturanga dandasana": {
221
+ "left_elbow": 90,
222
+ "right_elbow": 90,
223
+ "neck": 0,
224
+ "shoulders": 120,
225
+ # Add more joints
226
+ },
227
+ "dandasana": {
228
+ "left_knee": 180,
229
+ "right_knee": 180,
230
+ "neck": 0,
231
+ "shoulders": 120,
232
+ # Add more joints
233
+ },
234
+ "dhanurasana": {
235
+ "left_leg": 90,
236
+ "right_leg": 90,
237
+ "left_hip": 90,
238
+ "neck": 0,
239
+ "shoulders": 120,
240
+ # Add more joints
241
+ },
242
+ "durvasasana": {
243
+ "left_leg": 90,
244
+ "right_leg": 90,
245
+ "left_hip": 90,
246
+ "neck": 0,
247
+ "shoulders": 120,
248
+ # Add more joints
249
+ },
250
+ "dwi pada viparita dandasana": {
251
+ "left_knee": 180,
252
+ "right_knee": 180,
253
+ "neck": 0,
254
+ "shoulders": 120,
255
+ # Add more joints
256
+ },
257
+ "eka pada koundinyanasana i": {
258
+ "left_leg": 90,
259
+ "right_leg": 180,
260
+ "neck": 0,
261
+ "shoulders": 120,
262
+ # Add more joints
263
+ },
264
+ "eka pada koundinyanasana ii": {
265
+ "left_leg": 90,
266
+ "right_leg": 180,
267
+ "neck": 0,
268
+ "shoulders": 120,
269
+ # Add more joints
270
+ },
271
+ "eka pada rajakapotasana": {
272
+ "left_knee": 90,
273
+ "right_knee": 180,
274
+ "neck": 0,
275
+ "shoulders": 120,
276
+ # Add more joints
277
+ },
278
+ "eka pada rajakapotasana ii": {
279
+ "left_knee": 90,
280
+ "right_knee": 180,
281
+ "neck": 0,
282
+ "shoulders": 120,
283
+ # Add more joints
284
+ },
285
+ "ganda bherundasana": {
286
+ "left_knee": 90,
287
+ "right_knee": 90,
288
+ "neck": 0,
289
+ "shoulders": 120,
290
+ # Add more joints
291
+ },
292
+ "garbha pindasana": {
293
+ "left_leg": 90,
294
+ "right_leg": 90,
295
+ "neck": 0,
296
+ "shoulders": 120,
297
+ # Add more joints
298
+ },
299
+ "garudasana": {
300
+ "left_knee": 90,
301
+ "right_knee": 90,
302
+ "neck": 0,
303
+ "shoulders": 120,
304
+ # Add more joints
305
+ },
306
+ "gomukhasana": {
307
+ "left_knee": 90,
308
+ "right_knee": 90,
309
+ "neck": 0,
310
+ "shoulders": 120,
311
+ # Add more joints
312
+ },
313
+ "halasana": {
314
+ "left_knee": 180,
315
+ "right_knee": 180,
316
+ "neck": 0,
317
+ "shoulders": 120,
318
+ # Add more joints
319
+ },
320
+ "hanumanasana": {
321
+ "left_leg": 90,
322
+ "right_leg": 180,
323
+ "neck": 0,
324
+ "shoulders": 120,
325
+ # Add more joints
326
+ },
327
+ "janu sirsasana": {
328
+ "left_knee": 90,
329
+ "right_knee": 180,
330
+ "neck": 0,
331
+ "shoulders": 120,
332
+ # Add more joints
333
+ },
334
+ "kapotasana": {
335
+ "left_knee": 90,
336
+ "right_knee": 180,
337
+ "neck": 0,
338
+ "shoulders": 120,
339
+ # Add more joints
340
+ },
341
+ "krounchasana": {
342
+ "left_leg": 90,
343
+ "right_leg": 180,
344
+ "neck": 0,
345
+ "shoulders": 120,
346
+ # Add more joints
347
+ },
348
+ "kurmasana": {
349
+ "left_knee": 90,
350
+ "right_knee": 90,
351
+ "neck": 0,
352
+ "shoulders": 120,
353
+ # Add more joints
354
+ },
355
+ "lolasana": {
356
+ "left_knee": 90,
357
+ "right_knee": 90,
358
+ "neck": 0,
359
+ "shoulders": 120,
360
+ # Add more joints
361
+ },
362
+ "makara adho mukha svanasana": {
363
+ "left_elbow": 150,
364
+ "right_elbow": 150,
365
+ "neck": 90,
366
+ "shoulders": 120,
367
+ # Add more joints
368
+ },
369
+ "makarasana": {
370
+ "left_elbow": 120,
371
+ "right_elbow": 120,
372
+ "neck": 0,
373
+ "hip": 180,
374
+ "shoulders": 120,
375
+ # Add more joints
376
+ },
377
+ "malasana": {
378
+ "left_knee": 90,
379
+ "right_knee": 90,
380
+ "neck": 0,
381
+ "shoulders": 120,
382
+ # Add more joints
383
+ },
384
+ "marichyasana i": {
385
+ "left_knee": 90,
386
+ "right_knee": 90,
387
+ "neck": 0,
388
+ "shoulders": 120,
389
+ # Add more joints
390
+ },
391
+ "marichyasana iii": {
392
+ "left_knee": 90,
393
+ "right_knee": 90,
394
+ "neck": 0,
395
+ "shoulders": 120,
396
+ # Add more joints
397
+ },
398
+ "marjaryasana": {
399
+ "left_knee": 90,
400
+ "right_knee": 90,
401
+ "neck": 0,
402
+ "shoulders": 120,
403
+ # Add more joints
404
+ },
405
+ "matsyasana": {
406
+ "left_knee": 90,
407
+ "right_knee": 180,
408
+ "neck": 0,
409
+ "shoulders": 120,
410
+ # Add more joints
411
+ },
412
+ "mayurasana": {
413
+ "left_elbow": 90,
414
+ "right_elbow": 90,
415
+ "neck": 0,
416
+ "shoulders": 120,
417
+ # Add more joints
418
+ },
419
+ "natarajasana": {
420
+ "left_leg": 90,
421
+ "right_leg": 0,
422
+ "neck": 0,
423
+ "shoulders": 120,
424
+ # Add more joints
425
+ },
426
+ "padangusthasana": {
427
+ "left_knee": 180,
428
+ "right_knee": 180,
429
+ "neck": 0,
430
+ "shoulders": 120,
431
+ # Add more joints
432
+ },
433
+ "padmasana": {
434
+ "left_elbow": 90,
435
+ "right_elbow": 90,
436
+ # Add more joints
437
+ },
438
+ "parighasana": {
439
+ "left_knee": 90,
440
+ "right_knee": 90,
441
+ "neck": 0,
442
+ "shoulders": 120,
443
+ # Add more joints
444
+ },
445
+ "paripurna navasana": {
446
+ "left_knee": 180,
447
+ "right_knee": 180,
448
+ "neck": 0,
449
+ "shoulders": 120,
450
+ # Add more joints
451
+ },
452
+ "parivrtta janu sirsasana": {
453
+ "left_knee": 90,
454
+ "right_knee": 180,
455
+ "neck": 0,
456
+ "shoulders": 120,
457
+ # Add more joints
458
+ },
459
+ "parivrtta parsvakonasana": {
460
+ "left_knee": 90,
461
+ "right_knee": 90,
462
+ "neck": 0,
463
+ "shoulders": 120,
464
+ # Add more joints
465
+ },
466
+ "parivrtta trikonasana": {
467
+ "left_knee": 90,
468
+ "right_knee": 90,
469
+ "neck": 0,
470
+ "shoulders": 120,
471
+ # Add more joints
472
+ },
473
+ "parsva bakasana": {
474
+ "left_elbow": 90,
475
+ "right_elbow": 90,
476
+ "neck": 0,
477
+ "shoulders": 120,
478
+ # Add more joints
479
+ },
480
+ "parsvottanasana": {
481
+ "left_knee": 180,
482
+ "right_knee": 180,
483
+ "neck": 0,
484
+ "shoulders": 120,
485
+ # Add more joints
486
+ },
487
+ "pasasana": {
488
+ "left_knee": 90,
489
+ "right_knee": 90,
490
+ "neck": 0,
491
+ "shoulders": 120,
492
+ # Add more joints
493
+ },
494
+ "paschimottanasana": {
495
+ "left_knee": 180,
496
+ "right_knee": 180,
497
+ "neck": 0,
498
+ "shoulders": 120,
499
+ # Add more joints
500
+ },
501
+ "phalakasana": {
502
+ "left_elbow": 90,
503
+ "right_elbow": 90,
504
+ "neck": 0,
505
+ "shoulders": 120,
506
+ # Add more joints
507
+ },
508
+ "pincha mayurasana": {
509
+ "left_elbow": 150,
510
+ "right_elbow": 150,
511
+ "neck": 90,
512
+ "shoulders": 120,
513
+ # Add more joints
514
+ },
515
+ "prasarita padottanasana": {
516
+ "left_knee": 180,
517
+ "right_knee": 180,
518
+ "neck": 0,
519
+ "shoulders": 120,
520
+ # Add more joints
521
+ },
522
+ "purvottanasana": {
523
+ "left_knee": 180,
524
+ "right_knee": 180,
525
+ "neck": 0,
526
+ "shoulders": 120,
527
+ # Add more joints
528
+ },
529
+ "salabhasana": {
530
+ "left_knee": 90,
531
+ "right_knee": 90,
532
+ "neck": 0,
533
+ "shoulders": 120,
534
+ # Add more joints
535
+ },
536
+ "salamba bhujangasana": {
537
+ "left_elbow": 120,
538
+ "right_elbow": 120,
539
+ "neck": 0,
540
+ "shoulders": 120,
541
+ # Add more joints
542
+ },
543
+ "salamba sarvangasana": {
544
+ "left_knee": 180,
545
+ "right_knee": 180,
546
+ "neck": 0,
547
+ "shoulders": 120,
548
+ # Add more joints
549
+ },
550
+ "salamba sirsasana": {
551
+ "left_knee": 90,
552
+ "right_knee": 90,
553
+ "neck": 0,
554
+ "shoulders": 120,
555
+ # Add more joints
556
+ },
557
+ "savasana": {
558
+ "left_knee": 90,
559
+ "right_knee": 90,
560
+ "neck": 0,
561
+ "shoulders": 120,
562
+ # Add more joints
563
+ },
564
+ "setu bandha sarvangasana": {
565
+ "left_knee": 90,
566
+ "right_knee": 90,
567
+ "neck": 0,
568
+ "shoulders": 120,
569
+ # Add more joints
570
+ },
571
+ "simhasana": {
572
+ "left_knee": 90,
573
+ "right_knee": 90,
574
+ "neck": 0,
575
+ "shoulders": 120,
576
+ # Add more joints
577
+ },
578
+ "sukhasana": {
579
+ "left_knee": 90,
580
+ "right_knee": 90,
581
+ "neck": 0,
582
+ "shoulders": 120,
583
+ # Add more joints
584
+ },
585
+ "supta baddha konasana": {
586
+ "left_knee": 90,
587
+ "right_knee": 90,
588
+ "neck": 0,
589
+ "shoulders": 120,
590
+ # Add more joints
591
+ },
592
+ "supta matsyendrasana": {
593
+ "left_knee": 90,
594
+ "right_knee": 180,
595
+ "neck": 0,
596
+ "shoulders": 120,
597
+ # Add more joints
598
+ },
599
+ "supta matsyasana": {
600
+ "left_knee": 90,
601
+ "right_knee": 180,
602
+ "neck": 0,
603
+ "shoulders": 120,
604
+ # Add more joints
605
+ }
606
+ }
607
+
608
+
609
+ # Initialize FastAPI
610
+ app = FastAPI()
611
+
612
+
613
+ def calculate_angle(a, b, c):
614
+ """
615
+ Calculate the angle between three points.
616
+ """
617
+ ba = np.array([a[0] - b[0], a[1] - b[1]])
618
+ bc = np.array([c[0] - b[0], c[1] - b[1]])
619
+ cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
620
+ angle = np.arccos(np.clip(cosine_angle, -1.0, 1.0))
621
+ return np.degrees(angle)
622
+
623
+
624
+ def extract_angles(landmarks):
625
+ """
626
+ Extracts angles between key body points using Mediapipe landmarks.
627
+
628
+ Parameters:
629
+ landmarks: A list of Mediapipe landmarks.
630
+
631
+ Returns:
632
+ A dictionary of angles with body parts as keys.
633
+ """
634
+ angles = {}
635
+
636
+ # Calculate angles for left and right arms
637
+ angles["left_elbow"] = calculate_angle(
638
+ [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
639
+ landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y],
640
+ [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x,
641
+ landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y],
642
+ [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x,
643
+ landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]
644
+ )
645
+
646
+ angles["right_elbow"] = calculate_angle(
647
+ [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
648
+ landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y],
649
+ [landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].x,
650
+ landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].y],
651
+ [landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].x,
652
+ landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].y]
653
+ )
654
+
655
+ # Calculate angles for left and right knees
656
+ angles["left_knee"] = calculate_angle(
657
+ [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,
658
+ landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y],
659
+ [landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].x,
660
+ landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].y],
661
+ [landmarks[mp_pose.PoseLandmark.LEFT_ANKLE.value].x,
662
+ landmarks[mp_pose.PoseLandmark.LEFT_ANKLE.value].y]
663
+ )
664
+
665
+ angles["right_knee"] = calculate_angle(
666
+ [landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].x,
667
+ landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].y],
668
+ [landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].x,
669
+ landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].y],
670
+ [landmarks[mp_pose.PoseLandmark.RIGHT_ANKLE.value].x,
671
+ landmarks[mp_pose.PoseLandmark.RIGHT_ANKLE.value].y]
672
+ )
673
+
674
+ # Calculate the neck angle
675
+ angles["neck"] = calculate_angle(
676
+ [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
677
+ landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y],
678
+ [landmarks[mp_pose.PoseLandmark.NOSE.value].x,
679
+ landmarks[mp_pose.PoseLandmark.NOSE.value].y],
680
+ [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
681
+ landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y]
682
+ )
683
+
684
+ # Calculate hip and shoulder angles
685
+ angles["left_hip"] = calculate_angle(
686
+ [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
687
+ landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y],
688
+ [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,
689
+ landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y],
690
+ [landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].x,
691
+ landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].y]
692
+ )
693
+
694
+ angles["right_hip"] = calculate_angle(
695
+ [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
696
+ landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y],
697
+ [landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].x,
698
+ landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].y],
699
+ [landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].x,
700
+ landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].y]
701
+ )
702
+
703
+ angles["left_shoulder"] = calculate_angle(
704
+ [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
705
+ landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y],
706
+ [landmarks[mp_pose.PoseLandmark.NOSE.value].x,
707
+ landmarks[mp_pose.PoseLandmark.NOSE.value].y],
708
+ [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
709
+ landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y]
710
+ )
711
+
712
+ angles["right_shoulder"] = calculate_angle(
713
+ [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
714
+ landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y],
715
+ [landmarks[mp_pose.PoseLandmark.NOSE.value].x,
716
+ landmarks[mp_pose.PoseLandmark.NOSE.value].y],
717
+ [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
718
+ landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
719
+ )
720
+
721
+ return angles
722
+
723
+ def get_reference_image_link(predicted_pose: str) -> Optional[str]:
724
+ """
725
+ Get the reference image link for the given predicted pose from the text file.
726
+ """
727
+ text_file_path = "pose_links.txt" # Update with the correct path
728
+
729
+ try:
730
+ with open(text_file_path, "r") as f:
731
+ lines = f.readlines()
732
+
733
+ for line in lines:
734
+ parts = line.strip().split(",") # Split by comma
735
+ if len(parts) != 2: # Validate the format
736
+ continue
737
+ pose_name, image_link = parts[0].strip().lower(), parts[1].strip()
738
+
739
+ if pose_name == predicted_pose.lower():
740
+ return image_link
741
+
742
+ return None # Return None if no match found
743
+ except FileNotFoundError:
744
+ raise HTTPException(status_code=500, detail="Text file for pose links not found")
745
+ except Exception as e:
746
+ raise HTTPException(status_code=500, detail=f"Error reading text file: {str(e)}")
747
+
748
+
749
+ @app.get("/")
750
+ def read_root():
751
+ return {"message": "Yoga pose app"}
752
+
753
+ @app.post("/predict/")
754
+ async def predict_pose(file: UploadFile = File(...)):
755
+ """
756
+ Predict the yoga pose and provide feedback.
757
+ """
758
+ try:
759
+ # Save uploaded file to a temporary location
760
+ with tempfile.NamedTemporaryFile(delete=False) as tmp:
761
+ tmp.write(await file.read())
762
+ temp_image_path = tmp.name
763
+
764
+ # Read and process the image
765
+ image = cv2.imread(temp_image_path)
766
+ if image is None:
767
+ raise HTTPException(status_code=400, detail="Invalid image file")
768
+
769
+ image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
770
+ results = pose.process(image_rgb)
771
+
772
+ # Check if pose landmarks are detected
773
+ if not results.pose_landmarks:
774
+ raise HTTPException(status_code=400, detail="No pose detected")
775
+
776
+ # Extract keypoints and predict pose
777
+ landmarks = results.pose_landmarks.landmark
778
+ keypoints = [coord for landmark in landmarks for coord in (landmark.x, landmark.y, landmark.z)]
779
+ predicted_label = model.predict([keypoints])[0]
780
+ predicted_pose = label_to_pose_name.get(predicted_label, "Unknown Pose")
781
+
782
+ # Provide feedback based on angles
783
+ angles = extract_angles(landmarks)
784
+ feedback = []
785
+ if predicted_pose in reference_angles:
786
+ for joint, ref_angle in reference_angles[predicted_pose].items():
787
+ user_angle = angles.get(joint, None)
788
+ if user_angle and abs(user_angle - ref_angle) > 10:
789
+ feedback.append(f"Adjust your {joint}, off by {abs(user_angle - ref_angle):.2f}°")
790
+
791
+ feedback_message = feedback if feedback else ["Great job! Your pose matches the reference."]
792
+
793
+ # Visualize pose landmarks
794
+ mp_drawing.draw_landmarks(image_rgb, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
795
+ visualization_path = f"{tempfile.gettempdir()}/visualization.jpg"
796
+ plt.figure(figsize=(10, 10))
797
+ plt.imshow(image_rgb)
798
+ plt.axis("off")
799
+ plt.savefig(visualization_path)
800
+ plt.close()
801
+
802
+ # Get reference image link
803
+ reference_image_link = get_reference_image_link(predicted_pose)
804
+
805
+ # Clean up temporary files
806
+ os.remove(temp_image_path)
807
+
808
+ return {
809
+ "predicted_pose": predicted_pose,
810
+ "feedback": feedback_message,
811
+ "visualization": visualization_path,
812
+ "reference_image_link": reference_image_link
813
+ }
814
+
815
+ except Exception as e:
816
+ raise HTTPException(status_code=500, detail=str(e))
817
+
818
+
819
+
820
+ if __name__ == "__main__":
821
+ uvicorn.run(app, host="127.0.0.1", port=7860, reload=True)
822
+
pose_links.txt ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ adho mukha svanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/adho_mukha_svanasana
2
+ adho mukha vriksasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/adho_mukha_vriksasana
3
+ agnistambhasana,
4
+ ananda balasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ananda_balasana
5
+ anantasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/anantasana
6
+ anjaneyasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/anjaneyasana
7
+ ardha bhekasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ardha_bhekasana
8
+ ardha chandrasanaardha, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ardha_chandrasana
9
+ matsyendrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ardha_matsyendrasana
10
+ ardha pincha mayurasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ardha_pincha_mayurasana
11
+ ardha uttanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ardha_uttanasana
12
+ ashtanga namaskara, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ashtanga_namaskara
13
+ astavakrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/astavakrasana
14
+ baddha konasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/baddha_konasana
15
+ bakasana,http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bakasana
16
+ balasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/balasana
17
+ bhairavasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bhairavasana
18
+ bharadvajasana i, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bharadvajasana_i
19
+ bhekasana,
20
+ bhujangasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bhujangasana
21
+ bhujapidasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bhujapidasana
22
+ bitilasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/bitilasana
23
+ camatkarasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/camatkarasana
24
+ chakravakasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/chakravakasana
25
+ chaturanga, dandasana,http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/chaturanga_dandasana
26
+ dandasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/dandasana
27
+ dhanurasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/dhanurasana
28
+ durvasasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/durvasasana
29
+ dwi pada viparita dandasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/dwi_pada_viparita_dandasana
30
+ eka pada koundinyanasana i, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/eka_pada_koundinyanasana_i
31
+ eka pada koundinyanasana ii, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/eka_pada_koundinyanasana_ii
32
+ eka pada rajakapotasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/eka_pada_rajakapotasana
33
+ eka pada rajakapotasana ii, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/eka_pada_rajakapotasana_ii
34
+ ganda bherundasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ganda_bherundasana
35
+ garbha pindasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/garbha_pindasana
36
+ garudasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/garudasana
37
+ gomukhasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/gomukhasana
38
+ halasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/halasana
39
+ hanumanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/hanumanasana
40
+ janu sirsasana,
41
+ kapotasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/kapotasana
42
+ krounchasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/krounchasana
43
+ kurmasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/kurmasana
44
+ lolasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/lolasana
45
+ makara adho mukha svanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/makara_adho_mukha_svanasana
46
+ makarasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/makarasana
47
+ malasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/malasana
48
+ marichyasana i, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/marichyasana_i
49
+ marichyasana iii, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/marichyasana_iii
50
+ marjaryasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/marjaryasana
51
+ matsyasana
52
+ mayurasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/mayurasana
53
+ natarajasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/natarajasana
54
+ padangusthasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/padangusthasana
55
+ padmasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/padmasana
56
+ parighasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parighasana
57
+ paripurna navasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/paripurna_navasana
58
+ parivrtta janu sirsasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parivrtta_janu_sirsasana
59
+ parivrtta parsvakonasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parivrtta_parsvakonasana
60
+ parivrtta trikonasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parivrtta_trikonasana
61
+ parsva bakasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parsva_bakasana
62
+ parsvottanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/parsvottanasana
63
+ pasasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/pasasana
64
+ paschimottanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/paschimottanasana
65
+ phalakasana
66
+ pincha mayurasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/pincha_mayurasana
67
+ prasarita padottanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/prasarita_padottanasana
68
+ purvottanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/purvottanasana
69
+ salabhasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/salabhasana
70
+ salamba bhujangasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/salamba_bhujangasana
71
+ salamba sarvangasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/salamba_sarvangasana
72
+ salamba sirsasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/salamba_sirsasana
73
+ savasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/savasana
74
+ setu bandha sarvangasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/setu_bandha_sarvangasana
75
+ simhasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/simhasana
76
+ sukhasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/sukhasana
77
+ supta baddha konasana,
78
+ supta matsyendrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/supta_matsyendrasana
79
+ supta padangusthasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/supta_padangusthasana
80
+ supta virasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/supta_virasana
81
+ tadasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/tadasana
82
+ tittibhasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/tittibhasana
83
+ tolasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/tolasana
84
+ tulasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/tulasana
85
+ upavistha konasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/upavistha_konasana
86
+ urdhva dhanurasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/urdhva_dhanurasana
87
+ urdhva hastasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/urdhva_hastasana
88
+ urdhva mukha svanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/urdhva_mukha_svanasana
89
+ urdhva prasarita eka padasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/urdhva_prasarita_eka_padasana
90
+ ustrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/ustrasana
91
+ utkatasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/utkatasana
92
+ uttana shishosana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/uttana_shishosana
93
+ uttanasana,http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/uttanasana
94
+ utthita ashwa sanchalanasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/utthita_ashwa_sanchalanasana
95
+ utthita hasta padangustasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/utthita_hasta_padangusthasana
96
+ utthita parsvakonasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/utthita_parsvakonasana
97
+ utthita trikonasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/utthita_trikonasana
98
+ vajrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/vajrasana
99
+ Vasisthasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/vasisthasana
100
+ viparita karani, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/viparita_karani
101
+ virabhadrasana i, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/virabhadrasana_i
102
+ virabhadrasana ii, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/virabhadrasana_ii
103
+ virabhadrasana iii, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/virabhadrasana_iii
104
+ virasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/virasana
105
+ vriksasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/vriksasana
106
+ vrischikasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/vrischikasana
107
+ yoganidrasana, http://res.cloudinary.com/di83yoe1d/image/upload/q_auto/v1/YogaAsanas/yoganidrasana
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ mediapipe
4
+ numpy
5
+ scikit-learn
6
+ joblib
7
+ matplotlib
8
+ opencv-python-headless
9
+ pandas
10
+ python-multipart