knee_oa_app / app.py
harshini-m-ai's picture
Update app.py
02c7efd verified
import streamlit as st
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
from PIL import Image
# Set page config
st.set_page_config(
page_title="Knee Osteoarthritis Classifier",
layout="centered",
initial_sidebar_state="auto"
)
# Title
st.title("🔍 Knee Osteoarthritis Severity Classifier")
st.markdown("Upload a **knee X-ray** image to predict the severity level: **Healthy**, **Moderate**, or **Severe**.")
# Load model
@st.cache_resource
def load_effnet_model():
model = load_model("efficientnetb3_knee_oa.keras")
return model
model = load_effnet_model()
# Define class labels
class_labels = ['Healthy', 'Moderate', 'Severe']
# Image uploader
uploaded_file = st.file_uploader("📤 Upload an X-ray image (PNG/JPG)", type=["jpg", "jpeg", "png"])
# Or show default image
if uploaded_file is None:
st.info("No image uploaded. Displaying a default sample image.")
uploaded_file = "sample_image.png"
# Prediction and result
if uploaded_file:
img = Image.open(uploaded_file).convert("RGB")
st.image(img, caption="Uploaded Image", use_column_width=True)
# Preprocess image
img_resized = img.resize((224, 224))
img_array = image.img_to_array(img_resized)
img_array = np.expand_dims(img_array, axis=0) / 255.0
# Predict
preds = model.predict(img_array)
predicted_class = class_labels[np.argmax(preds)]
confidence = np.max(preds)
# Output
st.subheader("🔬 Prediction:")
st.success(f"**{predicted_class}** with {confidence*100:.2f}% confidence.")