import requests from PIL import Image, ImageEnhance, ImageFilter, ImageDraw, ImageFont from transformers import BlipProcessor, BlipForConditionalGeneration import streamlit as st import torch import os from io import BytesIO import barcode from barcode.writer import ImageWriter # Set device to CPU device = torch.device("cpu") # Load the BLIP model and processor processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large") model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-large").to(device) # Your Gemini API key GEMINI_API_KEY = os.getenv('gemini_api') def generate_detailed_description(image): inputs = processor(image, return_tensors="pt") out = model.generate(**inputs) description = processor.decode(out[0], skip_special_tokens=True) return description def suggest_enhancements(image): suggestions = [ "Consider adjusting the brightness for a more vivid image.", "Increase contrast to make the image details stand out more.", "Apply sharpening to enhance image details.", "Use a filter to create a specific mood or style." ] return suggestions def enhance_description_with_gemini(description): url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key={GEMINI_API_KEY}" headers = {"Content-Type": "application/json"} data = { "contents": [ { "parts": [ { "text": ( f"Based on the following description of an image, provide a more detailed description, " f"generate possible captions, and suggest logo ideas. \n\n" f"Description: {description}\n\n" f"Detailed Description:\n" f"Captions:\n" f"Logo Suggestions:\n" ) } ] } ] } try: response = requests.post(url, headers=headers, json=data) response.raise_for_status() response_json = response.json() if "candidates" in response_json and len(response_json["candidates"]) > 0: candidate = response_json["candidates"][0] if "content" in candidate and "parts" in candidate["content"]: parts = candidate["content"]["parts"] if len(parts) > 0: return parts[0].get("text", "No response text found") return "No contents or parts in response" except requests.exceptions.RequestException as e: return f"Request failed: {e}" def create_label(image, ingredients, usage, expiry_date, barcode_data): try: # Create an image for the label label_image = Image.new('RGB', (800, 1200), color='white') draw = ImageDraw.Draw(label_image) # Define font and size try: font = ImageFont.truetype("arial.ttf", 24) except IOError: font = ImageFont.load_default() # Draw the main image image.thumbnail((600, 400)) label_image.paste(image, (100, 50)) # Draw text text_position = (100, 500) draw.text(text_position, f"Ingredients:\n{ingredients}", font=font, fill="black") text_position = (100, 600) draw.text(text_position, f"Usage:\n{usage}", font=font, fill="black") text_position = (100, 700) draw.text(text_position, f"Expiry Date: {expiry_date}", font=font, fill="black") # Draw barcode if len(barcode_data) == 12: # Check length for EAN-13 barcode_image = generate_barcode(barcode_data) label_image.paste(barcode_image, (100, 800)) else: draw.text((100, 800), "Invalid Barcode Data", font=font, fill="red") return label_image except Exception as e: raise RuntimeError(f"Error generating label: {e}") # Streamlit interface continuation if st.button('Generate Label'): if ingredients and usage and expiry_date and barcode_data: try: label_image = create_label(image, ingredients, usage, expiry_date, barcode_data) st.image(label_image, caption="Generated Label") except Exception as e: st.error(f"Error generating label: {e}") else: st.error("Please provide all required details for the label.") def generate_barcode(data): code = barcode.get('ean13', data, writer=ImageWriter()) barcode_image = code.render() return barcode_image # Streamlit interface st.title("Image Detailed Description, Captions, Logo Suggestions Generator with Image Enhancement Options") # Custom CSS for the button style and alignment st.markdown(""" """, unsafe_allow_html=True) # Session state to store the descriptions if 'initial_description' not in st.session_state: st.session_state['initial_description'] = None if 'enhanced_text' not in st.session_state: st.session_state['enhanced_text'] = None uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "png", "jpeg"]) img_url = st.text_input("Or enter image URL...") if uploaded_file or img_url: if uploaded_file: image = Image.open(uploaded_file).convert('RGB') else: response = requests.get(img_url, stream=True) image = Image.open(response.raw).convert('RGB') st.image(image, caption="Uploaded Image", use_column_width=True) if st.session_state['initial_description'] is None: with st.spinner("Generating caption..."): initial_description = generate_detailed_description(image) enhanced_text = enhance_description_with_gemini(initial_description) st.session_state['initial_description'] = initial_description st.session_state['enhanced_text'] = enhanced_text else: initial_description = st.session_state['initial_description'] enhanced_text = st.session_state['enhanced_text'] st.subheader("Initial Description") st.write(initial_description) st.subheader("Enhanced Description, Captions, and Logo Suggestions with Image Enhancement Options") st.write(enhanced_text) # Function to generate and show enhancement suggestions def show_enhancements(image, effect_name): buffer = BytesIO() image.save(buffer, format="PNG") buffer.seek(0) st.markdown('
', unsafe_allow_html=True) st.download_button( label=f"Download {effect_name} Image", data=buffer, file_name=f"{effect_name}_image.png", mime="image/png" ) st.markdown('
', unsafe_allow_html=True) # Display enhancement options st.subheader("Enhancement Options") if st.button('Increase Brightness'): enhancer = ImageEnhance.Brightness(image) enhanced_image = enhancer.enhance(1.5) st.image(enhanced_image, caption="Enhanced Brightness") show_enhancements(enhanced_image, "Brightness") if st.button('Increase Contrast'): enhancer = ImageEnhance.Contrast(image) enhanced_image = enhancer.enhance(1.5) st.image(enhanced_image, caption="Enhanced Contrast") show_enhancements(enhanced_image, "Contrast") if st.button('Sharpen Image'): enhanced_image = image.filter(ImageFilter.SHARPEN) st.image(enhanced_image, caption="Sharpened Image") show_enhancements(enhanced_image, "Sharpen") if st.button('Apply Gaussian Blur'): enhanced_image = image.filter(ImageFilter.GaussianBlur(radius=2)) st.image(enhanced_image, caption="Blurred Image") show_enhancements(enhanced_image, "Blur") if st.button('Apply Edge Enhancement'): enhanced_image = image.filter(ImageFilter.EDGE_ENHANCE) st.image(enhanced_image, caption="Edge Enhanced Image") show_enhancements(enhanced_image, "Edge Enhancement") # Inputs for label details st.subheader("Generate Label") ingredients = st.text_area("Ingredients") usage = st.text_area("Usage Instructions") expiry_date = st.text_input("Expiry Date (e.g., 2024-12-31)") barcode_data = st.text_input("Barcode Data") if st.button('Generate Label'): if ingredients and usage and expiry_date and barcode_data: try: label_image = create_label(image, ingredients, usage, expiry_date, barcode_data) st.image(label_image) except Exception as e: st.error(f"Error generating label: {e}")