Χειρόγραφη Αναγνώριση Ψηφίων με χρήση του TensorFlow

Χειρόγραφη Αναγνώριση Ψηφίων με χρήση του TensorFlow

September 29, 2022 0 Von admin

Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.

Εισαγωγή

Σε αυτό το άρθρο, θα δούμε πώς να δημιουργήσετε μια εφαρμογή που μπορεί να αναγνωρίσει ψηφία που είναι γραμμένα με το χέρι. Η εφαρμογή θα αναγνωρίσει τη γραφή μας. Σήμερα, η τεχνολογία έχει αυξηθεί πάρα πολύ και ο υπολογιστής μπορεί να αναγνωρίσει τα πάντα. Εδώ υπάρχουν δύο κατηγορίες για την αναγνώριση της γραφής μας. Το ένα αναγνωρίζει αλφάβητα και το άλλο είναι ψηφία. Αυτό το άρθρο θα δείξει πώς να δημιουργήσετε μια εφαρμογή για την αναγνώριση του han

tensorflow

Πηγή: Dreamstime.com

Απαιτήσεις

Τώρα ας δούμε τις απαιτούμενες βιβλιοθήκες για τη δημιουργία της χειρόγραφης εφαρμογής αναγνώρισης ψηφίων. Εισαγάγετε τις ακόλουθες βιβλιοθήκες. Πριν από την εισαγωγή, αυτές οι βιβλιοθήκες θα πρέπει να εγκατασταθούν ξανά στην επιφάνεια εργασίας σας. Εάν κάποιο από αυτά δεν είναι εγκατεστημένο, εγκαταστήστε το χρησιμοποιώντας την εγκατάσταση pip.

Σαν,

pip install tensorflow

Πύθων: Χρησιμοποιούμε την python ως γλώσσα προγραμματισμού για την κατασκευή της εφαρμογής

Tensorflow: Το Tensorflow είναι μια βιβλιοθήκη ανοιχτού κώδικα και χρησιμοποιούμε το TensorFlow για την εκπαίδευση και την ανάπτυξη μοντέλων μηχανικής μάθησης.

Σκληρός: Είναι επίσης μια βιβλιοθήκη λογισμικού ανοιχτού κώδικα και ένα API υψηλού επιπέδου TensorFlow. Παρέχει επίσης μια διεπαφή python για τεχνητά νευρωνικά δίκτυα.

Tkinter: Το Tkinter είναι ένα φανταστικό πακέτο που παρέχει έναν τρόπο δημιουργίας γραφικών διεπαφών χρήστη (GUIs). Χρησιμοποιούμε το Tkinter για να παρέχουμε μια γραφική διεπαφή χρήστη για την εφαρμογή μας.

PIL: Το PIL σημαίνει Python Imaging Library, που επιτρέπει στον διερμηνέα python να επεξεργάζεται τις εικόνες.

NumPy: Όλοι γνωρίζουμε τη βιβλιοθήκη NumPy, μια βασική τυπική βιβλιοθήκη που χρησιμοποιείται για εργασία με πίνακες.

win32gui: Πρέπει επίσης να εγκαταστήσουμε το win32gui για να δουλέψουμε με γραφικά περιβάλλοντα χρήστη.

Σύνολο δεδομένων

Για τη δημιουργία αυτής της εφαρμογής, χρησιμοποιούμε το σύνολο δεδομένων MNIST. Αυτό το σύνολο δεδομένων περιέχει εικόνες ψηφίων από το 0 έως το 9. Όλες αυτές οι εικόνες είναι σε κλίμακα του γκρι. Υπάρχουν και εικόνες εκπαίδευσης και δοκιμαστικές εικόνες. Αυτό το σύνολο δεδομένων περιέχει περίπου 60000 εικόνες εκπαίδευσης που είναι πολύ μεγάλες και περίπου 10000 δοκιμαστικές εικόνες. Όλες αυτές οι εικόνες είναι σαν μικρά τετράγωνα μεγέθους 28 x 28 pixel. Αυτές είναι χειρόγραφες εικόνες μεμονωμένων ψηφίων. Αυτές οι εικόνες μοιάζουν με τις παρακάτω.

Πηγή: Machine Learning Mastery

Ας δούμε την υλοποίηση της εφαρμογής.

Εισαγωγή Βιβλιοθηκών

Εισαγάγετε όλες τις απαιτούμενες βιβλιοθήκες πριν γράψετε οποιοδήποτε κώδικα. Στην αρχή είχα ήδη αναφέρει όλες τις απαιτήσεις για την κατασκευή της εφαρμογής. Εισαγάγετε λοιπόν αυτές τις βιβλιοθήκες. Από τη βιβλιοθήκη PIL εισάγετε ImageGrab και Image.

import numpy as np
from tensorflow.keras.models import load_model
from tkinter import *
import tkinter as tk
import win32gui
from PIL import ImageGrab, Image

Κτίριο μοντέλου χρησιμοποιώντας Tensorflow

Για να δημιουργήσουμε το μοντέλο πρώτα πρέπει να εισαγάγουμε μερικές βιβλιοθήκες από το TensorFlow Keras. Πρέπει να εισάγουμε keras από το TensorFlow και στη συνέχεια να εισάγουμε το σύνολο δεδομένων που πρόκειται να χρησιμοποιήσουμε για να δημιουργήσουμε την εφαρμογή μας τώρα. Αυτό είναι το σύνολο δεδομένων MNIST. Στη συνέχεια, εισαγάγετε το διαδοχικό μοντέλο και ορισμένα επίπεδα όπως Dense, Dropout, Flatten Conv2D, MaxPooling2D και, τέλος, εισαγάγετε το backend.

Αφού εισαγάγετε όλες τις απαιτούμενες βιβλιοθήκες, διαχωρίστε το σύνολο δεδομένων σε σύνολα δεδομένων εκπαίδευσης και δοκιμής. Αναδιαμορφώστε το σετ προπόνησης του x και το σύνολο δοκιμών του x. Το επόμενο βήμα είναι η μετατροπή των διανυσμάτων κλάσεων σε πίνακες δυαδικών κλάσεων.

from tensorflow import keras 
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import backend as K

(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape)
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
input_shape = (28, 28, 1)
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

Εκπαίδευση του μοντέλου στο Tensorflow

Το επόμενο βήμα μας είναι να εκπαιδεύσουμε το μοντέλο. Για αυτό ορίστε το μέγεθος παρτίδας, τον αριθμό των κλάσεων και τον αριθμό των εποχών που θέλετε να εκπαιδεύσετε το μοντέλο σας. Στη συνέχεια προσθέστε μερικά επίπεδα στο διαδοχικό μοντέλο που εισαγάγαμε πριν. Στη συνέχεια, μεταγλωττίστε το μοντέλο χρησιμοποιώντας κατηγορική συνάρτηση απώλειας διασταυρούμενης εντροπίας, βελτιστοποιητή Adadelta και μετρήσεις ακρίβειας. Τέλος, χρησιμοποιώντας x_train, y_train, μέγεθος παρτίδας, εποχές και όλα εκπαιδεύουν το μοντέλο. Στη συνέχεια, αποθηκεύστε το για αργότερα.

batch_size = 128
num_classes = 10
epochs = 30
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5),activation='relu',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])
hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
print("The model has successfully trained")
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.save('mnist.h5')
print("Saving the model as mnist.h5")

Ψηφίο πρόβλεψης

Τώρα πρέπει να γράψουμε κάποιο κωδικό για την πρόβλεψη του ψηφίου που έχουμε γράψει. Για αυτό ορίστε μια συνάρτηση predict_class όπου παρέχετε μια εικόνα ως όρισμα. Αρχικά, αλλάξτε το μέγεθός του στα απαιτούμενα pixel. Μετατρέψτε την εικόνα σε κλίμακα του γκρι που ήταν προηγουμένως σε RGB. Στη συνέχεια, επαναδιαμορφώστε το και κανονικοποιήστε το. Τέλος, προβλέψτε την εικόνα χρησιμοποιώντας τη μέθοδο πρόβλεψης.

model = load_model('mnist.h5')
def predict_digit(img):
    #resize image to 28x28 pixels
    img = img.resize((28,28))
    #convert rgb to grayscale
    img = img.convert('L')
    img = np.array(img)
    img = img.reshape(1,28,28,1)
    img = img/255.0
    img = 1 - img
    #predicting
    res = model.predict([img])[0]
    return np.argmax(res), max(res)

Εφαρμογή Κτιρίου

Ας δούμε πώς να δημιουργήσουμε μια φιλική προς το χρήστη εφαρμογή GUI για αυτό. Χρησιμοποιούμε το Tkinter για αυτό. Εδώ δημιουργούμε χώρο για να σχεδιάσει ο χρήστης πραγματικά το ψηφίο και στη συνέχεια παρέχουμε δύο κουμπιά Αναγνώριση και διαγραφή. Το κουμπί αναγνώρισης είναι για την αναγνώριση του ψηφίου που είναι γραμμένο στο δεδομένο κενό και το κουμπί διαγραφής είναι για να διαγράψετε τα γραμμένα σε αυτό. Τέλος, εκτελέστε τον κύριο βρόχο για να εκτελέσετε την εφαρμογή.

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.x = self.y = 0
        # Creating elements
        self.canvas = tk.Canvas(self, width=400, height=400, bg = "white", cursor="cross")
        self.label = tk.Label(self, text="Thinking..", font=("Helvetica", 48))
        self.btn_classify = tk.Button(self, text = "Recognise", command =self.classify_handwriting) 
        self.clear_button= tk.Button(self, text = "Clear",command = self.clear_all)
        self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
        self.label.grid(row=0, column=1,pady=2, padx=2)
        self.btn_classify.grid(row=1, column=1, pady=2, padx=2)
        self.clear_button.grid(row=1, column=0, pady=2)
        self.canvas.bind("", self.draw_lines)
    def clear_all(self):
        self.canvas.delete("all")
    def classify_handwriting(self):
        HWND = self.canvas.winfo_id()
        rect = win32gui.GetWindowRect(HWND)
        im = ImageGrab.grab(rect)
        digit, acc = predict_digit(im)
        self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')
    def draw_lines(self, event):
        self.x = event.x
        self.y = event.y
        r=8
        self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill="black")
app = App()
mainloop()

Αποτελέσματα

Όταν εκτελείτε την εφαρμογή θα εμφανιστεί ένα παράθυρο όπου μπορείτε να γράψετε το ψηφίο. Και στη συνέχεια, όταν κάνετε κλικ στο κουμπί αναγνώρισης, θα αναγνωρίσει το ψηφίο που έχετε γράψει με το ποσοστό πιθανότητας που δείχνει πώς ακριβώς ταιριάζει το ψηφίο με το αρχικό. Εδώ έχω γράψει το ψηφίο 1 και το αναγνώρισε ως 1 με ακρίβεια 17%.

Συμπέρασμα για το Tensorflow

Οι υπολογιστές είναι πιο έξυπνοι και γρήγοροι στις μέρες μας. Αυτά είναι καλά ανεπτυγμένα με τέτοιο τρόπο ώστε να είναι σε θέση να κάνουν τα περισσότερα από τα καθήκοντα νοημοσύνης που εκτελούνται από τα ανθρώπινα όντα. Η αναγνώριση χειρογράφου είναι ένα από αυτά. Σε αυτό, μάθαμε πώς να δημιουργήσουμε μια εφαρμογή για την αναγνώριση των ψηφίων. Χρησιμοποιήσαμε επίσης το Tkinter για την παροχή της γραφικής διεπαφής χρήστη και δημιουργήσαμε την εφαρμογή. Μπορείτε επίσης να αλλάξετε som μπορεί να δημιουργήσει ένα καλύτερο από αυτό. Μπορείτε να παίξετε μαζί του για να πάρετε περισσότερες γνώσεις.

  • Έτσι, είδαμε πώς να δημιουργήσουμε μια εφαρμογή για την αναγνώριση χειρόγραφων ψηφίων.
  • Πώς να χρησιμοποιήσετε το σύνολο δεδομένων MNIST
  • Κατασκευή, εκπαίδευση και δοκιμή του μοντέλου
  • Κατασκευάστηκε GUI χρησιμοποιώντας Tkinter

Ελπίζω να το βρήκατε χρήσιμο.

Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα.