import numpy as np import pandas as pd import gradio as gr from tensorflow.keras.applications import MobileNetV2 from tensorflow.keras.preprocessing.image import load_img, img_to_array from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions from fuzzywuzzy import fuzz from transformers import pipeline import requests from PIL import Image from io import BytesIO # Load models using pipeline for recipe generation models = { "Flan-T5 Small": pipeline("text2text-generation", model="BhavaishKumar112/flan-t5-small"), "GPT-Neo 125M": pipeline("text-generation", model="BhavaishKumar112/gpt-neo-125M"), "Final GPT-2 Trained": pipeline("text-generation", model="BhavaishKumar112/finalgpt2trained") } # Supported cuisines for recipe generation cuisines = ["Thai", "Indian", "Chinese", "Italian"] # Load the dataset for image classification and recipe search dataset_path = "Food_Recipe.csv" # Update with your dataset path data_df = pd.read_csv(dataset_path) # Load MobileNetV2 pre-trained model for image classification mobilenet_model = MobileNetV2(weights="imagenet") # Function to preprocess images def preprocess_image(image_path, target_size=(224, 224)): image = load_img(image_path, target_size=target_size) image_array = img_to_array(image) image_array = np.expand_dims(image_array, axis=0) return preprocess_input(image_array) # Function to classify an image def classify_image(image): try: image_array = preprocess_image(image) predictions = mobilenet_model.predict(image_array) decoded_predictions = decode_predictions(predictions, top=3)[0] return decoded_predictions except Exception as e: print(f"Error during classification: {e}") return [] # Map classification to recipe using fuzzy matching def map_to_recipe(classification_results): for result in classification_results: best_match = None best_score = 0 for index, row in data_df.iterrows(): score = fuzz.partial_ratio(result[1].lower(), row["name"].lower()) if score > best_score: best_score = score best_match = row if best_score >= 70: return best_match return None # Generate recipe summary def generate_summary(recipe): ingredients = recipe.get("ingredients_name", "No ingredients provided") time_to_cook = recipe.get("time_to_cook", "Time to cook not provided") instructions = recipe.get("instructions", "No instructions provided") return f"Ingredients: {ingredients}\n\nTime to Cook: {time_to_cook}\n\nInstructions: {instructions}" # Function to handle image input and return recipe details def get_recipe_details(image): classification_results = classify_image(image) if not classification_results: return "Error: No classification results found for the image." recipe = map_to_recipe(classification_results) if recipe is not None: return generate_summary(recipe) else: return "No matching recipe found for this image." # Function for recipe generation (as before) def generate_recipe(input_text, selected_model, selected_cuisine): prompt = ( f"Generate a detailed and structured {selected_cuisine} recipe for {input_text}. " f"Include all the necessary details such as ingredients under an 'Ingredients' heading " f"and steps under a 'Recipe' heading. Ensure the response is concise and well-organized." ) model = models[selected_model] output = model(prompt, max_length=500, num_return_sequences=1)[0]['generated_text'] return output # Function to fetch and display the image for a recipe name def fetch_recipe_image(recipe_name): matching_row = data_df[data_df['name'].str.contains(recipe_name, case=False, na=False)] if not matching_row.empty: image_url = matching_row.iloc[0]['image_url'] try: response = requests.get(image_url) img = Image.open(BytesIO(response.content)) return img except Exception as e: return f"Error fetching image: {e}" else: return "No matching recipe found. Please check the recipe name." # Gradio interface with updated vibrant colors and higher contrast for better readability def main(): with gr.Blocks(css=""" body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #1c1c1c; /* Dark background for high contrast */ margin: 0; padding: 0; color: #e0e0e0; /* Light text for contrast */ } .chat-container { max-width: 800px; margin: 30px auto; padding: 20px; background: #333333; /* Dark gray background */ border-radius: 16px; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); } .chat-header { text-align: center; font-size: 32px; font-weight: bold; color: #ff9800; /* Orange for visibility */ margin-bottom: 20px; } .chat-input { width: 100%; padding: 14px; font-size: 16px; border-radius: 12px; border: 1px solid #ff9800; /* Orange border */ margin-bottom: 15px; background-color: #424242; /* Dark input field */ color: #e0e0e0; /* Light text */ } .chat-button { background-color: #ff9800; color: white; border: none; padding: 12px 24px; font-size: 16px; border-radius: 12px; cursor: pointer; } .chat-button:hover { background-color: #e65100; /* Darker orange for hover */ } .chat-output { padding: 15px; background: #424242; /* Dark gray background for output */ border-radius: 10px; border: 1px solid #616161; /* Light gray border */ color: #e0e0e0; /* Light text */ white-space: pre-wrap; min-height: 120px; } .tab-title { font-weight: bold; font-size: 22px; color: #ff9800; /* Orange text for tab title */ } .tab-button { background-color: #616161; color: #ff9800; border: 1px solid #ff9800; padding: 12px; border-radius: 12px; } .tab-button:hover { background-color: #ff5722; /* Bright orange for tab button hover */ } .icon { font-size: 20px; margin-right: 10px; } .gradio-container { margin-top: 20px; } """) as app: with gr.Tab("Recipe Generator"): gr.HTML("
🍽Recipe Generator

Enter a recipe name or ingredients, select a cuisine and model, and get structured recipe instructions!

") recipe_input = gr.Textbox(label="Enter Recipe Name or Ingredients", placeholder="e.g., Chicken curry or chicken, garlic, onions", elem_classes=["chat-input"]) selected_cuisine = gr.Radio(choices=cuisines, label="Cuisine", value="Indian") selected_model = gr.Radio(choices=list(models.keys()), label="Model", value="Flan-T5 Small") recipe_output = gr.Textbox(label="Recipe", lines=15, elem_classes=["chat-output"]) generate_button = gr.Button("Generate Recipe", elem_classes=["chat-button"]) generate_button.click(generate_recipe, inputs=[recipe_input, selected_model, selected_cuisine], outputs=recipe_output) with gr.Tab("Recipe Finder from Image"): gr.HTML("
📸Recipe Finder from Image

Upload an image of a dish to find a matching recipe.

") image_input = gr.Image(type="filepath", label="Upload an Image") image_output = gr.Textbox(label="Recipe Details", lines=10, elem_classes=["chat-output"]) image_input.change(get_recipe_details, inputs=image_input, outputs=image_output) with gr.Tab("Recipe Image Search"): gr.HTML("
📷Recipe Image Search

Enter the name of a recipe to view its image.

") recipe_name_input = gr.Textbox(label="Recipe Name", placeholder="e.g., Mixed Sprouts in Chettinad Masala Recipe", elem_classes=["chat-input"]) recipe_image_output = gr.Image(label="Recipe Image") fetch_image_button = gr.Button("Generate Image", elem_classes=["chat-button"]) fetch_image_button.click(fetch_recipe_image, inputs=recipe_name_input, outputs=recipe_image_output) app.launch() if __name__ == "__main__": main()