import streamlit as st from transformers import pipeline from PIL import Image from io import BytesIO from transformers import GPT2LMHeadModel, GPT2Tokenizer import random st.set_page_config(layout="wide", page_title="Image Classification App") st.write("## Image Food Classification App") st.sidebar.write("## Upload and download :gear:") # Initialize image classification and recipe generation models image_classifier = pipeline("image-classification", model="mjsp/sweet") recipe_model = GPT2LMHeadModel.from_pretrained("gpt2") recipe_tokenizer = GPT2Tokenizer.from_pretrained("gpt2") MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MB def convert_image(img): buf = BytesIO() img.save(buf, format="PNG") byte_im = buf.getvalue() return byte_im def fix_image(upload): image = Image.open(upload) st.image(image, caption="Original Image", use_column_width=True) # You'll need to add the 'rembg' functionality or replace it with your own image processing logic # fixed = your_image_processing_function(image) # st.image(fixed, caption="Fixed Image", use_column_width=True) st.sidebar.markdown("\n") st.sidebar.download_button("Download fixed image", convert_image(fixed), "fixed.png", "image/png") def generate_recipe(title, max_length=200): # Replace this with your actual dataset dataset = { "Gulab Jamun": { "ingredients": ["milk powder", "ghee", "rose water", "saffron", "cardamom", "sugar syrup"], "recipe": "Instructions for making Gulab Jamun...", }, "Jalebi": { "ingredients": ["all-purpose flour", "yogurt", "sugar", "water", "saffron strands", "cardamom powder", "ghee or oil for frying"], "recipe": "Instructions for making Jalebi...", }, "Rasgulla": { "ingredients": ["milk", "sugar", "lemon juice", "rose water"], "recipe": "Instructions for making Rasgulla...", } } if title in dataset: selected_entry = dataset[title] title = title ingredients = selected_entry["ingredients"] else: title = "Default Recipe Title" ingredients = [] input_text = f"Title: {title}\nIngredients: {', '.join(ingredients)}\n Instructions:" input_ids = recipe_tokenizer.encode(input_text, return_tensors="pt") output = recipe_model.generate(input_ids, max_length=max_length, num_return_sequences=1) generated_recipe = recipe_tokenizer.decode(output[0], skip_special_tokens=True) return generated_recipe col1, col2 = st.columns(2) my_upload = st.sidebar.file_uploader("Upload an image", type=["png", "jpg", "jpeg"]) if my_upload: st.image(my_upload, caption="Uploaded Image", use_column_width=True) if st.sidebar.button("Classify"): st.sidebar.text("Classifying...") image = Image.open(my_upload) try: classification_result = image_classifier(image) top_prediction = classification_result[0] label = top_prediction['label'] score = top_prediction['score'] st.sidebar.text("Top Prediction:") st.sidebar.text(f"Label: {label}, Score: {score:.3f}") except Exception as e: st.error(f"Error during classification: {str(e)}") if my_upload.size > MAX_FILE_SIZE: st.error("The uploaded file is too large. Please upload an image smaller than 5MB.") else: fix_image(my_upload) # Recipe generation based on selected item st.write("## Recipe Generation") selected_item = st.selectbox("Select a food item", ["Gulab Jamun", "Jalebi", "Rasgulla"]) if st.button("Generate Recipe"): generated_recipe = generate_recipe(selected_item, max_length=200) st.write(f"Recipe for {selected_item}:\n{generated_recipe}") # Add some descriptions and instructions st.sidebar.markdown("### Instructions") st.sidebar.markdown("1. Upload an image.") st.sidebar.markdown("2. Click the 'Classify' button to get the classification results.") st.sidebar.markdown("3. Select a food item to generate a recipe.") st.sidebar.markdown("4. Click the 'Generate Recipe' button to get the recipe.") # Display a placeholder for the main content st.write("Please upload an image and use the sidebar to classify it and generate a recipe.")