Spaces:
Sleeping
Sleeping
import numpy as np | |
import gradio as gr | |
from PIL import Image | |
def ReLU(Z): | |
return np.maximum(Z, 0) | |
def softmax(Z): | |
A = np.exp(Z) / np.sum(np.exp(Z), axis=0) | |
return A | |
def init_params(): | |
W1 = np.random.rand(10, 784) - 0.5 | |
b1 = np.random.rand(10, 1) - 0.5 | |
W2 = np.random.rand(10, 10) - 0.5 | |
b2 = np.random.rand(10, 1) - 0.5 | |
return W1, b1, W2, b2 | |
def forward_prop(W1, b1, W2, b2, X): | |
Z1 = W1.dot(X) + b1 | |
A1 = ReLU(Z1) | |
Z2 = W2.dot(A1) + b2 | |
A2 = softmax(Z2) | |
return Z1, A1, Z2, A2 | |
def get_predictions(A2): | |
return np.argmax(A2, axis=0) | |
def make_predictions(X, W1, b1, W2, b2): | |
_, _, _, A2 = forward_prop(W1, b1, W2, b2, X) | |
predictions = get_predictions(A2) | |
return predictions | |
def predict_digit(img): | |
# Load the trained parameters | |
params = np.load("trained_params.npz", allow_pickle=True) | |
W1, b1, W2, b2 = params["W1"], params["b1"], params["W2"], params["b2"] | |
# Convert the sketchpad drawing to grayscale and resize it to (28, 28) | |
img_pil = Image.fromarray(np.uint8(img * 255)).convert("L") | |
res=img_pil.resize((28, 28)) | |
# Convert the image to a NumPy array and normalize it | |
X = np.array(res).reshape((784, 1)) / 255. | |
# Get the prediction | |
prediction = make_predictions(X, W1, b1, W2, b2) | |
return int(prediction) | |
iface = gr.Interface( | |
fn=predict_digit, | |
inputs="sketchpad", | |
outputs=gr.outputs.Label(num_top_classes=3), | |
live=True, | |
capture_session=True, | |
title="Handwritten Digit Recognizer", | |
description="Draw a digit using your mouse, and the model will try to recognize it.", | |
) | |
if __name__ == "__main__": | |
iface.launch() |