Spaces:
Build error
Build error
Upload 5 files
#1
by ajay-erumalla1 - opened
- Dockerfile +31 -0
- MediaPipe_Model .pkl +3 -0
- app.py +822 -0
- pose_links.txt +125 -0
- 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
|