import gradio as gr import pandas as pd import joblib from collections import OrderedDict # Load models and encoders food_model = joblib.load("goal_classifier.pkl") exercise_model = joblib.load("exercise_classifier.pkl") encoders = joblib.load("encoder.pkl") df = pd.read_csv("monthly_fitness_dataset_user200.csv") le_gender = encoders['le_gender'] le_workout = encoders['le_workout'] le_goal = encoders['le_goal'] le_exercise = encoders['le_exercise'] preprocessor = encoders['preprocessor'] def calculate_bmi(weight_kg, height_cm): return weight_kg / ((height_cm / 100) ** 2) def get_meal_plan(week, day): filtered = df[(df['Week'] == week) & (df['Day'] == day)] if not filtered.empty: row = filtered.iloc[0] return OrderedDict([ ("Breakfast", {"Meal": row["Breakfast"], "Calories": int(row["Calories_Breakfast"])}), ("Snack_1", {"Meal": row["Snack_1"], "Calories": int(row["Calories_Snack_1"])}), ("Lunch", {"Meal": row["Lunch"], "Calories": int(row["Calories_Lunch"])}), ("Snack_2", {"Meal": row["Snack_2"], "Calories": int(row["Calories_Snack_2"])}), ("Dinner", {"Meal": row["Dinner"], "Calories": int(row["Calories_Dinner"])}), ]) return OrderedDict() def get_exercise(week, day): filtered = df[(df['Week'] == week) & (df['Day'] == day)] exercises = [] seen = set() if not filtered.empty: for _, row in filtered.iterrows(): try: exercise_name = le_exercise.inverse_transform([row['Exercise_Name']])[0] except: exercise_name = row['Exercise_Name'] exercise_key = ( exercise_name, row["Exercise_Description"], row["Exercise_Duration"] ) if exercise_key not in seen: seen.add(exercise_key) exercises.append({ "Exercise_Name": exercise_name, "Exercise_Description": row["Exercise_Description"], "Exercise_Duration": row["Exercise_Duration"] }) return exercises def recommend(choice, gender, age, height_cm, weight_kg, workout_history, goal, week, day): try: user_input = { 'Gender': le_gender.transform([gender])[0], 'Age': age, 'Height_cm': height_cm, 'Weight_kg': weight_kg, 'Workout_History': le_workout.transform([workout_history])[0], 'Goal': le_goal.transform([goal])[0], 'Week': week, 'Day': day } user_input['BMI'] = calculate_bmi(weight_kg, height_cm) user_df = pd.DataFrame([user_input]) user_X = preprocessor.transform(user_df) food_model.predict(user_X) exercise_model.predict(user_X) if choice == "meal": meal_plan = get_meal_plan(week, day) return { "Meal_Plan": meal_plan, "Total_Calories": sum(meal["Calories"] for meal in meal_plan.values()) } elif choice == "exercise": return {"Exercises": get_exercise(week, day)} else: return {"error": "Invalid choice. Must be 'meal' or 'exercise'"} except Exception as e: return {"error": str(e)} # Gradio interface demo = gr.Interface( fn=recommend, inputs=[ gr.Radio(choices=["meal", "exercise"], label="Choice"), gr.Radio(choices=["Male", "Female"], label="Gender"), gr.Slider(10, 80, step=1, label="Age"), gr.Slider(100, 220, step=1, label="Height (cm)"), gr.Slider(30, 200, step=1, label="Weight (kg)"), gr.Dropdown(choices=le_workout.classes_.tolist(), label="Workout History"), gr.Dropdown(choices=le_goal.classes_.tolist(), label="Goal"), gr.Slider(1, 4, step=1, label="Week"), gr.Slider(1, 7, step=1, label="Day") ], outputs=gr.JSON(label="Recommendation"), title="Fitness Meal & Exercise Recommendation System", description="Select your info and receive a personalized meal plan or exercise for the chosen week & day." ) if __name__ == "__main__": demo.launch()