Spaces:
Build error
Build error
| 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("<div class='chat-container'><div class='chat-header'><i class='icon'>🍽</i>Recipe Generator</div><p class='tab-title'>Enter a recipe name or ingredients, select a cuisine and model, and get structured recipe instructions!</p></div>") | |
| 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("<div class='chat-container'><div class='chat-header'><i class='icon'>📸</i>Recipe Finder from Image</div><p class='tab-title'>Upload an image of a dish to find a matching recipe.</p></div>") | |
| 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("<div class='chat-container'><div class='chat-header'><i class='icon'>📷</i>Recipe Image Search</div><p class='tab-title'>Enter the name of a recipe to view its image.</p></div>") | |
| 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() |