File size: 3,091 Bytes
8ffbf51
c73a6b4
 
 
6e2e0c5
c32572d
7c56b7b
c73a6b4
 
 
c32572d
 
 
c73a6b4
 
 
 
8ffbf51
79ec99d
c32572d
 
c73a6b4
 
 
 
 
 
 
 
a93e14b
 
c73a6b4
a93e14b
 
 
8ffbf51
c73a6b4
 
 
 
a93e14b
c73a6b4
 
7c56b7b
c73a6b4
 
 
 
 
6e2e0c5
c73a6b4
 
a93e14b
c32572d
c73a6b4
 
c32572d
8ffbf51
c73a6b4
6e2e0c5
fc4d401
c73a6b4
6e2e0c5
fc4d401
 
 
 
 
 
 
 
 
 
 
 
c73a6b4
fc4d401
 
 
 
c73a6b4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import streamlit as st
import requests
import os
import base64
from PIL import Image
from io import BytesIO  # Correctly import BytesIO from the io module

# Set page title
st.set_page_config(page_title="Image Caption Generator", layout="centered")

# API key from environment variable
API_KEY = os.environ.get("NEBIUS_API_KEY")

# UI for the app
st.title("Image Caption Generator")
st.write(
    "Upload an image, and this app will generate a detailed caption for it using the Nebius AI API."
)

if not API_KEY:
    st.error("API key not found. Please set the `NEBIUS_API_KEY` environment variable.")

# Function to call Nebius API
def generate_caption(image_base64, api_key):
    api_url = "https://api.studio.nebius.ai/v1/chat/completions"
    headers = {"Authorization": f"Bearer {api_key}"}
    payload = {
        "model": "Qwen/Qwen2-VL-72B-Instruct",
        "messages": [
            {
                "role": "system",
                "content": """You are an image to prompt converter. Your work is to observe each and every detail of the image and craft a detailed prompt under 75 words in this format: [image content/subject, description of action, state, and mood], [art form, style], [artist/photographer reference if needed], [additional settings such as camera and lens settings, lighting, colors, effects, texture, background, rendering].""",
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "Write a caption for this image"},
                    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}},
                ],
            },
        ],
        "temperature": 0,
    }

    response = requests.post(api_url, json=payload, headers=headers)
    if response.status_code == 200:
        return response.json()
    else:
        return {"error": response.text}

# File uploader for image
uploaded_image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])

if uploaded_image and API_KEY:
    # Convert the image to base64
    image = Image.open(uploaded_image)
    buffered = BytesIO()  # Use BytesIO from the io module
    image.save(buffered, format="PNG")
    image_base64 = base64.b64encode(buffered.getvalue()).decode()

    # Show the uploaded image
    st.image(image, caption="Uploaded Image", use_column_width=True)

    # Add a button to trigger caption generation
    if st.button("Generate Caption"):
        st.write("Generating caption...")
        result = generate_caption(image_base64, API_KEY)

        # Display the result
        if "error" in result:
            st.error(f"Error: {result['error']}")
        else:
            caption = result.get("messages", [{}])[-1].get("content", [{}])[0].get("text", "No caption generated.")
            st.subheader("Generated Caption")
            st.write(caption)
else:
    if not API_KEY:
        st.warning("Please set the `NEBIUS_API_KEY` environment variable.")
    else:
        st.info("Please upload an image.")

st.sidebar.write("Built with ❤️ by OpenAI GPT-4")