Spaces:
Sleeping
Sleeping
| 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.") | |