blind_vision / app.py
adil9858's picture
Create app.py
a6c1838 verified
raw
history blame
4.96 kB
import streamlit as st
import base64
from openai import OpenAI
from PIL import Image
import io
import cv2
import numpy as np
# Configure app
st.set_page_config(
page_title="AI Vision Assistant",
page_icon="🔍",
layout="wide",
initial_sidebar_state="expanded"
)
# Custom CSS (keep your existing CSS here)
st.markdown("""
<style>
/* Your existing CSS styles */
</style>
""", unsafe_allow_html=True)
# App title and description
st.title("🔍 Optimus Alpha | Live Vision Assistant")
# Initialize OpenAI client (keep your existing cached function)
@st.cache_resource
def get_client():
return OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key='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'
)
# ===== New Live Camera Section =====
st.subheader("Live Camera Feed")
run_camera = st.checkbox("Enable Camera", value=False)
FRAME_WINDOW = st.empty()
captured_image = None
if run_camera:
cap = cv2.VideoCapture(0)
capture_button = st.button("Capture Image")
stop_button = st.button("Stop Camera")
if stop_button:
run_camera = False
cap.release()
st.experimental_rerun()
while run_camera:
ret, frame = cap.read()
if not ret:
st.error("Failed to access camera")
break
# Display the live feed
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
FRAME_WINDOW.image(frame)
if capture_button:
captured_image = frame
run_camera = False
cap.release()
break
else:
FRAME_WINDOW.info("Camera is currently off")
# ===== Image Processing Section =====
col1, col2 = st.columns([1, 2])
with col1:
st.subheader("Image Source")
# Option to use captured image or upload
if captured_image is not None:
st.image(captured_image, caption="Captured Image", width=300)
use_captured = True
else:
use_captured = False
uploaded_file = st.file_uploader(
"Or upload an image",
type=["jpg", "jpeg", "png"],
disabled=use_captured
)
# Determine which image to use
if use_captured:
image = Image.fromarray(captured_image)
elif uploaded_file:
image = Image.open(uploaded_file)
else:
image = None
with col2:
st.subheader("AI Analysis")
user_prompt = st.text_input(
"Your question about the image:",
placeholder="e.g. 'What objects do you see?' or 'Explain this diagram'",
key="user_prompt"
)
if st.button("Analyze", type="primary") and image:
try:
# Convert image to base64
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
image_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8")
# Prepare messages
messages = [
{
"role": "system",
"content": """You are a real-time vision assistant. Analyze the current camera feed or uploaded image and:
1. Identify objects, people, text clearly
2. Answer follow-up questions precisely
3. Format responses with bullet points
4. Highlight urgent/important findings"""
},
{
"role": "user",
"content": [
{
"type": "text",
"text": user_prompt if user_prompt else "Describe what you see in detail"
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}"
}
}
]
}
]
# Stream the response
response_container = st.empty()
full_response = ""
client = get_client()
stream = client.chat.completions.create(
model="openrouter/optimus-alpha",
messages=messages,
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content is not None:
full_response += chunk.choices[0].delta.content
response_container.markdown(f"""
<div class="markdown-text">
{full_response}
</div>
""", unsafe_allow_html=True)
except Exception as e:
st.error(f"Error: {str(e)}")
# Sidebar (keep your existing sidebar)
with st.sidebar:
st.image("blob.png", width=200)
st.markdown("""
*Powered by OpenRouter*
""")
st.markdown("---")
st.markdown("Made with ❤️ by Koshur AI")