alperugurcan's picture
Update app.py
f18ac04 verified
import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image
import logging
# Set up logging
logging.basicConfig(level=logging.INFO)
# Load the model
try:
model = tf.keras.models.load_model("ElYazisiRakamlariTahmin.h5")
logging.info("Model loaded successfully")
except Exception as e:
logging.error(f"Error loading model: {str(e)}")
model = None
def preprocess_image(image):
try:
# Convert to grayscale
image = image.convert("L")
# Resize to 28x28 pixels
image = image.resize((28, 28))
# Convert to numpy array and normalize
img_array = np.array(image, dtype=np.float32) / 255.0
# Reshape to (1, 28, 28) as per your model's input shape
img_array = img_array.reshape(1, 28, 28)
logging.info("Image preprocessed successfully")
return img_array
except Exception as e:
logging.error(f"Error in preprocessing: {str(e)}")
return None
def predict_digit(image):
if model is None:
return "Error: Model not loaded properly"
try:
# Check if the input is a valid image
if not isinstance(image, Image.Image):
return "Error: Invalid input. Please upload an image."
preprocessed = preprocess_image(image)
if preprocessed is None:
return "Error: Failed to preprocess the image"
# Make prediction
logits = model.predict(preprocessed)
probabilities = tf.nn.softmax(logits).numpy()[0]
predicted_digit = np.argmax(probabilities)
confidence = probabilities[predicted_digit]
# Get top 3 predictions
top_3_indices = np.argsort(probabilities)[-3:][::-1]
top_3_probs = probabilities[top_3_indices]
result = f"Predicted Digit: {predicted_digit}\n"
result += f"Confidence: {confidence:.2f}\n\n"
result += "Top 3 Predictions:\n"
for digit, prob in zip(top_3_indices, top_3_probs):
result += f"Digit {digit}: {prob:.2f}\n"
logging.info(f"Prediction made: {result}")
return result
except Exception as e:
logging.error(f"Error in prediction: {str(e)}")
return f"Error during prediction: {str(e)}"
# Gradio interface
iface = gr.Interface(
fn=predict_digit,
inputs=gr.Image(type="pil"),
outputs="text",
title="Handwritten Digit Recognition",
description="Upload an image of a handwritten digit (0-9) to get a prediction."
)
# For debugging: print model summary
if model is not None:
model.summary()
# Launch the interface
iface.launch()