Spaces:
Sleeping
Sleeping
import streamlit as st | |
from PIL import Image | |
import numpy as np | |
from model_utils import BugClassifier, get_severity_prediction | |
from transformers import AutoFeatureExtractor | |
# Page configuration | |
st.set_page_config( | |
page_title="Bug-O-Scope ππ", | |
page_icon="π", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# Initialize session state | |
def load_model(): | |
try: | |
return BugClassifier(), AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224") | |
except Exception as e: | |
st.error(f"Error loading model: {str(e)}") | |
return None, None | |
if 'model' not in st.session_state: | |
st.session_state.model, st.session_state.feature_extractor = load_model() | |
def main(): | |
# Header | |
st.title("Bug-O-Scope ππ") | |
st.markdown(""" | |
Welcome to Bug-O-Scope! Upload a picture of an insect to learn more about it. | |
This educational tool helps you identify bugs and understand their role in our ecosystem. | |
""") | |
# Sidebar | |
st.sidebar.header("About Bug-O-Scope") | |
st.sidebar.markdown(""" | |
Bug-O-Scope is an AI-powered tool that helps you: | |
* π Identify insects from photos | |
* π Learn about different species | |
* π Understand their ecological impact | |
* π¬ Compare different insects | |
""") | |
# Main content | |
tab1, tab2 = st.tabs(["Single Bug Analysis", "Bug Comparison"]) | |
with tab1: | |
single_bug_analysis() | |
with tab2: | |
compare_bugs() | |
def single_bug_analysis(): | |
"""Handle single bug analysis""" | |
uploaded_file = st.file_uploader("Upload a bug photo", type=['png', 'jpg', 'jpeg'], key="single") | |
if uploaded_file: | |
try: | |
image = Image.open(uploaded_file) | |
col1, col2 = st.columns(2) | |
with col1: | |
st.image(image, caption="Uploaded Image", use_container_width=True) | |
with col2: | |
with st.spinner("Analyzing your bug..."): | |
# Get predictions | |
prediction, confidence = st.session_state.model.predict(image) | |
severity = get_severity_prediction(prediction) | |
st.success("Analysis Complete!") | |
st.markdown(f"### Identified Species") | |
st.markdown(f"**{prediction}**") | |
st.markdown(f"Confidence: {confidence:.2f}%") | |
st.markdown("### Ecological Impact") | |
severity_color = { | |
"Low": "green", | |
"Medium": "orange", | |
"High": "red" | |
} | |
st.markdown( | |
f"Severity: <span style='color: {severity_color[severity]}'>{severity}</span>", | |
unsafe_allow_html=True | |
) | |
# Generate and display species information | |
st.markdown("### About This Species") | |
species_info = st.session_state.model.get_species_info(prediction) | |
st.markdown(species_info) | |
# Display Grad-CAM visualization | |
st.markdown("### Feature Highlights") | |
gradcam = st.session_state.model.get_gradcam(image) | |
st.image(gradcam, caption="Important Features", use_container_width=True) | |
except Exception as e: | |
st.error(f"Error processing image: {str(e)}") | |
st.info("Please try uploading a different image.") | |
def compare_bugs(): | |
"""Handle bug comparison""" | |
col1, col2 = st.columns(2) | |
with col1: | |
file1 = st.file_uploader("Upload first bug photo", type=['png', 'jpg', 'jpeg'], key="compare1") | |
if file1: | |
try: | |
image1 = Image.open(file1) | |
st.image(image1, caption="First Bug", use_container_width=True) | |
except Exception as e: | |
st.error(f"Error loading first image: {str(e)}") | |
return | |
with col2: | |
file2 = st.file_uploader("Upload second bug photo", type=['png', 'jpg', 'jpeg'], key="compare2") | |
if file2: | |
try: | |
image2 = Image.open(file2) | |
st.image(image2, caption="Second Bug", use_container_width=True) | |
except Exception as e: | |
st.error(f"Error loading second image: {str(e)}") | |
return | |
if file1 and file2: | |
try: | |
with st.spinner("Generating comparison..."): | |
# Get predictions for both images | |
pred1, conf1 = st.session_state.model.predict(image1) | |
pred2, conf2 = st.session_state.model.predict(image2) | |
# Generate Grad-CAM visualizations | |
gradcam1 = st.session_state.model.get_gradcam(image1) | |
gradcam2 = st.session_state.model.get_gradcam(image2) | |
# Display results | |
st.markdown("### Comparison Results") | |
comp_col1, comp_col2 = st.columns(2) | |
with comp_col1: | |
st.markdown(f"**Species 1**: {pred1}") | |
st.markdown(f"Confidence: {conf1:.2f}%") | |
st.image(gradcam1, caption="Feature Highlights - Bug 1", use_container_width=True) | |
with comp_col2: | |
st.markdown(f"**Species 2**: {pred2}") | |
st.markdown(f"Confidence: {conf2:.2f}%") | |
st.image(gradcam2, caption="Feature Highlights - Bug 2", use_container_width=True) | |
# Display comparison information | |
st.markdown("### Key Differences") | |
differences = st.session_state.model.compare_species(pred1, pred2) | |
st.markdown(differences) | |
except Exception as e: | |
st.error(f"Error comparing images: {str(e)}") | |
st.info("Please try uploading different images or try again.") | |
if __name__ == "__main__": | |
main() |