diff --git a/PRANA/.gitignore b/PRANA/.gitignore new file mode 100644 index 000000000..31b5be03f --- /dev/null +++ b/PRANA/.gitignore @@ -0,0 +1,165 @@ +mediapipe_env +*.log + +# Ignore node_modules folder +node_modules/ + +# Ignore all .env files (environment variables) +.env + +# Ignore a specific file +secret_config.json +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +sample_venv/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/PRANA/main.py b/PRANA/main.py new file mode 100644 index 000000000..92705bb08 --- /dev/null +++ b/PRANA/main.py @@ -0,0 +1,169 @@ +from flask import Flask, render_template, Response, request +import cv2 +import mediapipe as mp +import numpy as np # For angle calculations + + +app = Flask(__name__) + +mp_pose = mp.solutions.pose +pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.6, model_complexity=1) +mp_drawing = mp.solutions.drawing_utils + + +def detectPose(image, pose, display=False): + output_image = image.copy() + imageRGB = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + results = pose.process(imageRGB) + height, width, _ = image.shape + landmarks = [] + + if results.pose_landmarks: + mp_drawing.draw_landmarks(output_image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) + for landmark in results.pose_landmarks.landmark: + landmarks.append((int(landmark.x * width), int(landmark.y * height), (landmark.z * width))) + + return output_image, landmarks + + +def calculateAngle(a, b, c): + a = np.array(a) + b = np.array(b) + c = np.array(c) + + ba = a - b + bc = c - b + + cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc)) + angle = np.arccos(np.clip(cosine_angle, -1.0, 1.0)) + return np.degrees(angle) + + +def classifyPose(landmarks, output_image, selected_asana, display=False): + label = "Unknown Pose" + color = (0, 0, 255) + + if not landmarks or len(landmarks) < 33: + cv2.putText(output_image, label, (10, 30), cv2.FONT_HERSHEY_PLAIN, 2, color, 2) + return output_image, label + + # Extract key joint angles + left_elbow_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value], + landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value], + landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value]) + + right_elbow_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value], + landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value], + landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value]) + + left_shoulder_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value], + landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value], + landmarks[mp_pose.PoseLandmark.LEFT_HIP.value]) + + right_shoulder_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value], + landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value], + landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value]) + + left_knee_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.LEFT_HIP.value], + landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value], + landmarks[mp_pose.PoseLandmark.LEFT_ANKLE.value]) + + right_knee_angle = calculateAngle(landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value], + landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value], + landmarks[mp_pose.PoseLandmark.RIGHT_ANKLE.value]) + + hip_distance = np.linalg.norm(np.array(landmarks[mp_pose.PoseLandmark.LEFT_HIP.value][:2]) - + np.array(landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value][:2])) + + # Check only the selected asana + if selected_asana == "Trikonasana": + if (165 < left_knee_angle < 195 and 165 < right_knee_angle < 195 and + 130 < left_elbow_angle < 180 and 175 < right_elbow_angle < 220): + label = "Trikonasana" + + elif selected_asana == "Virabadrasana": + if (90 < left_knee_angle < 120 and 165 < right_knee_angle < 195): + label = "Virabadrasana" + + elif selected_asana == "Vrikshasana": + if (315 < left_knee_angle < 335 or 25 < right_knee_angle < 45): + label = "Vrikshasana" + + elif selected_asana == "Bhujangasana": + if (160 < left_elbow_angle < 190 and 160 < right_elbow_angle < 190 and + 50 < left_shoulder_angle < 80 and 50 < right_shoulder_angle < 80): + label = "Bhujangasana" + + elif selected_asana == "Sukhasana": + if (40 < left_knee_angle < 70 and 40 < right_knee_angle < 70 and + 60 < left_shoulder_angle < 90 and 60 < right_shoulder_angle < 90 and hip_distance < 150): + label = "Sukhasana" + + elif selected_asana == "Chakrasana": + if (240 < left_elbow_angle < 280 and 240 < right_elbow_angle < 280 and + 250 < left_knee_angle < 290 and 250 < right_knee_angle < 290): + label = "Chakrasana" + + # If the correct pose is detected, turn the label green + if label == selected_asana: + color = (0, 255, 0) # Green if pose matches + else: + label = "Unknown Pose" + + cv2.putText(output_image, label, (10, 30), cv2.FONT_HERSHEY_PLAIN, 2, color, 2) + return output_image, label + + +def webcam_feed(selected_asana): + camera_video = cv2.VideoCapture(0) + camera_video.set(3, 1380) + camera_video.set(4, 960) + + while camera_video.isOpened(): + ok, frame = camera_video.read() + if not ok: + continue + + frame = cv2.flip(frame, 1) + frame_height, frame_width, _ = frame.shape + frame = cv2.resize(frame, (int(frame_width * (640 / frame_height)), 640)) + + frame, landmarks = detectPose(frame, pose, display=False) + + if landmarks: + frame, detected_asana = classifyPose(landmarks, frame, selected_asana, display=False) + + # Display Accuracy + if detected_asana == selected_asana: + accuracy_text = f"{detected_asana}, 100%" + else: + accuracy_text = "Unknown Pose, 0%" + + cv2.putText(frame, accuracy_text, (20, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) + + ret, jpeg = cv2.imencode('.jpg', frame) + frame = jpeg.tobytes() + + yield (b'--frame\r\n' + b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') + + camera_video.release() + cv2.destroyAllWindows() + + +@app.route('/') +def index(): + return render_template('index.html') + +@app.route('/yoga_try') +def yoga_try(): + asana = request.args.get('asana', 'Unknown') + return render_template('yoga_try.html', asana=asana) + +@app.route('/video_feed1') +def video_feed1(): + asana = request.args.get('asana', 'Unknown') + return Response(webcam_feed(asana), mimetype='multipart/x-mixed-replace; boundary=frame') + +if __name__ == '__main__': + app.run(debug=True) diff --git a/PRANA/models/Message.js b/PRANA/models/Message.js new file mode 100644 index 000000000..7bb774bed --- /dev/null +++ b/PRANA/models/Message.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose'); +const messageSchema = new mongoose.Schema({ + from: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, // Sender + to: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, // Receiver + text: { type: String, required: true }, // Message content + timestamp: { type: Date, default: Date.now }, // Time when the message was sent +}); + +const Message = mongoose.model('Message', messageSchema); + +module.exports = Message; diff --git a/PRANA/models/User.js b/PRANA/models/User.js new file mode 100644 index 000000000..23896b593 --- /dev/null +++ b/PRANA/models/User.js @@ -0,0 +1,15 @@ +const mongoose = require('mongoose'); + +const userSchema = new mongoose.Schema({ + username: { type: String, unique: true, required: true }, + email: { type: String, unique: true, required: true }, + password: { type: String, required: true }, // Password will be hashed + friends: [{ + userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User'}, + lastChatTime: { type: Date, default: Date.now } + }] // References to other users they are chatting with +}); + +const User = mongoose.model('User', userSchema); + +module.exports = User; diff --git a/PRANA/server.js b/PRANA/server.js new file mode 100644 index 000000000..9cd42a66f --- /dev/null +++ b/PRANA/server.js @@ -0,0 +1,113 @@ +const { spawn } = require('child_process'); +const express = require('express'); +const bcrypt = require('bcrypt'); +const mongoose = require('mongoose'); +const path = require('path'); +const session = require('express-session'); +const User = require('./models/User'); +const { GoogleGenerativeAI } = require("@google/generative-ai"); + +const app = express(); + +// Start Python script for AI processing (if needed) +const pythonProcess = spawn('python', ['main.py']); +pythonProcess.stdout.on('data', (data) => console.log(`Python Output: ${data}`)); +pythonProcess.stderr.on('data', (data) => console.error(`Python Error: ${data}`)); +pythonProcess.on('close', (code) => console.log(`Python process exited with code ${code}`)); + +// Middleware +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); +app.use(express.static(path.join(__dirname, 'static'))); +app.use(session({ + secret: 'your_secret_key', + resave: false, + saveUninitialized: true +})); + +// MongoDB Connection +mongoose.connect('mongodb://localhost:27017/PRANA', {}) + .then(() => console.log('✅ MongoDB connected...')) + .catch(err => console.log('❌ MongoDB connection error:', err)); + +// Initialize Generative AI +const genAI = new GoogleGenerativeAI("AIzaSyBJSlieYtJVvlC_WwCfAl1WUaOmiaCAOpk"); +const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + +// Routes + +// Home Route +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, 'static', 'index.html')); +}); + +// Signup Route +app.post('/signup', async (req, res) => { + const { username, email, password } = req.body; + try { + const existingUser = await User.findOne({ $or: [{ email }, { username }] }); + if (existingUser) return res.status(400).json({ message: 'User already exists!' }); + + const hashedPassword = await bcrypt.hash(password, 10); + const newUser = new User({ username, email, password: hashedPassword }); + await newUser.save(); + res.redirect('/index.html'); + } catch (error) { + console.error('Signup error:', error); + res.status(500).json({ message: 'Error during signup!' }); + } +}); + +// Signin Route +app.post('/signin', async (req, res) => { + const { username, password } = req.body; + try { + const user = await User.findOne({ username }); + if (!user) return res.status(400).json({ message: 'Invalid username or password!' }); + + const validPassword = await bcrypt.compare(password, user.password); + if (!validPassword) return res.status(400).json({ message: 'Invalid username or password!' }); + + req.session.user = user; + res.redirect('/home'); + } catch (error) { + console.error('Signin error:', error); + res.status(500).json({ message: 'Error during login!' }); + } +}); + +// Chatbot Route (Using Gemini AI) +app.post("/chat", async (req, res) => { + const userMessage = req.body.message; + console.log(`User: ${userMessage}`); + + if (!userMessage || userMessage.trim() === "") { + return res.status(400).json({ error: "Message is required" }); + } + + try { + const result = await model.generateContent(userMessage); + const botResponse = result.response.text(); + console.log(`Gemini AI: ${botResponse}`); + res.json({ response: botResponse }); + } catch (error) { + console.error("Gemini API Error:", error); + res.status(500).json({ error: "Failed to get response from Gemini AI" }); + } +}); + +// Protected Home Route +app.get('/home', (req, res) => { + if (!req.session.user) return res.redirect('/index.html'); + res.sendFile(path.join(__dirname, 'static', 'home.html')); +}); + +// Logout Route +app.get('/logout', (req, res) => { + req.session.destroy(() => res.redirect('/index.html')); +}); + +// Start Server +const PORT = process.env.PORT || 3000; +app.listen(PORT, () => console.log(`🚀 Server running on port ${PORT}`)); + diff --git a/PRANA/static/about.html b/PRANA/static/about.html new file mode 100644 index 000000000..4dc422c7f --- /dev/null +++ b/PRANA/static/about.html @@ -0,0 +1,113 @@ + + + + + + Yoga Page + + + + +
+ logo +

PRANA

+ +
+

ABOUT

+
+ +

+ Say goodbye to guesswork and hello to precision. Our advanced AI analyzes your movements + in real-time, providing personalized corrections with voice and visual guidance, you'll learn to master + each pose with confidence.More than just a fitness app, we're committed to sustainable practices. Join our + community and discover a yoga experience that's good for your body and the planet. +

+ +
+ Yoga Pose +
+
+
+ + \ No newline at end of file diff --git a/PRANA/static/asanas.html b/PRANA/static/asanas.html new file mode 100644 index 000000000..047613266 --- /dev/null +++ b/PRANA/static/asanas.html @@ -0,0 +1,84 @@ + + + + + + + Pose Detection + + + + +
+ +
+ Pose Detection +
Waiting for Pose...
+
+ + +
+
+
+
+
+ Warrior II Pose + Tree Pose + T Pose + Bhujangasana + Chakrasana + Naukasana + Shavasana + Sukhasana + Trikonasana +
+
+
+ + + + + diff --git a/PRANA/static/chatbot.py b/PRANA/static/chatbot.py new file mode 100644 index 000000000..2941c0b23 --- /dev/null +++ b/PRANA/static/chatbot.py @@ -0,0 +1,40 @@ +import os +import google.generativeai as genai + +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +genai.configure(api_key=os.getenv("GEMINI_API_KEY")) + +# Create the model +generation_config = { + "temperature": 1, + "top_p": 0.95, + "top_k": 40, + "max_output_tokens": 8192, + "response_mime_type": "text/plain", +} + +model = genai.GenerativeModel( + model_name="gemini-1.5-flash", + generation_config=generation_config, + system_instruction="queries related to yoga\n", +) +history=[] + +print("Bot : Hello,How can I help you?") + +while True: + user_input=input("You : ") + chat_session = model.start_chat( + history=history + ) + response = chat_session.send_message(user_input) + model_response=response.text + print(f"bot: {model_response}") + print() + + history.append({"role":"user","parts":[user_input]}) + history.append({"role":"model","parts":[model_response]}) \ No newline at end of file diff --git a/PRANA/static/home.html b/PRANA/static/home.html new file mode 100644 index 000000000..efc534ce7 --- /dev/null +++ b/PRANA/static/home.html @@ -0,0 +1,305 @@ + + + + + + Yoga Home Page + + + + + + +
+ logo +

PRANA

+ +
+ + +
+

PRANA

+

Breathe Life. Live Fully

+

Say goodbye to guesswork and hello to precision. Our advanced AI analyzes your movements in real-time, providing personalized corrections with voice and visual guidance, you'll learn to master each pose with confidence. + More than just a fitness app, we're committed to sustainable practices. Join our community and discover a yoga experience that's good for your body and the planet.

+
+ + +
+
+ PRANA AI + +
+
+ +
+ +
+ + + + + + \ No newline at end of file diff --git a/PRANA/static/img/Balasana.png b/PRANA/static/img/Balasana.png new file mode 100644 index 000000000..53840491d Binary files /dev/null and b/PRANA/static/img/Balasana.png differ diff --git a/PRANA/static/img/Bhujangasana.png b/PRANA/static/img/Bhujangasana.png new file mode 100644 index 000000000..494546547 Binary files /dev/null and b/PRANA/static/img/Bhujangasana.png differ diff --git a/PRANA/static/img/BhujangasanaT.png b/PRANA/static/img/BhujangasanaT.png new file mode 100644 index 000000000..68e5695d9 Binary files /dev/null and b/PRANA/static/img/BhujangasanaT.png differ diff --git a/PRANA/static/img/Chakrasana.png b/PRANA/static/img/Chakrasana.png new file mode 100644 index 000000000..9ba97a756 Binary files /dev/null and b/PRANA/static/img/Chakrasana.png differ diff --git a/PRANA/static/img/ChakrasanaT.png b/PRANA/static/img/ChakrasanaT.png new file mode 100644 index 000000000..98f307eee Binary files /dev/null and b/PRANA/static/img/ChakrasanaT.png differ diff --git a/PRANA/static/img/Naukasana.png b/PRANA/static/img/Naukasana.png new file mode 100644 index 000000000..c6b5560ea Binary files /dev/null and b/PRANA/static/img/Naukasana.png differ diff --git a/PRANA/static/img/Shavasana.png b/PRANA/static/img/Shavasana.png new file mode 100644 index 000000000..a53108de9 Binary files /dev/null and b/PRANA/static/img/Shavasana.png differ diff --git a/PRANA/static/img/ShavasanaT.png b/PRANA/static/img/ShavasanaT.png new file mode 100644 index 000000000..bc5e1c8a6 Binary files /dev/null and b/PRANA/static/img/ShavasanaT.png differ diff --git a/PRANA/static/img/Sukhasana.png b/PRANA/static/img/Sukhasana.png new file mode 100644 index 000000000..2bb1dbce9 Binary files /dev/null and b/PRANA/static/img/Sukhasana.png differ diff --git a/PRANA/static/img/SukhasanaT.png b/PRANA/static/img/SukhasanaT.png new file mode 100644 index 000000000..aa2c56a41 Binary files /dev/null and b/PRANA/static/img/SukhasanaT.png differ diff --git a/PRANA/static/img/T pose.png b/PRANA/static/img/T pose.png new file mode 100644 index 000000000..7fd139f3f Binary files /dev/null and b/PRANA/static/img/T pose.png differ diff --git a/PRANA/static/img/Tree pose.png b/PRANA/static/img/Tree pose.png new file mode 100644 index 000000000..43c3a66b2 Binary files /dev/null and b/PRANA/static/img/Tree pose.png differ diff --git a/PRANA/static/img/Trikonasana.jpg b/PRANA/static/img/Trikonasana.jpg new file mode 100644 index 000000000..920a96cb0 Binary files /dev/null and b/PRANA/static/img/Trikonasana.jpg differ diff --git a/PRANA/static/img/TrikonasanaT.png b/PRANA/static/img/TrikonasanaT.png new file mode 100644 index 000000000..a707c4460 Binary files /dev/null and b/PRANA/static/img/TrikonasanaT.png differ diff --git a/PRANA/static/img/Virabadrasana.png b/PRANA/static/img/Virabadrasana.png new file mode 100644 index 000000000..ffa9166d1 Binary files /dev/null and b/PRANA/static/img/Virabadrasana.png differ diff --git a/PRANA/static/img/Vrikshasana.png b/PRANA/static/img/Vrikshasana.png new file mode 100644 index 000000000..144b6f08c Binary files /dev/null and b/PRANA/static/img/Vrikshasana.png differ diff --git a/PRANA/static/img/Warrior II pose.png b/PRANA/static/img/Warrior II pose.png new file mode 100644 index 000000000..2b20f37ee Binary files /dev/null and b/PRANA/static/img/Warrior II pose.png differ diff --git a/PRANA/static/img/add-user.png b/PRANA/static/img/add-user.png new file mode 100644 index 000000000..5abe99fa9 Binary files /dev/null and b/PRANA/static/img/add-user.png differ diff --git a/PRANA/static/img/asana.jpeg b/PRANA/static/img/asana.jpeg new file mode 100644 index 000000000..19cca68dc Binary files /dev/null and b/PRANA/static/img/asana.jpeg differ diff --git a/PRANA/static/img/back_gr.jpeg b/PRANA/static/img/back_gr.jpeg new file mode 100644 index 000000000..b6afe8ada Binary files /dev/null and b/PRANA/static/img/back_gr.jpeg differ diff --git a/PRANA/static/img/background.jpeg b/PRANA/static/img/background.jpeg new file mode 100644 index 000000000..7f6ef2030 Binary files /dev/null and b/PRANA/static/img/background.jpeg differ diff --git a/PRANA/static/img/confirm.png b/PRANA/static/img/confirm.png new file mode 100644 index 000000000..86d0509dc Binary files /dev/null and b/PRANA/static/img/confirm.png differ diff --git a/PRANA/static/img/email.png b/PRANA/static/img/email.png new file mode 100644 index 000000000..3fed7b8e8 Binary files /dev/null and b/PRANA/static/img/email.png differ diff --git a/PRANA/static/img/logo.jpeg b/PRANA/static/img/logo.jpeg new file mode 100644 index 000000000..16f983604 Binary files /dev/null and b/PRANA/static/img/logo.jpeg differ diff --git a/PRANA/static/img/logo.png b/PRANA/static/img/logo.png new file mode 100644 index 000000000..9783bbe98 Binary files /dev/null and b/PRANA/static/img/logo.png differ diff --git a/PRANA/static/img/logo1.jpeg b/PRANA/static/img/logo1.jpeg new file mode 100644 index 000000000..cdaa9b0b5 Binary files /dev/null and b/PRANA/static/img/logo1.jpeg differ diff --git a/PRANA/static/img/logo2.png b/PRANA/static/img/logo2.png new file mode 100644 index 000000000..9783bbe98 Binary files /dev/null and b/PRANA/static/img/logo2.png differ diff --git a/PRANA/static/img/padlock.png b/PRANA/static/img/padlock.png new file mode 100644 index 000000000..c4f07b9d6 Binary files /dev/null and b/PRANA/static/img/padlock.png differ diff --git a/PRANA/static/img/sign-in.png b/PRANA/static/img/sign-in.png new file mode 100644 index 000000000..111d398a1 Binary files /dev/null and b/PRANA/static/img/sign-in.png differ diff --git a/PRANA/static/img/user.png b/PRANA/static/img/user.png new file mode 100644 index 000000000..ff20a20a6 Binary files /dev/null and b/PRANA/static/img/user.png differ diff --git a/PRANA/static/img/yoga.png b/PRANA/static/img/yoga.png new file mode 100644 index 000000000..eddf99c26 Binary files /dev/null and b/PRANA/static/img/yoga.png differ diff --git a/PRANA/static/img/yoga1.jpeg b/PRANA/static/img/yoga1.jpeg new file mode 100644 index 000000000..5943eaf0f Binary files /dev/null and b/PRANA/static/img/yoga1.jpeg differ diff --git a/PRANA/static/index.html b/PRANA/static/index.html new file mode 100644 index 000000000..dd11f7880 --- /dev/null +++ b/PRANA/static/index.html @@ -0,0 +1,69 @@ + + + + + + PRANA Login + + + +
+ +
+
+
+

WELCOME TO PRANA

+

Fill your details

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+

Hello Again!

+

Welcome back you've been missed!

+
+
+ + +
+
+ + +
+ +
+
+
+
+ + + + + + + diff --git a/PRANA/static/nav.css b/PRANA/static/nav.css new file mode 100644 index 000000000..d9f19ae43 --- /dev/null +++ b/PRANA/static/nav.css @@ -0,0 +1,52 @@ +header img{ + height: 80px; + margin-left: 40px; +} + +body{ + height: 125vh; + background-image: url('background.jpeg'); + background-size: cover; + font-family: sans-serif; + margin-top: 80px; + padding: 30px; + +} + +main{ + color: white; +} + +header{ + background-color: rgba(239, 146, 32, 0.956); + position: fixed; + top: 0; + left: 0; + right: 0; + height: 80px; + display: flex; + align-items: center; + box-shadow: 0 0 25px 0 black; + z-index: 200; +} + +header *{ + display: inline; +} + +header li{ + margin: 20px; +} + +header li a{ + color: black; + text-decoration: none; +} +nav{ + margin-left: 300px; +} +nav a { + float: left; + margin-left: 30px; + color: white; +} \ No newline at end of file diff --git a/PRANA/static/req.txt b/PRANA/static/req.txt new file mode 100644 index 000000000..e8bc34a9b --- /dev/null +++ b/PRANA/static/req.txt @@ -0,0 +1,390 @@ +absl-py==1.2.0 +aiohttp==3.8.4 +aiosignal==1.3.1 +alembic==1.12.0 +amqp==5.1.1 +antlr4-python3-runtime==4.9.3 +anyio==3.6.2 +appdirs==1.4.4 +argon2-cffi==21.3.0 +argon2-cffi-bindings==21.2.0 +asgiref==3.5.2 +assemblyai==0.8.1 +asteroid-filterbanks==0.4.0 +asttokens==2.1.0 +astunparse==1.6.3 +async-generator==1.10 +async-timeout==4.0.2 +asyncio==3.4.3 +attrs==22.1.0 +audioread==3.0.1 +autopep8==1.7.0 +Babel==2.11.0 +backcall==0.2.0 +bcrypt==4.0.0 +beautifulsoup4==4.11.1 +billiard==3.6.4.0 +bleach==5.0.1 +blobfile==2.0.0 +boto3==1.28.57 +botocore==1.31.57 +brainfuckery==1.0.1 +build==0.10.0 +cachetools==5.2.0 +capstone==5.0.0rc2 +celery==5.2.7 +certifi==2022.12.7 +cffi==1.15.1 +chardet==4.0.0 +charset-normalizer==2.0.12 +check-manifest==0.49 +click==8.1.3 +click-didyoumean==0.3.0 +click-plugins==1.1.1 +click-repl==0.2.0 +cligj==0.7.2 +cmake==3.26.1 +colorama==0.4.5 +colored-traceback==0.3.0 +coloredlogs==15.0.1 +colorlog==6.7.0 +comtypes==1.2.0 +contourpy==1.0.6 +coverage==7.2.2 +crypto==1.4.1 +cryptography==38.0.1 +cvzone==1.5.6 +cycler==0.10.0 +Cython==0.29.32 +DALL-E==0.1 +debugpy==1.6.3 +decorator==5.1.1 +deepgram-sdk==2.5.0 +defusedxml==0.7.1 +Deprecated==1.2.13 +dill==0.3.6 +distlib==0.3.6 +Django==4.1.1 +dnspython==2.2.1 +docopt==0.6.2 +easyocr==1.6.2 +einops==0.7.0 +email-validator==1.3.0 +entrypoints==0.4 +exceptiongroup==1.1.0 +executing==1.2.0 +face-recognition-models==0.3.0 +fastapi==0.93.0 +fastjsonschema==2.16.2 +filelock==3.8.0 +Fiona==1.9.2 +Flag==0.1.1 +Flask==2.2.2 +Flask-Bcrypt==1.0.1 +Flask-Login==0.6.2 +Flask-MySQLdb==2.0.0 +Flask-SQLAlchemy==2.5.1 +Flask-WTF==1.0.1 +flatbuffers==22.9.24 +flower==1.2.0 +flwr==1.3.0 +fonttools==4.38.0 +frozenlist==1.3.3 +fsspec==2023.6.0 +future==0.18.3 +gast==0.4.0 +gcloud==0.18.3 +geopandas==0.12.2 +ghp-import==2.1.0 +gitdb==4.0.10 +GitPython==3.1.31 +glob2==0.7 +gmpy2==2.1.2 +google-api-core==2.11.0 +google-api-python-client==2.80.0 +google-auth==2.16.2 +google-auth-httplib2==0.1.0 +google-auth-oauthlib==0.4.6 +google-pasta==0.2.0 +googleapis-common-protos==1.58.0 +graphviz==0.20.1 +greenlet==1.1.3 +griffe==0.25.5 +grpcio==1.49.1 +gTTS==2.3.0 +h11==0.14.0 +h5py==3.7.0 +httpcore==0.17.2 +httplib2==0.21.0 +httpx==0.24.1 +huggingface-hub==0.16.4 +humanfriendly==10.0 +humanize==4.6.0 +hydra-core==1.3.2 +HyperPyYAML==1.2.2 +ibm-cloud-sdk-core==3.16.0 +ibm-watson==6.1.0 +idna==2.10 +ifaddr==0.2.0 +imageio==2.22.4 +imutils==0.5.4 +iniconfig==1.1.1 +intervaltree==3.1.0 +ipykernel==6.17.1 +ipython==8.6.0 +ipython-genutils==0.2.0 +iterators==0.0.2 +itsdangerous==2.1.2 +jedi==0.18.2 +Jinja2==3.1.2 +jmespath==1.0.1 +joblib==1.2.0 +json5==0.9.10 +jsonschema==4.17.1 +julius==0.2.7 +jupyter-server==1.23.3 +jupyter_client==7.4.7 +jupyter_core==5.0.0 +jupyterlab==3.5.0 +jupyterlab-pygments==0.2.2 +jupyterlab_server==2.16.3 +jwcrypto==1.5.0 +kaggle==1.5.15 +keras==2.10.0 +keras-nightly==2.11.0.dev2022101707 +Keras-Preprocessing==1.1.2 +keyboard==0.13.5 +kiwisolver==1.4.4 +kombu==5.2.4 +lazy_loader==0.3 +libclang==14.0.6 +librosa==0.10.1 +lightning==2.1.0 +lightning-utilities==0.9.0 +llvmlite==0.40.1 +lxml==4.9.1 +Mako==1.2.3 +Markdown==3.3.7 +markdown-it-py==3.0.0 +MarkupSafe==2.1.1 +matplotlib==3.6.2 +matplotlib-inline==0.1.6 +mdurl==0.1.2 +mediapipe==0.9.0 +mergedeep==1.3.4 +mistune==2.0.4 +mkdocs==1.4.2 +mkdocs-autorefs==0.4.1 +mkdocs-material==9.1.3 +mkdocs-material-extensions==1.1.1 +mkdocstrings==0.20.0 +mkdocstrings-python==0.8.3 +more-itertools==10.1.0 +MouseInfo==0.1.3 +mpmath==1.2.1 +msgpack==1.0.7 +multidict==6.0.4 +multiprocess==0.70.14 +munch==2.5.0 +mutagen==1.47.0 +mypy==0.982 +mypy-extensions==0.4.3 +mysqlclient==2.2.0 +Naked==0.1.31 +nbclassic==0.4.8 +nbclient==0.7.0 +nbconvert==7.2.5 +nbformat==5.7.0 +ndg-httpsclient==0.5.1 +nest-asyncio==1.5.6 +networkx==2.8.8 +ninja==1.11.1 +nltk==3.7 +notebook==6.5.2 +notebook_shim==0.2.2 +numba==0.57.1 +numpy==1.24.2 +nvflare==2.0.19 +oauth2client==4.1.3 +oauthlib==3.2.1 +omegaconf==2.3.0 +onnxruntime-gpu==1.16.1 +openai==0.27.8 +openai-whisper @ git+https://github.com/openai/whisper.git@b38a1f20f4b23f3f3099af2c3e0ca95627276ddf +opencv-contrib-python==4.8.1.78 +opencv-python==4.8.1.78 +opendatasets==0.1.22 +opt-einsum==3.3.0 +optuna==3.4.0 +osmnx==1.3.0 +outcome==1.2.0 +packaging==21.3 +paho-mqtt==1.6.1 +pandas==1.5.3 +pandocfilters==1.5.0 +paramiko==2.11.0 +parso==0.8.3 +pathlib2==2.3.7.post1 +pickleshare==0.7.5 +Pillow==9.2.0 +platformdirs==2.5.2 +playsound==1.3.0 +pluggy==1.0.0 +plumbum==1.8.0 +ply==3.11 +pooch==1.7.0 +primePy==1.3 +prometheus-client==0.15.0 +prompt-toolkit==3.0.33 +protobuf==3.19.6 +psutil==5.9.3 +pure-eval==0.2.2 +pusher==3.3.2 +pwntools==4.8.0 +py==1.11.0 +py4j==0.10.9.7 +pyannote.audio @ git+https://github.com/pyannote/pyannote-audio@26ca0514394ee8faef044b1da0fcf99e53cc22c1 +pyannote.core==5.0.0 +pyannote.database==5.0.1 +pyannote.metrics==3.2.1 +pyannote.pipeline==3.0.1 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +PyAudio==0.2.13 +PyAutoGUI==0.9.53 +pyclipper==1.3.0.post4 +pycodestyle==2.9.1 +pycparser==2.21 +pycryptodome==3.15.0 +pycryptodomex==3.15.0 +pydantic==1.10.6 +pydub==0.25.1 +pyelftools==0.29 +pygame==2.1.2 +PyGetWindow==0.0.9 +Pygments==2.14.0 +PyJWT==2.6.0 +pymdown-extensions==9.10 +pymongo==4.3.3 +PyMsgBox==1.0.9 +PyNaCl==1.5.0 +pynput==1.7.6 +pyod==1.1.0 +pyOpenSSL==23.1.1 +pyparsing==2.4.7 +pyperclip==1.8.2 +pypiwin32==223 +pypng==0.20220715.0 +pyproj==3.5.0 +pyproject_hooks==1.0.0 +PyQt5==5.15.7 +PyQt5-Qt5==5.15.2 +PyQt5-sip==12.11.0 +pyreadline3==3.4.1 +Pyrebase4==4.7.1 +PyRect==0.2.0 +pyrsistent==0.19.2 +PyScreeze==0.1.28 +pyserial==3.5 +pyshark==0.6 +PySimpleGUI==4.60.4 + +PySocks==1.7.1 +pyspark==3.5.0 +pytesseract==0.3.10 +pytest==7.1.3 +pytest-cov==4.0.0 +python-bidi==0.4.2 +python-dateutil==2.8.2 +python-dotenv==0.21.0 +python-google-places==1.4.2 +python-jwt==4.0.0 +python-nmap==0.7.1 +python-slugify==8.0.1 +pytorch-lightning==2.1.0 +pytorch-metric-learning==2.3.0 +pytorch-transformers==1.2.0 +pyttsx3==2.90 +pytweening==1.0.4 +pytz==2022.6 +PyWavelets==1.4.1 +pywin32==304 +pywinpty==2.0.9 +PyYAML==6.0 +pyyaml_env_tag==0.1 +pyzbar==0.1.9 +pyzmq==24.0.1 +qrcode==7.4.2 +random2==1.0.1 +regex==2022.9.13 +requests==2.26.0 +requests-oauthlib==1.3.1 +requests-toolbelt==0.10.1 +rich==13.4.2 +roboflow==1.1.1 +roboflowoak==0.0.8 +ROPGadget==7.1 +rpyc==5.2.3 +rsa==4.9 +ruamel.yaml==0.17.40 +ruamel.yaml.clib==0.2.8 +s3transfer==0.7.0 +sacremoses==0.0.53 +safetensors==0.3.3 +scikit-image==0.19.3 +scikit-learn==1.2.2 +scipy==1.9.3 +seaborn==0.12.2 +secure-smtplib==0.1.1 +selenium==4.8.2 +semver==3.0.2 +Send2Trash==1.8.0 +sentencepiece==0.1.99 +shapely==2.0.1 +shellescape==3.8.1 +shellingham==1.5.3 +six==1.16.0 +sklearn==0.0.post1 +smmap==5.0.0 +sniffio==1.3.0 +sockets==1.0.0 +sortedcontainers==2.4.0 +soundfile==0.12.1 +soupsieve==2.3.2.post1 +soxr==0.3.7 +speechbrain==0.5.15 +SpeechRecognition==3.10.0 +SQLAlchemy==1.4.41 +sqlparse==0.4.2 +stack-data==0.6.1 +starlette==0.25.0 +supervision==0.11.1 +sympy==1.11.1 +tabulate==0.9.0 +tb-nightly==2.10.0a20220811 +tensorboard==2.10.1 +tensorboard-data-server==0.6.1 +tensorboard-plugin-wit==1.8.1 +tensorflow-io-gcs-filesystem +tensorflow-estimator==2.10.0 +tensorflow-io-gcs-filesystem==0.27.0 +termcolor==2.0.1 +terminado==0.17.0 +text-unidecode==1.3 +tf-estimator-nightly==2.11.0.dev2022101808 +tf-nightly-gpu==2.11.0.dev20220812 +thop==0.1.1.post2209072238 +threaded==4.1.0 +threadpoolctl==3.1.0 +tifffile==2022.10.10 +tiktoken==0.3.3 +tinycss2==1.2.1 +tinydb==4.8.0 +tokenizers==0.13.3 +toml==0.10.2 +tomli==2.0.1 +torch==2.0.0 +torch-audiomentations==0.11.0 +torch-geometric==2.2.0 +torch-pitch-shift==1.2.4 +torchaudio==2.0.1+cu117 \ No newline at end of file diff --git a/PRANA/static/script.js b/PRANA/static/script.js new file mode 100644 index 000000000..7da33c160 --- /dev/null +++ b/PRANA/static/script.js @@ -0,0 +1,34 @@ +let s_in=document.getElementById("in"); +let s_up=document.getElementById("up"); +let signup=document.getElementsByClassName("signup"); +let signin=document.getElementsByClassName("signin"); + +s_in.addEventListener("click",function(){ + signup[0].classList.remove("d"); + this.style.borderLeft="4px solid #0f0776"; + s_up.style.borderLeft=""; + signin[0].classList.remove("c"); + signup[0].classList.toggle("c"); + +}); + +s_up.addEventListener("click",function(){ + signup[0].classList.remove("d"); + this.style.borderLeft="4px solid #0f0776"; + s_in.style.borderLeft=""; + signup[0].classList.remove("c"); + signin[0].classList.toggle("c"); + +}); + + + + + +// for(i=0;i response.json()) + .then((data) => { + // Remove the "Thinking..." message + loadingMessage.remove(); + + // Display bot response + let botMessage = document.createElement("div"); + botMessage.classList.add("message", "bot-message"); + botMessage.textContent = data.response; + chatBody.appendChild(botMessage); + + // Auto-scroll to latest message + chatBody.scrollTop = chatBody.scrollHeight; + }) + .catch((error) => { + console.error("Error:", error); + loadingMessage.textContent = "Error getting response!"; + }); + + // Clear user input field + document.getElementById("user-input").value = ""; +}); + + diff --git a/PRANA/static/style copy.css b/PRANA/static/style copy.css new file mode 100644 index 000000000..92b70f490 --- /dev/null +++ b/PRANA/static/style copy.css @@ -0,0 +1,95 @@ +body { + font-family: sans-serif; + margin: 0; + padding: 0; + background-color: #ff9800; + color: #333; +} + +.header { + background-color: #ff9800; /* Orange */ + padding: 20px 0; +} + +.container { + width: 90%; + max-width: 1200px; + margin: 0 auto; +} + +nav ul { + list-style: none; + padding: 0; + margin: 0; + text-align: right; +} + +nav ul li { + display: inline-block; + margin-left: 20px; +} + +nav ul li a { + text-decoration: none; + color: #fff; + font-weight: bold; + padding: 10px 15px; + border-radius: 5px; + transition: background-color 0.3s ease; +} + +nav ul li a:hover { + background-color: #f57c00; /* Darker Orange */ +} + +.hero { + background: linear-gradient(to right, #ffb300, #ff9800); /* Orange gradient */ + padding: 80px 0; + color: #fff; +} + +.hero .container { + display: flex; + align-items: center; + justify-content: space-between; +} + +.hero .content { + flex: 1; +} + +.hero .content h1 { + font-size: 3em; + margin-bottom: 20px; +} + +.hero .content p { + font-size: 1.1em; + line-height: 1.6; +} + +.hero .image { + flex: 1; + text-align: center; +} + +.hero .image img { + max-width: 100%; + height: auto; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .hero .container { + flex-direction: column; + text-align: center; + } + + .hero .content { + margin-bottom: 30px; + } + + nav ul { + text-align: center; + } +} \ No newline at end of file diff --git a/PRANA/static/style.css b/PRANA/static/style.css new file mode 100644 index 000000000..cb933e693 --- /dev/null +++ b/PRANA/static/style.css @@ -0,0 +1,135 @@ +.a, .text, .signin, .signup, input { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +input { + height: 40px; + width: 250px; + border-radius: 20px; + margin: 10px; + background-color: rgba(255, 255, 255, 0.85); + border: 1px solid rgb(120, 120, 200); + padding-left: 15px; + margin-left: 8px; + color: #333; + font-size: 16px; +} + +input:focus { + outline: none; + border-color: #0f0776; + box-shadow: 0 0 5px rgba(23, 11, 187, 0.5); +} + +.a { + height: 100%; + width: 100%; + flex-direction: row; +} + +.nav_signin:hover, .nav_signup:hover { + border-left: 4px solid #764b07; + background-color: #f2ede9a1; +} + +.nav_signin, .nav_signup { + padding-left: 25px; + padding-right: 20px; + cursor: pointer; + padding: 25px; + margin-top: 10px; +} +.c, .d { + display: none; +} +html, body { + height: 100%; + /*background-color: rgba(228, 234, 246, 0.9);*/ + background-image: url(img/back_gr.jpeg); + background-size: cover; + font-family: 'Arial', sans-serif; +} + +.signin, .signup { + width: 450px; + height: 420px; + background-color: #fcdaa598; + border-radius: 20px; + box-shadow: 10px 10px 20px rgba(24, 18, 30, 0.6); + flex-direction: column; + padding: 20px; +} +.sign { + width: 140px; + height: 40px; + border-radius: 20px; + background-color: #6a3b02; + color: white; + margin-left: 27%; + cursor: pointer; + transition: background-color 0.3s ease; +} + +.sign:hover { + background-color: #6a3b02c9; +} + +form div { + display: flex; + align-items: center; + flex-direction: row; + justify-content: center; +} +.navi { + width: 100px; + height: 400px; + border-radius: 20px 0 0 20px; + background-color: #f2cd99; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +.navi:hover { + background-color: #f2cd99; +} + +@media (min-width:1000px) { + .signin, .signup { + width: 500px; + } +} + +@media (min-width:1240px) { + .signin, .signup { + width: 370px; + height: 410px; + background-color: #fcdaa598; + border-radius: 0 20px 20px 0; + } + + .navi { + height: 430px; + background-color: #f2cd99; + } + + .imag { + height: 500px; + width: 500px; + border-radius: 20px; + background-color: #f2cd99; + } +} + +@media (max-width:1240px) { + .imag { + display: none; + } +} + + + diff --git a/PRANA/static/style2.css b/PRANA/static/style2.css new file mode 100644 index 000000000..53c62e4a3 --- /dev/null +++ b/PRANA/static/style2.css @@ -0,0 +1,147 @@ +@import url('https://fonts.googleapis.com/css?family=Poppins:400,500,600,700&display=swap'); +*{ + margin: 0; + padding: 0; + outline: none; + box-sizing: border-box; + font-family: 'Poppins', sans-serif; +} +body{ + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 10px; + font-family: 'Poppins', sans-serif; + background: linear-gradient(115deg, #56d8e4 10%, #9f01ea 90%); +} +.container{ + max-width: 800px; + background: #fff; + width: 800px; + padding: 25px 40px 10px 40px; + box-shadow: 0px 0px 10px rgba(0,0,0,0.1); +} +.container .text{ + text-align: center; + font-size: 41px; + font-weight: 600; + font-family: 'Poppins', sans-serif; + background: -webkit-linear-gradient(right, #56d8e4, #9f01ea, #56d8e4, #9f01ea); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} +.container form{ + padding: 30px 0 0 0; +} +.container form .form-row{ + display: flex; + margin: 32px 0; +} +form .form-row .input-data{ + width: 100%; + height: 40px; + margin: 0 20px; + position: relative; +} +form .form-row .textarea{ + height: 70px; +} +.input-data input, +.textarea textarea{ + display: block; + width: 100%; + height: 100%; + border: none; + font-size: 17px; + border-bottom: 2px solid rgba(0,0,0, 0.12); +} +.input-data input:focus ~ label, .textarea textarea:focus ~ label, +.input-data input:valid ~ label, .textarea textarea:valid ~ label{ + transform: translateY(-20px); + font-size: 14px; + color: #3498db; +} +.textarea textarea{ + resize: none; + padding-top: 10px; +} +.input-data label{ + position: absolute; + pointer-events: none; + bottom: 10px; + font-size: 16px; + transition: all 0.3s ease; +} +.textarea label{ + width: 100%; + bottom: 40px; + background: #fff; +} +.input-data .underline{ + position: absolute; + bottom: 0; + height: 2px; + width: 100%; +} +.input-data .underline:before{ + position: absolute; + content: ""; + height: 2px; + width: 100%; + background: #3498db; + transform: scaleX(0); + transform-origin: center; + transition: transform 0.3s ease; +} +.input-data input:focus ~ .underline:before, +.input-data input:valid ~ .underline:before, +.textarea textarea:focus ~ .underline:before, +.textarea textarea:valid ~ .underline:before{ + transform: scale(1); +} +.submit-btn .input-data{ + overflow: hidden; + height: 45px!important; + width: 25%!important; +} +.submit-btn .input-data .inner{ + height: 100%; + width: 300%; + position: absolute; + left: -100%; + background: -webkit-linear-gradient(right, #56d8e4, #9f01ea, #56d8e4, #9f01ea); + transition: all 0.4s; +} +.submit-btn .input-data:hover .inner{ + left: 0; +} +.submit-btn .input-data input{ + background: none; + border: none; + color: #fff; + font-size: 17px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 1px; + cursor: pointer; + position: relative; + z-index: 2; +} +@media (max-width: 700px) { + .container .text{ + font-size: 30px; + } + .container form{ + padding: 10px 0 0 0; + } + .container form .form-row{ + display: block; + } + form .form-row .input-data{ + margin: 35px 0!important; + } + .submit-btn .input-data{ + width: 40%!important; + } +} \ No newline at end of file diff --git a/PRANA/static/styles.css b/PRANA/static/styles.css new file mode 100644 index 000000000..0439c5eb5 --- /dev/null +++ b/PRANA/static/styles.css @@ -0,0 +1,82 @@ + +body { + margin: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + background-color: #f9f9f9; +} + +.container { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + width: 90%; + max-width: 1200px; +} + +.video-container { + position: relative; + width: 50%; /* Adjust this to make space for the accuracy bar */ + max-width: 600px; /* Limit the size */ +} + +.video-container img { + width: 100%; + height: auto; + border-radius: 10px; + border: 2px solid #ddd; + } + + .accuracy-box { + position: absolute; + bottom: 10px; + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.7); + color: white; + padding: 8px 15px; + border-radius: 8px; + font-size: 16px; + text-align: center; + } + + .progress-container { + width: 250px; + height: 20px; + background: #ddd; + border-radius: 10px; + overflow: hidden; + border: 1px solid #aaa; + margin-top: 10px; + } + + .progress-bar { + height: 100%; + width: 0%; + background: linear-gradient(90deg, #ff3d00, #ffea00, #00e676); + transition: width 0.5s ease-in-out; + } + + .scroll-container { + background-color: #fff; + overflow-y: auto; + max-height: 300px; + width: 200px; + padding: 10px; + display: flex; + flex-direction: column; + align-items: center; + border: 2px solid #ddd; + border-radius: 10px; + } + +.scroll-container img { + max-width: 100%; + height: auto; + margin-bottom: 10px; + border-radius: 5px; +} diff --git a/PRANA/static/sugg.html b/PRANA/static/sugg.html new file mode 100644 index 000000000..6dde953d3 --- /dev/null +++ b/PRANA/static/sugg.html @@ -0,0 +1,171 @@ + + + + + + Help & Suggestions - Yoga Website + + + + +
+ logo +

PRANA

+ +
+ +
+

Suggestions

+ +
+

Have a Suggestion? Fill out this...

+
+ + +
+
+ + + + + \ No newline at end of file diff --git a/PRANA/static/yoga-style.css b/PRANA/static/yoga-style.css new file mode 100644 index 000000000..c81db5e68 --- /dev/null +++ b/PRANA/static/yoga-style.css @@ -0,0 +1,370 @@ +.main { + font-family: 'Open Sans', sans-serif; + margin: 0; + padding: 0; + text-align: center; + background-color: #BCAAA4; + background-size: cover; + background-repeat: no-repeat; + background-attachment: fixed; + color: #333; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + padding: 20px; +} + +.profile { + width: 230px; + height: 230px; + overflow: hidden; + border-radius: 50%; + border: 5px solid #333; + display: block; + margin: auto; + margin-top: 60px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); +} + +.try-it-out { + margin-bottom: 10px; /* Adjust the top margin as needed */ + text-align: center; +} + +button { + padding: 10px 20px; + font-size: 18px; + background-color: #7b4809; /* Green background color */ + color: #fff; /* White text color */ + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease; /* Smooth transition for background color */ +} + +button:hover { + background-color: #9c5b0a9d; /* Darker green on hover */ +} + +.profile img { + width: 100%; + height: 100%; + object-fit: cover; +} + +h1 { + font-size: 35px; + text-align: center; + color: #333; +} + +.quote { + margin: 20px 0; + font-size: 25px; +} + +* { + box-sizing: border-box; +} + +.wrapper { + display: flex; + flex-wrap: wrap; + justify-content: center; +} + + +.card { + width: 310px; + height: 310px; + margin: 1em; + padding: 0; + perspective: 1500px; + border: 2px solid #333; + /* Add this line to create a border */ + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + /* Add this line for a box shadow */ + border-radius: 20px; + + +} + +.card .front { + background-size: 100% 100%; + background: rgba(255, 255, 255, 0.0); + background-size: cover; + background-position: center center; +} + +.card .inner { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-around; + padding: 1.5em; + transform: translateZ(80px) scale(0.94); +} + +.card .more { + display: none; +} + +.card .more:checked~.content { + transform: rotateY(180deg); +} + +.card .content { + position: relative; + width: 100%; + height: 100%; + transform-style: preserve-3d; + transition: transform 0.8s cubic-bezier(0.75, 0, 0.85, 1); +} + +.card .front, +.card .back { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + backface-visibility: hidden; + transform-style: preserve-3d; + border-radius: 20px; +} + +.card .inner { + height: 100%; + display: flex; + padding: 1.5em; + transform: translateZ(80px) scale(0.94); + flex-direction: column; + align-items: center; + justify-content: space-around; +} + +.card .front { + background-color: #fff; + background-size: cover; + background-position: center center; +} + +.card .front:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: block; + border-radius: 6px; + backface-visibility: hidden; +} + +.card .front h2 { + grid-row: 2; + text-transform: uppercase; + letter-spacing: 3px; + color: #686868; + font-weight: 570; + text-shadow: 0 0 6px rgba(0, 0, 0, 0.1); + font-size: 30px; + margin-top: 230px; +} + +.card .back { + transform: rotateY(180deg); + background-color: #ede1bc; + border: 2px solid rgb(240, 240, 240); +} + +.card .back h2 { + grid-row: 2; + margin-bottom: 0.3em; + text-transform: uppercase; + letter-spacing: 3px; + color: #355cc9; + font-weight: 450; + text-shadow: 0 0 6px rgba(0, 0, 0, 0.1); +} + +.card .back .description { + font-size: 1.2em; + font-weight: bolder; + line-height: 1.4em; + color: black; + white-space: pre-line; + text-align: center; + margin-top: -100px; + margin-bottom: 20px; + /*Adds a 20-pixel margin at the bottom of

elements */ + /* margin: -30px 0 10px; */ + /* margin-bottom: 40px; */ + font-family: 'Montserrat', sans-serif; +} + +.card .back .inner { + height: 100%; + display: grid; + padding: 1.5em; + transform: translateZ(80px) scale(0.94); + position: relative; +} + +.card .back .inner .button-container { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + /* Add this line */ + +} + + + +.card .back .inner .button:hover { + background-color: #fff; + box-shadow: none; + text-shadow: none; + color: #355cc9; +} + +.button { + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 600; + cursor: pointer; + display: block; + padding: 0 1.5em; + height: 3em; + line-height: 2.9em; + min-width: 3em; + background-color: transparent; + border: solid 2px #fff; + color: #fff; + border-radius: 4px; + text-align: center; + backface-visibility: hidden; + transition: 0.3s ease-in-out; + text-shadow: 0 0 6px rgba(0, 0, 0, 0.3); +} + +#back-button { + position: fixed; + margin-bottom: 10px; + margin-right: 90px; + background-color: rgb(29, 112, 112); + color: white; + padding: 10px 20px; + text-decoration: none; + border-radius: 5px; + font-weight: bold; +} +.card1 .front { + background-image: url('Trikonasana.jpg'); +} + +.card2 .front { + background-image: url('Naukasana.png'); +} + +.card3.front { + background-image: url('Bhujangasana.png'); +} + +.card5.front { + background-image: url('Shavasana.png'); +} + + +.card7.front { + background-image: url('Vrikshasana.png'); +} + +.card8.front { + background-image: url('Sukhasana.png'); +} + +.card9.front { + background-image: url('Chakrasana.png'); +} + +.card4.front { + background-image: url('Balasana.png'); +} + + + +.button.view-details { + position: absolute; + bottom: -30px; + /* Adjust the desired distance from the bottom */ + left: 50%; + /* Center horizontally within the .button-container */ + transform: translateX(-50%); + /* Center horizontally */ + width: 200px; + /* Set the desired width */ + height: 40px; + /* Set the desired height */ + text-align: center; + /* Center text horizontally within the button */ + line-height: 40px; + /* Center text vertically within the button */ + + border: 2px solid black; + /* Add this line to create a white border */ + color: black; + + +} + + +.card .more:hover~.content { + transform: rotateY(180deg); +} + +.card .back .inner .button-container { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + bottom: -30px; +} + +.card .content { + position: relative; + width: 100%; + height: 100%; + transform-style: preserve-3d; + transition: transform 0.8s cubic-bezier(0.75, 0, 0.85, 1); +} + +.card .content:hover { + transform: rotateY(180deg); +} + +/* .card .back .inner .button-container { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + bottom: -30px; + } */ + +.row { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + /* Adjust the alignment as needed */ + margin: 0 -15px; + /* Add negative margin to space out the cards */ +} \ No newline at end of file diff --git a/PRANA/templates/index.html b/PRANA/templates/index.html new file mode 100644 index 000000000..a97fb04a4 --- /dev/null +++ b/PRANA/templates/index.html @@ -0,0 +1,143 @@ + + + + + Yoga Asanas + + + + + +

+ logo +

PRANA

+ +
+

YOGA ASANAS

+
+
+
+
+
+
+

Trikonasana

+
+
+
+
+

Improves digestion and strengthens legs and arms.

+ + + +
+
+
+
+ +
+
+
+
+

Virabadrasana

+
+
+
+
+

Strengthens legs, improves balance, and enhances focus.

+ + + +
+
+
+
+ +
+
+
+
+

Vrikshasana

+
+
+
+
+

Improves balance and strengthens the back and legs.

+ + + +
+
+
+
+
+ +
+
+
+
+
+

Bhujangasana

+
+
+
+
+

Strengthens the lower back and improves circulation.

+ + + +
+
+
+
+ +
+
+
+
+

Sukhasana

+
+
+
+
+

Calms the mind and improves posture.

+ + + +
+
+
+
+ +
+
+
+
+

Chakrasana

+
+
+
+
+

Stimulates the thyroid and pituitary glands.

+ + + +
+
+
+
+
+
+ + diff --git a/PRANA/templates/yoga_try.html b/PRANA/templates/yoga_try.html new file mode 100644 index 000000000..e71b89e11 --- /dev/null +++ b/PRANA/templates/yoga_try.html @@ -0,0 +1,81 @@ + + + + + {{ asana }} Pose Detection + + + + +

Detecting: {{ asana }}

+ +
+
+ Pose Detection +
Waiting for Pose...
+
+
+ + + + + diff --git a/README.md b/README.md index 48a05e012..0e015d94b 100644 --- a/README.md +++ b/README.md @@ -6,53 +6,53 @@ The official template repository for Define 3.0 -# < Project Name > +# YOGA POSE ESTIMATION Cover Image If applicable ### Team Information -- **Team Name**: -- **Track**: < Track > +- **Team Name**: Imagineers +- **Track**:AI IN AYUSH -### Team Members +### Team Members: | Name | Role | GitHub | LinkedIn | |------|------|--------|----------| -| [Full Name] | [Role] | [@username](https://github.com/username) | [Profile](https://linkedin.com/in/username) | -| [Full Name] | [Role] | [@username](https://github.com/username) | [Profile](https://linkedin.com/in/username) | -| [Full Name] | [Role] | [@username](https://github.com/username) | [Profile](https://linkedin.com/in/username) | -| [Full Name] | [Role] | [@username](https://github.com/username) | [Profile](https://linkedin.com/in/username) | +| Gopika Biju S | Member | https://github.com/GopikaBijuS | https://www.linkedin.com/in/gopika-biju-s-871619270 | +| Keerthana Suresh D | Leader | https://github.com/sankeertanaah | https://www.linkedin.com/in/keerthana-suresh-d-39196b266 | +| Krishnapriya R | Member | https://github.com/Krisha-priya | www.linkedin.com/in/krishnapriya-r-73b3b8270 | ## Project Details - +Personalized AI Yoga Guide. ### Overview -_A concise summary of your project (2-3 sentences)_ +Prana AI offers real-time detection of yoga postures, delivering precise accuracy levels to ensure proper alignment and maximize benefits. ### Problem Statement -_Describe the problem your project aims to solve_ +Many yoga enthusiasts unknowingly perform poses incorrectly, risking injuries and hindering their progress. Additionally, the rise of unqualified instructors can lead to unsafe practices and inflated costs ### Solution -_Explain your approach to solving the problem_ +Prana AI offers real-time detection of yoga postures, delivering precise accuracy levels to ensure proper alignment and maximize benefits. Our integrated AI chatbot, powered by Gemini AI, provides instant answers to your yoga-related queries, acting as your knowledgeable virtual guide. ### Demo [![Project Demo](https://img.youtube.com/vi/VIDEO_ID/0.jpg)](https://www.youtube.com/watch?v=VIDEO_ID) _Replace VIDEO_ID with your YouTube video ID or provide an alternative demo link_ ### Live Project -[Project Name](https://your-project-url.com) +PRANA AI ## Technical Implementation ### Technologies Used -- **Frontend**: [Technologies] -- **Backend**: [Technologies] -- **Database**: [Technologies] -- **APIs**: [Technologies] +- **Frontend**: HTML,CSS,JS +- **Backend**: Node.js,Flask +- **Database**: MongoDB +- **APIs**: Gemini API - **DevOps**: [Technologies] -- **Other Tools**: [Technologies] +- **Other Tools**: Mediapipe ### Key Features -- Feature 1 -- Feature 2 -- Feature 3 +- Perfect your yoga poses with real-time accuracy feedback. +- Receive personalized guidance from our AI chatbot. +- voice command recognition +- voice instructions providing for users ## Setup Instructions @@ -63,12 +63,12 @@ _Replace VIDEO_ID with your YouTube video ID or provide an alternative demo link ### Installation ```bash - +git clone https://github.com/GopikaBijuS/Imagineers ``` ### Running the Project ```bash - +node server.js ``` ## Additional Resources