[PYTHON] J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 3/3 Coopération avec l'interface graphique en utilisant Tkinter

Aperçu

Deux fois avant (1/3): https://qiita.com/tfull_tf/items/6015bee4af7d48176736 Dernière fois (2/3): https://qiita.com/tfull_tf/items/968bdb8f24f80d57617e

Code entier: https://github.com/tfull/character_recognition

Maintenant que le modèle de reconnaissance kana a atteint un niveau où il est possible de vérifier le fonctionnement du système, nous allons générer une image avec l'interface graphique, la charger dans le modèle et générer des caractères.

Créer une palette d'entrée kana avec Tkinter

J'utiliserai Tkinter, alors installez-le.

# Mac +Pour Homebrew
$ brew install tcl-tk
#Pour Ubuntu Linux
$ sudo apt install python-tk

Créez un canevas et faites un clic gauche pour dessiner une ligne blanche et cliquez avec le bouton droit pour dessiner une ligne noire (en fait une gomme car c'est un fond noir). Préparez deux boutons, l'un qui reconnaît les caractères écrits et l'autre qui efface les caractères écrits (remplit en noir).

import tkinter
# from PIL import Image, ImageDraw

class Board:
    def __init__(self):
        self.image_size = 256

        self.window = tkinter.Tk()
        self.window.title("Entrée Kana")

        self.frame = tkinter.Frame(self.window, width = self.image_size + 2, height = self.image_size + 40)
        self.frame.pack()

        self.canvas = tkinter.Canvas(self.frame, bg = "black", width = self.image_size, height = self.image_size)
        self.canvas.place(x = 0, y = 0)

        self.canvas.bind("<ButtonPress-1>", self.click_left)
        self.canvas.bind("<B1-Motion>", self.drag_left)
        self.canvas.bind("<ButtonPress-3>", self.click_right)
        self.canvas.bind("<B3-Motion>", self.drag_right)

        self.button_detect = tkinter.Button(self.frame, bg = "blue", fg = "white", text = "reconnaissance", width = 100, height = 40, command = self.press_detect)
        self.button_detect.place(x = 0, y = self.image_size)

        self.button_delete = tkinter.Button(self.frame, bg = "green", fg = "white", text = "Supprimer", width = 100, height = 40, command = self.press_delete)
        self.button_delete.place(x = self.image_size // 2, y = self.image_size)

        # self.image = Image.new("L", (self.image_size, self.image_size))
        # self.draw = ImageDraw.Draw(self.image)

    def press_detect(self):
        output = recognize(np.array(self.image).reshape(1, 1, self.image_size, self.image_size)) #reconnaître est une fonction qui reconnaît l'utilisation de l'apprentissage automatique
        sys.stdout.write(output)
        sys.stdout.flush()

    def press_delete(self):
        # self.canvas.delete("all")
        # self.draw.rectangle((0, 0, self.image_size, self.image_size), fill = 0)

    def click_left(self, event):
        ex = event.x
        ey = event.y

        self.canvas.create_oval(
            ex, ey, ex, ey,
            outline = "white",
            width = 8
        )

        # self.draw.ellipse((ex - 4, ey - 4, ex + 4, ey + 4), fill = 255)

        self.x = ex
        self.y = ey

    def drag_left(self, event):
        ex = event.x
        ey = event.y

        self.canvas.create_line(
            self.x, self.y, ex, ey,
            fill = "white",
            width = 8
        )

        # self.draw.line((self.x, self.y, ex, ey), fill = 255, width = 8)

        self.x = ex
        self.y = ey

    def click_right(self, event):
        ex = event.x
        ey = event.y

        self.canvas.create_oval(
            ex, ey, ex, ey,
            outline = "black",
            width = 8
        )

        # self.draw.ellipse((ex - 4, ey - 4, ex + 4, ey + 4), fill = 0)

        self.x = event.x
        self.y = event.y

    def drag_right(self, event):
        ex = event.x
        ey = event.y

        self.canvas.create_line(
            self.x, self.y, ex, ey,
            fill = "black",
            width = 8
        )

        # self.draw.line((self.x, self.y, ex, ey), fill = 0, width = 8)

        self.x = event.x
        self.y = event.y

Avec cela, vous pouvez écrire et effacer des caractères.

Suivez en interne à l'aide de l'oreiller

Après quelques recherches, Tkinter's Canvas peut tracer des lignes, donc il peut être écrit, mais il semble qu'il n'est pas possible de lire ce que vous avez écrit et de le quantifier.

Alors que je cherchais une solution, j'ai trouvé un argument selon lequel je devrais avoir Pillow en interne et dessiner la même chose sur Pillow's Image lorsque je dessinais sur Canvas. (Je ne pouvais pas penser à cela, alors j'ai pensé que c'était une idée très intelligente.) La partie commentée dans le code ci-dessus correspond à cela. L'image de Pillow peut être rapidement transformée en un tableau numpy avec numpy.array, ce qui facilite l'intégration d'un modèle d'apprentissage automatique.

Achèvement du système de reconnaissance kana

Une interface graphique pour la saisie de caractères manuscrits et un modèle d'apprentissage automatique pour classer les images kana ont été achevés. Ce qui suit est une combinaison de ceux-ci.

cr202011.gif

YouTube: https://www.youtube.com/watch?v=a0MBfVVp7mA

Impressions et prise en compte du contrôle de fonctionnement

Ce n'est pas très précis, mais il l'a reconnu assez correctement. Il ne reconnaît pas les caractères sales, mais lorsque j'ai tapé «aiueo» avec soin, il affiche correctement les caractères correspondants.

J'ai essayé le "Hello", si le "blood" est reconnu dans le "La" et la "filtration" était fréquente. J'étais curieux, alors quand j'ai vérifié les données d'image de "Chi", j'ai trouvé qu'il y avait une légère différence entre la forme de "Chi" que j'ai écrite et celle de l'image. Depuis que je n'ai appris que 3 types de polices, il semble que je ne puisse pas gérer l'entrée avec des formes étranges. Lorsque j'ai écrit les caractères sous une forme proche des données d'entrée, ils l'ont correctement reconnu.

Le temps de reconnaissance produit le résultat en un instant sans utiliser le GPU pour le modèle d'apprentissage automatique.

Ce serait idéal si nous pouvions reconnaître les kanji, mais les destinations de classement sont de 169 à des milliers. Kana seul n'est pas assez précis, donc je pense que les performances sont susceptibles de chuter immédiatement.

Cela prendra du temps, mais je pense que ce sera plus pratique comme interface si vous sortez les n premiers éléments avec une forte probabilité de classification.

Après cela, si vous apprenez la certitude en tant que mot et que vous la reconnaissez à la forme du caractère + la probabilité en tant que mot, la précision lors de la saisie d'un mot ou d'une phrase significative peut augmenter. (Par exemple, lorsque vous entrez "bonjour", ajoutez que "ha" est sur le point de venir.)

Recommended Posts

J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 3/3 Coopération avec l'interface graphique en utilisant Tkinter
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 1/3 D'abord à partir de MNIST
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 2/3 Création et apprentissage de données
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai créé un capteur d'ouverture / fermeture (lien Twitter) avec TWE-Lite-2525A
Télécharger des images sur S3 avec une interface graphique à l'aide de tkinter
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai créé un éditeur de texte simple en utilisant PyQt
[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
J'ai essayé la reconnaissance faciale avec OpenCV
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 4: Automatisez la configuration du FAI avec PyEZ et JSNAPy
J'ai essayé d'afficher l'interface graphique sur Mac avec le système X Window
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser Azure Speech to Text.
Création d'interface graphique en python à l'aide de tkinter partie 1
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de commencer avec Hy
Rendez les applications GUI super faciles avec tkinter
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 2: J'ai essayé d'utiliser PyEZ
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()
J'ai essayé d'implémenter DeepPose avec PyTorch PartⅡ
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé la reconnaissance d'image simple avec Jupyter
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
J'ai essayé la reconnaissance d'image de "Moon and Suppon" avec Pytorch (en utilisant torchvision.datasets.ImageFolder qui correspond à from_from_directry de keras)
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate