File size: 3,748 Bytes
325f2c0
e3979e6
 
325f2c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3af97b
325f2c0
b3af97b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3979e6
 
b3af97b
 
 
 
 
 
 
 
 
 
 
 
 
 
325f2c0
 
 
 
b3af97b
e3979e6
325f2c0
b3af97b
 
325f2c0
b3af97b
 
325f2c0
b3af97b
 
 
 
 
 
 
 
 
325f2c0
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
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):
    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": "Explain the Image in 10 words only"},
                    {
                        "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")

if img_file_buffer:
    # 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", use_column_width=True)

    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)
        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
)