Spaces:
Running
Running
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
) |