Hand Written Digit Detection Using Keras

First of all we prepare a hand written digit detection model :
Let's Start it.

Import all necessary module 

import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout

from keras.utils import np_utils

Load Data and Convert into image with size 28*28

(x_train, y_train), (x_test, y_test) = mnist.load_data()
num_pixels = x_train.shape[1] * x_train.shape[2]
x_train = x_train.reshape(x_train.shape[0], num_pixels).astype('float32')

x_test = x_test.reshape(x_test.shape[0], num_pixels).astype('float32')

Normalize Data 0-255 to 0-1 and one hot encode ouput

x_train = x_train / 255
x_test = x_test / 255
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

num_classes = y_test.shape[1]


Create Model 
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))

Compile Model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Fit Model
model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=200, verbose=2)

Evaluate The Model
scores = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (100-scores[1]*100))

Save the model in H5 file formate
model.save("digitcnnmodel.h5")

Test Model with MNIST Datasets
import numpy as np
prediction = model.predict(x_train)
np.argmax(prediction[1])

TEST THE MODEL WITH OWN DATA(IMAGE)

from keras.models  import load_model
import numpy as np
import cv2
model = load_model("digitcnnmodel.model") 
image = cv2.imread("photo_2.jpg")
image1 = cv2.imread("photo_2.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (5, 5), 0)
ret, image = cv2.threshold(image, 90, 255, cv2.THRESH_BINARY_INV)
ctrs, hier = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rects = [cv2.boundingRect(ctr) for ctr in ctrs]
for rect in rects:
    cv2.rectangle(image, (rect[0], rect[1]), (rect[0] + rect[2], rect[1] + rect[3]), (0, 255, 0), 3)
    leng = int(rect[3] * 1.6)
    pt1 = int(rect[1] + rect[3] // 2 - leng // 2)
    pt2 = int(rect[0] + rect[2] // 2 - leng // 2)
    roi = image[pt1:pt1+leng, pt2:pt2+leng]
    roi = cv2.resize(roi,(28,28),interpolation=cv2.INTER_AREA)
    roi = roi.reshape(1,784)
    roi=cv2.dilate(roi,(3,3))
    roi = np.array(roi, dtype='float32')
    roi /= 255    pred_array = model.predict(roi)
    pred_array = np.argmax(pred_array)
    print('Result: {0}'.format(pred_array))
    cv2.putText(image1, str(pred_array), (rect[0], rect[1]),cv2.FONT_HERSHEY_DUPLEX, 2, (0, 0, 255), 3)
    cv2.imshow("Result",image1)
cv2.waitKey(0)



Happy Coding 😊😊