|
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 |
|
|
|
|
|
st.set_page_config( |
|
page_title="Knee Osteoarthritis Classifier", |
|
layout="centered", |
|
initial_sidebar_state="auto" |
|
) |
|
|
|
|
|
st.title("🔍 Knee Osteoarthritis Severity Classifier") |
|
st.markdown("Upload a **knee X-ray** image to predict the severity level: **Healthy**, **Moderate**, or **Severe**.") |
|
|
|
|
|
@st.cache_resource |
|
def load_effnet_model(): |
|
model = load_model("efficientnetb3_knee_oa.keras") |
|
return model |
|
|
|
model = load_effnet_model() |
|
|
|
|
|
class_labels = ['Healthy', 'Moderate', 'Severe'] |
|
|
|
|
|
uploaded_file = st.file_uploader("📤 Upload an X-ray image (PNG/JPG)", type=["jpg", "jpeg", "png"]) |
|
|
|
|
|
if uploaded_file is None: |
|
st.info("No image uploaded. Displaying a default sample image.") |
|
uploaded_file = "sample_image.png" |
|
|
|
|
|
if uploaded_file: |
|
img = Image.open(uploaded_file).convert("RGB") |
|
st.image(img, caption="Uploaded Image", use_column_width=True) |
|
|
|
|
|
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 |
|
|
|
|
|
preds = model.predict(img_array) |
|
predicted_class = class_labels[np.argmax(preds)] |
|
confidence = np.max(preds) |
|
|
|
|
|
st.subheader("🔬 Prediction:") |
|
st.success(f"**{predicted_class}** with {confidence*100:.2f}% confidence.") |
|
|
|
|
|
|