NeuralVision / app.py
NeonSamurai's picture
Update app.py
40fa248 verified
import streamlit as st
import keras
import cv2
import numpy as np
import pickle
from PIL import Image
st.set_page_config(page_title="CV2 Image Detection", layout="centered")
st.title("๐Ÿ–ผ๏ธ A Minor Project on Image Detection using CNN and CV2 (A Simplified Clone of CNN Explainer)")
# Cache the model and label encoder
@st.cache_resource
def load_model():
try:
model_path = r"cv2_model.keras"
label_encoder_path = r"label_encoder.pkl"
model = keras.models.load_model(model_path)
with open(label_encoder_path, 'rb') as file:
label_encoder = pickle.load(file)
return model, label_encoder
except Exception as e:
st.error(f"Error loading model: {e}")
return None, None
# File uploader for image input
user_input_img = st.file_uploader("๐Ÿ“ค Upload an Image", type=["jpg", "jpeg", "png"])
# Initialize session state for prediction
if "prediction" not in st.session_state:
st.session_state["prediction"] = None
st.session_state["uploaded_img"] = None
if user_input_img is not None:
# Load and preprocess image
img = Image.open(user_input_img)
img_array = np.array(img)
img_resized = cv2.resize(img_array, (64, 64))
img_resized = np.expand_dims(img_resized, axis=0) # Another way to batch dimension instead of np.newaxis
# Store image in session state
st.session_state["uploaded_img"] = img
# Button for Prediction
if st.button("๐Ÿ” Predict"):
if st.session_state['uploaded_img'] is None:
st.warning("โš ๏ธ Please upload an image before predicting!")
else:
model, encoder = load_model()
if model and encoder:
# Make prediction
predicted_label = encoder.inverse_transform(np.argmax(model.predict(img_resized), axis = 1))
# Store prediction in session state
st.session_state["prediction"] = predicted_label
# Display result in two columns if prediction exists
if st.session_state["prediction"]:
col1, col2 = st.columns([1, 1])
with col1:
st.success(f"**Prediction:** {st.session_state['prediction']}")
with col2:
st.image(st.session_state["uploaded_img"], caption="Uploaded Image", use_container_width =True)