File size: 1,573 Bytes
2d08276
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image, ImageOps

# Load the model directly
# reliable for Spaces where you upload the model file alongside the app
model = tf.keras.models.load_model("mnist_model.keras")

def predict_digit(image):
    if image is None:
        return None
    
    # 1. Convert to grayscale
    image = image.convert('L')
    
    # 2. Resize to 28x28 to match training data
    image = image.resize((28, 28))
    
    # 3. Invert colors (MNIST is white text on black background)
    # Most user uploads are black text on white background (paper), so we usually need to invert
    # We check mean pixel value; if > 127, it's likely a white background.
    if np.mean(image) > 127:
        image = ImageOps.invert(image)
        
    # 4. Convert to numpy array and normalize
    image_array = np.array(image) / 255.0
    
    # 5. Flatten to shape (1, 784) as expected by the Dense input layer
    image_array = image_array.reshape(1, 784)
    
    # Predict
    prediction = model.predict(image_array)
    
    # Return dictionary for Gradio Label output
    return {str(i): float(prediction[0][i]) for i in range(10)}

iface = gr.Interface(
    fn=predict_digit,
    inputs=gr.Image(type="pil", label="Upload an Image"),
    outputs=gr.Label(num_top_classes=3, label="Predictions"),
    title="MNIST Digit Classifier",
    description="Upload an image of a handwritten digit (0-9) to see the prediction. Works best with a single digit centered in the image."
)

if __name__ == "__main__":
    iface.launch()