vertopal.com_HandWritten
vertopal.com_HandWritten
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D,
Flatten, Dropout
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# Compilation
model.compile(loss="categorical_crossentropy", optimizer="adam",
metrics=["accuracy"])
return model
# Compilation
model.compile(loss="categorical_crossentropy", optimizer="adam",
metrics=["accuracy"])
return model
az_model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# Plotting function
def plot_history(history, model_name):
plt.figure(figsize=(12, 6))
plt.tight_layout()
plt.show()
# Plot
plot_history(az_model_history, 'HCR')
C:\Users\Roopa\anaconda3\Lib\site-packages\keras\src\layers\
convolutional\base_conv.py:107: UserWarning: Do not pass an
`input_shape`/`input_dim` argument to a layer. When using Sequential
models, prefer using an `Input(shape)` object as the first layer in
the model instead.
super().__init__(activity_regularizer=activity_regularizer,
**kwargs)
Epoch 1/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 26s 10ms/step - accuracy: 0.8518 -
loss: 0.4439 - val_accuracy: 0.9828 - val_loss: 0.0553
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 18s 10ms/step - accuracy: 0.9771 -
loss: 0.0748 - val_accuracy: 0.9853 - val_loss: 0.0463
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 18s 10ms/step - accuracy: 0.9829 -
loss: 0.0531 - val_accuracy: 0.9891 - val_loss: 0.0353
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 18s 10ms/step - accuracy: 0.9858 -
loss: 0.0444 - val_accuracy: 0.9897 - val_loss: 0.0296
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 18s 10ms/step - accuracy: 0.9878 -
loss: 0.0374 - val_accuracy: 0.9916 - val_loss: 0.0272
Epoch 1/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 17s 32ms/step - accuracy: 0.7226 - loss:
0.8589 - val_accuracy: 0.9760 - val_loss: 0.0830
Epoch 2/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 30ms/step - accuracy: 0.9659 - loss:
0.1101 - val_accuracy: 0.9814 - val_loss: 0.0573
Epoch 3/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 30ms/step - accuracy: 0.9758 - loss:
0.0741 - val_accuracy: 0.9867 - val_loss: 0.0410
Epoch 4/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 31ms/step - accuracy: 0.9824 - loss:
0.0575 - val_accuracy: 0.9870 - val_loss: 0.0410
Epoch 5/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 30ms/step - accuracy: 0.9828 - loss:
0.0525 - val_accuracy: 0.9891 - val_loss: 0.0310
Epoch 6/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 10s 32ms/step - accuracy: 0.9873 - loss:
0.0418 - val_accuracy: 0.9900 - val_loss: 0.0293
Epoch 7/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 10s 32ms/step - accuracy: 0.9874 - loss:
0.0393 - val_accuracy: 0.9902 - val_loss: 0.0288
Epoch 8/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 31ms/step - accuracy: 0.9889 - loss:
0.0351 - val_accuracy: 0.9907 - val_loss: 0.0273
Epoch 9/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 30ms/step - accuracy: 0.9898 - loss:
0.0324 - val_accuracy: 0.9911 - val_loss: 0.0264
Epoch 10/10
300/300 ━━━━━━━━━━━━━━━━━━━━ 9s 30ms/step - accuracy: 0.9908 - loss:
0.0290 - val_accuracy: 0.9917 - val_loss: 0.0261
Epoch 1/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 61s 6ms/step - accuracy: 0.8952 - loss:
0.3744 - val_accuracy: 0.9686 - val_loss: 0.1093
Epoch 2/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 53s 6ms/step - accuracy: 0.9712 - loss:
0.0971 - val_accuracy: 0.9731 - val_loss: 0.0918
Epoch 3/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 48s 5ms/step - accuracy: 0.9794 - loss:
0.0687 - val_accuracy: 0.9764 - val_loss: 0.0804
Epoch 4/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 48s 5ms/step - accuracy: 0.9829 - loss:
0.0545 - val_accuracy: 0.9817 - val_loss: 0.0668
Epoch 5/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 49s 5ms/step - accuracy: 0.9861 - loss:
0.0441 - val_accuracy: 0.9807 - val_loss: 0.0723
Epoch 6/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 44s 5ms/step - accuracy: 0.9877 - loss:
0.0390 - val_accuracy: 0.9835 - val_loss: 0.0656
Epoch 7/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 39s 4ms/step - accuracy: 0.9892 - loss:
0.0339 - val_accuracy: 0.9828 - val_loss: 0.0698
Epoch 8/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 39s 4ms/step - accuracy: 0.9902 - loss:
0.0324 - val_accuracy: 0.9840 - val_loss: 0.0684
Epoch 9/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 39s 4ms/step - accuracy: 0.9903 - loss:
0.0307 - val_accuracy: 0.9847 - val_loss: 0.0733
Epoch 10/10
9312/9312 ━━━━━━━━━━━━━━━━━━━━ 39s 4ms/step - accuracy: 0.9919 - loss:
0.0272 - val_accuracy: 0.9865 - val_loss: 0.0701
import tkinter as tk
from tkinter import Button, Canvas, Toplevel, Label
from tkinter.font import Font
from PIL import Image, ImageDraw, ImageOps
import numpy as np
from tensorflow.keras.models import load_model
# Explicitly compile the models with dummy optimizer and loss to avoid
warnings
mnist_model1.compile(optimizer='adam',
loss='sparse_categorical_crossentropy', metrics=['accuracy'])
mnist_model2.compile(optimizer='adam',
loss='sparse_categorical_crossentropy', metrics=['accuracy'])
az_model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy', metrics=['accuracy'])
class DrawingApp:
def __init__(self, root):
self.root = root
self.root.title("Handwritten Alphanumeric Character
Recognition")
self.root.configure(bg='#008080') # Set background color to
purple
# Set up font
self.font = Font(family="Oswald", size=12, weight="bold")
# Create and pack label for title with white text color
self.title_label = Label(root, text="HANDWRITTEN\nALPHANUMERIC
CHARACTER\nRECOGNITION", font=("Oswald", 16, "bold"), bg='#008080',
fg='#FFFFFF')
self.title_label.pack(pady=20)
self.canvas.bind("<B1-Motion>", self.paint)
if model_id == 1:
self.label = Label(input_window, text="Draw a digit and
click Predict", bg='#008080', font=self.font)
elif model_id == 2:
self.label = Label(input_window, text="Draw a character
and click Predict", bg='#008080', font=self.font)
self.label.pack()
def open_multi_digit_input_window(self):
input_window = tk.Toplevel(self.root)
input_window.title("Input Window - Multi Digit")
input_window.configure(bg='#008080') # Set background color
to purple
self.canvases = []
canvas_frame = tk.Frame(input_window, bg="#008080")
canvas_frame.pack(pady=2)
for i in range(3):
canvas = Canvas(canvas_frame, bg="white",
width=self.canvas_width, height=self.canvas_height)
canvas.grid(row=0, column=i, padx=0, pady=0,
sticky="nsew") # Remove padding and stick to edges
canvas.bind("<B1-Motion>", lambda event, index=i:
self.paint(event, index))
self.canvases.append(canvas)
def open_multi_character_input_window(self):
input_window = tk.Toplevel(self.root)
input_window.title("Input Window - Multi Character")
input_window.configure(bg='#008080') # Set background color
to purple
self.canvases = []
canvas_frame = tk.Frame(input_window, bg="#008080")
canvas_frame.pack(pady=2)
for i in range(5):
canvas = Canvas(canvas_frame, bg="white",
width=self.canvas_width, height=self.canvas_height)
canvas.grid(row=0, column=i, padx=0, pady=0,
sticky="nsew") # Remove padding and stick to edges
canvas.bind("<B1-Motion>", lambda event, index=i:
self.paint(event, index))
self.canvases.append(canvas)
elif model_id == 2:
# Convert drawing to image
image = self.image1.resize((28, 28), Image.LANCZOS)
image = ImageOps.invert(image)
img = np.array(image)
self.label.config(text=f"Prediction: {prediction[0]}")
def predict_multi_digit(self):
predictions = []
for i in range(3):
# Convert drawing to image
image = self.images[i].resize((28, 28), Image.LANCZOS)
image = ImageOps.invert(image)
img = np.array(image)
# Output predictions
self.output_label.config(text=f"Predictions: {predictions[0]}
{predictions[1]}{predictions[2]}")
def predict_multi_character(self):
predictions = []
for i in range(5):
# Convert drawing to image
image = self.images[i].resize((28, 28), Image.LANCZOS)
image = ImageOps.invert(image)
img = np.array(image)
# Output predictions
self.output_label.config(text=f"Predictions:
{''.join(predictions)}")
def reset_canvas(self):
if hasattr(self, 'canvas'):
self.canvas.delete("all")
self.image1 = Image.new("L", (self.canvas_width,
self.canvas_height), self.white)
self.draw = ImageDraw.Draw(self.image1)
self.label.config(text="Draw a digit/character and click
Predict")
def reset_canvases(self):
for i in range(5):
self.canvases[i].delete("all")
self.images[i] = Image.new("L", (self.canvas_width,
self.canvas_height), self.white)
self.draws[i] = ImageDraw.Draw(self.images[i])
self.output_label.config(text="Draw up to five characters and
click Predict")
def open_about_window(self):
about_window = Toplevel(self.root)
about_window.title("About")
about_window.configure(bg='#008080')
if __name__ == "__main__":
root = tk.Tk()
app = DrawingApp(root)
root.mainloop()