File-Test / app.py
Poonawala's picture
Upload 5 files
fb57f80 verified
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()