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
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 😊😊
0 Comments