File size: 3,969 Bytes
325f2c0
e3979e6
 
325f2c0
 
 
 
 
 
 
 
 
 
 
 
 
7dcb1ad
325f2c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7dcb1ad
325f2c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3af97b
325f2c0
b3af97b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3979e6
 
b3af97b
 
 
 
 
 
 
 
 
 
 
 
 
 
325f2c0
7dcb1ad
 
 
d9a8c7f
7dcb1ad
 
 
325f2c0
 
d9a8c7f
 
325f2c0
b3af97b
 
7dcb1ad
 
b3af97b
325f2c0
b3af97b
 
 
 
 
 
 
 
 
7dcb1ad
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import streamlit as st
import warnings
warnings.filterwarnings('ignore')
import requests
import base64
from PIL import Image
from io import BytesIO

# Function to encode an image into base64 format
def encode_image(img):
    buffered = BytesIO()
    img.save(buffered, format="PNG")
    encoded_string = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return encoded_string

# Function to get explanation from VLM API
def explain_image_with_vlm(image, prompt):
    api = "https://api.hyperbolic.xyz/v1/chat/completions"
    api_key = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZGlsYXppejIwMTNAZ21haWwuY29tIiwiaWF0IjoxNzMyODU1NDI1fQ.lRjbz9LMW9jj7Lf7I8m_dTRh4KQ1wDCdWiTRGErMuEk"

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {api_key}",
    }

    base64_img = encode_image(image)

    payload = {
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},  # Use the user-provided prompt
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{base64_img}"},
                    },
                ],
            }
        ],
        "model": "Qwen/Qwen2-VL-72B-Instruct",
        "max_tokens": 2048,
        "temperature": 0.7,
        "top_p": 0.9,
    }

    response = requests.post(api, headers=headers, json=payload)
    if response.status_code == 200:
        return response.json().get("choices", [{}])[0].get("message", {}).get("content", "No explanation found.")
    else:
        return f"Error: {response.status_code} - {response.text}"

# Streamlit UI
st.set_page_config(page_title="๐Ÿ”ฎ AI Vision: Image Insights", layout="wide")

# Header section with futuristic visuals
st.markdown(
    """
    <style>
    .main-header {
        text-align: center;
        font-size: 2.5rem;
        color: #00FFFF;
        font-family: 'Courier New', monospace;
        text-shadow: 0px 0px 8px #00FFFF;
        margin-bottom: 20px;
    }
    .sub-header {
        text-align: center;
        font-size: 1.5rem;
        color: #FFD700;
        font-family: 'Courier New', monospace;
        margin-bottom: 40px;
    }
    </style>
    <div class="main-header">๐Ÿ”ฎ ImageX</div>
    <div class="sub-header">Image Data Uncovered</div>
    """,
    unsafe_allow_html=True
)

# Sidebar for additional futuristic customization
st.sidebar.title("๐Ÿ”ง Settings")
image_format = st.sidebar.radio("Select Image Format:", ["PNG", "JPEG"], index=0)
explanation_length = st.sidebar.slider("Explanation Length (words):", min_value=5, max_value=20, value=10)

def styled_header(header_text):
    return f"<h3 style='color:#7FFF00;'>{header_text}</h3>"

# Main Camera Input Section
img_file_buffer = st.camera_input("๐Ÿš€ Capture Your Image Here")

# Text prompt input
user_prompt = st.text_input(
    "๐Ÿ“ Enter your prompt (e.g., 'Explain the image', 'What are the functions in this graph?', 'Describe the scene'):",
    value="Enter your Prompt:"
)

if img_file_buffer and user_prompt:
    # Display captured image
    image = Image.open(img_file_buffer)
    #st.markdown(styled_header("๐Ÿ“ธ Your Captured Image:"), unsafe_allow_html=True)
    #st.image(image, caption="Captured Image")

    st.markdown(styled_header("๐Ÿค– Image Analysis:"), unsafe_allow_html=True)
    with st.spinner("๐Ÿ” The AI is analyzing your image. Please wait..."):
        explanation = explain_image_with_vlm(image, user_prompt)
        st.success("โœจ Analysis Complete!")
        st.write(f"**AI Insight:** {explanation}")

# Footer
st.markdown(
    """
    <footer style="text-align: center; margin-top: 50px;">
        <hr style="border: 1px solid #00FFFF;">
        <p style="font-family: 'Courier New', monospace; color: #AAAAAA;">Developed by: <b>DataScienceProF</b> | <i>Empowering the Future</i></p>
    </footer>
    """,
    unsafe_allow_html=True
)