File size: 3,805 Bytes
8ffbf51
c73a6b4
 
 
6e2e0c5
03e23d5
7c56b7b
2e0de3d
c73a6b4
 
c32572d
 
 
 
 
c73a6b4
 
 
 
 
 
 
 
a93e14b
 
ce7f596
a93e14b
 
 
8ffbf51
ce7f596
c73a6b4
 
 
a93e14b
c73a6b4
 
7c56b7b
99dbe33
 
 
 
 
 
 
 
 
 
6e2e0c5
c73a6b4
 
a93e14b
c32572d
c73a6b4
 
03e23d5
8ffbf51
c73a6b4
6e2e0c5
fc4d401
2e0de3d
6e2e0c5
fc4d401
2e0de3d
fc4d401
 
 
d6030a5
fc4d401
 
 
99dbe33
d6030a5
 
 
 
 
 
 
8b45070
2e0de3d
99dbe33
 
c73a6b4
fc4d401
 
 
 
c73a6b4
8b45070
2e0de3d
 
 
8b45070
 
 
 
 
 
2e0de3d
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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 and layout
st.set_page_config(page_title="Image Caption Generator", layout="centered")

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

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": """observe each and every detail of the image and craft a detailed prompt 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": "Describe This Image In Great Details"},
                    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}},
                ],
            },
        ],
        "temperature": 0,
    }

    try:
        response = requests.post(api_url, json=payload, headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            st.error(f"API Error: {response.status_code}, {response.text}")
            return {"error": response.text}
    except Exception as e:
        st.error(f"An exception occurred: {e}")
        return {"error": str(e)}

# 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_container_width=True)

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

        # Extract and display the generated caption
        if "error" in result:
            st.error(f"Error: {result['error']}")
        else:
            try:
                # Extract the caption from the response
                caption = (
                    result.get("choices", [{}])[0]
                    .get("message", {})
                    .get("content", "No caption generated.")
                )
                st.subheader("Generated Caption")
                st.write(caption)

            except Exception as e:
                st.error(f"Error processing the response: {e}")
else:
    if not API_KEY:
        st.warning("Please set the `NEBIUS_API_KEY` environment variable.")
    else:
        st.info("Please upload an image.")

# Remove the sidebar and center the content
st.markdown(
    """
    <style>
        .css-1d391kg {text-align: center;}
        .css-1v3fvcr {justify-content: center; display: flex;}
        .css-1y4ccs5 {margin: 0 auto;}
        .css-1aumxhk {display: flex; justify-content: center;}
        .css-1k6kn8p {justify-content: center; align-items: center; display: flex;}
        .css-ffhzg6 {text-align: center;}
    </style>
    """, unsafe_allow_html=True
)