cat-vs-dog-classifier / streamlit_app.py
AbdelhamidKHELLADI
First commi
4011904
import streamlit as st
import onnxruntime as ort
from PIL import Image
import numpy as np
MODEL_PATH = "models/mobilenetv3_catsdogs_quantized_static.onnx"
# Load ONNX model
@st.cache_resource
def load_model():
session = ort.InferenceSession(MODEL_PATH, providers=["CPUExecutionProvider"])
return session
session = load_model()
def preprocess_image(image):
image = image.resize((224, 224))
img = np.array(image).astype(np.float32) / 255.0
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
img = (img - mean) / std
img = np.transpose(img, (2, 0, 1))
img = np.expand_dims(img, axis=0).astype(np.float32)
return img
CLASSES = ["Cat", "Dog"]
st.set_page_config(page_title="Cat vs Dog Classifier ", layout="centered")
st.title("Cat vs Dog Classifier")
st.markdown("Upload an image and let the model decide if it’s a **cat** or a **dog**.")
uploaded_file = st.file_uploader("Upload your image", type=["jpg", "jpeg", "png"])
if uploaded_file:
image = Image.open(uploaded_file).convert("RGB")
st.image(image, caption="Uploaded Image", width="stretch")
img_tensor = preprocess_image(image)
with st.spinner("Running inference..."):
outputs = session.run(None, {"input": img_tensor})
probs = np.exp(outputs[0]) / np.sum(np.exp(outputs[0]))
pred_idx = int(np.argmax(probs))
pred_class = CLASSES[pred_idx]
confidence = probs[0][pred_idx] * 100
st.markdown("---")
st.subheader(f"Prediction: **{pred_class}**")
st.write(f"Confidence: `{confidence:.2f}%`")