| import streamlit as st |
| import tensorflow as tf |
| from tensorflow.keras.preprocessing.image import load_img, img_to_array |
| import numpy as np |
| from PIL import Image |
| import io |
|
|
| st.set_page_config( |
| page_title="Digit Classifier", |
| layout="centered" |
| ) |
|
|
| @st.cache_resource |
| def load_model(): |
| return tf.keras.models.load_model('./src/model.h5') |
|
|
| def preprocess_image(img: Image.Image): |
| img = img.convert('L') |
| img = img.resize((28, 28)) |
| img = img_to_array(img) |
| img = np.expand_dims(img, axis=0) |
| return img |
|
|
| def main(): |
| st.title("Digit Classifier") |
| st.write("Upload an image and the model will predict the digit") |
|
|
| uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"]) |
|
|
| if uploaded_file is not None: |
| image = Image.open(uploaded_file) |
| st.image(image, caption='Uploaded Image', use_column_width=True) |
|
|
| if st.button('Predict'): |
| model = load_model() |
|
|
| processed_image = preprocess_image(image) |
|
|
| with st.spinner('Predicting...'): |
| prediction = model.predict(processed_image) |
| pred_class = np.argmax(prediction) |
| confidence = float(prediction.max()) * 100 |
|
|
| st.success(f'Prediction: {pred_class}') |
| st.info(f'Confidence: {confidence:.2f}%') |
|
|
| st.write("Class Probabilities:") |
| for i, prob in enumerate(prediction[0]): |
| st.progress(float(prob)) |
| st.write(f"{i}: {float(prob)*100:.2f}%") |
|
|
| if __name__ == "__main__": |
| main() |