[PYTHON] Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 3 [Reconnaissance de caractères à l'aide d'un modèle]

Bonjour Licht. Suivant ici, Tutoriel Deep Learning Chapitre 3 Décrit la reconnaissance de caractères à l'aide d'un modèle.

Préparation

Nous utiliserons le modèle 16 généré par le machine learning de Deep Learning dans le chapitre 2. Tout d'abord, préparons une image de Hira Kana. En fait, celle avec la police qui n'est pas dans les données utilisées pour l'apprentissage est bonne, mais il est difficile de la trouver, alors préparez-la pour le texte.

Si vous avez du mal à le trouver, veuillez télécharger et utiliser l'image ci-dessous. (J'ai écrit «A» dans OneNote et l'ai découpé en tant qu'image) a.png

reconnaissance

Placez l'image précédente "A" (a.png) dans le même répertoire que model16, lets_recognize.png

Entrez la commande suivante depuis le terminal

python hiraganaNN_predictor.py --img a.png --model model16

Puis dans la sortie

Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:10, Unicode:304b,Hiragana:Ou
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:78, Unicode:308f,Hiragana:sensationnel
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
**Numéro de neurone du jugement final:1, Unicode:3042,Hiragana:Ah**

Le résultat de la prédiction est sorti. Bien qu'il y ait «ka» et «wa» parmi les candidats, le résultat du jugement final est «a», donc la reconnaissance est réussie. Ce candidat est le résultat de la reconnaissance de chaque image lorsqu'une image est agrandie à plusieurs (14 images). Le jugement final est la moyenne de chaque résultat de reconnaissance.

arg_aaaa.png

TTA (Test Time Argumentation) que cela n'est pas jugé à partir d'une seule image, mais qu'il est jugé sous différents angles pour améliorer la précision de la reconnaissance. C'est le même concept que la méthode. Essayez également d'autres perceptions.

a2.png a2.png reconnaissance

python hiraganaNN_predictor.py --img a2.png --model model16

résultat

**Numéro de neurone du jugement final:1, Unicode:3042,Hiragana:Ah**

a3.png a3.png reconnaissance

python hiraganaNN_predictor.py --img a2.png --model model16

résultat

**Numéro de neurone du jugement final:1, Unicode:3042,Hiragana:Ah**

C'est bon.

Reconnaissance manuscrite des caractères hiragana

Essayons une reconnaissance un peu plus difficile car c'est la bonne réponse. Reconnaissons le "A" manuscrit. a_tegaki.png

Pour être honnête, c'est déraisonnable, mais faisons-le.

python hiraganaNN_predictor.py --img a_tegaki.png --model model16

Commencer la reconnaissance avec

Numéro de neurone candidat:71, Unicode:3088,Hiragana:Yo
Numéro de neurone candidat:30, Unicode:305f,Hiragana:Ta
Numéro de neurone candidat:71, Unicode:3088,Hiragana:Yo
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:24, Unicode:3059,Hiragana:Su
Numéro de neurone candidat:71, Unicode:3088,Hiragana:Yo
Numéro de neurone candidat:30, Unicode:305f,Hiragana:Ta
Numéro de neurone candidat:24, Unicode:3059,Hiragana:Su
Numéro de neurone candidat:32, Unicode:3061,Hiragana:Chi
Numéro de neurone candidat:32, Unicode:3061,Hiragana:Chi
Numéro de neurone candidat:24, Unicode:3059,Hiragana:Su
Numéro de neurone candidat:30, Unicode:305f,Hiragana:Ta
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
**Numéro de neurone du jugement final:32, Unicode:3061,Hiragana:Chi**

C'est un échec! Lol Il y a un petit "A" comme candidat, mais ce n'était pas bon car c'était la décision finale "Chi". Eh bien, le modèle 16 a une perte de 0,526, et je l'ai appris en version imprimée, donc c'est comme ça. Cependant, si vous essayez avec un modèle avec perte réduite à 0,237 en appliquant certaines mesures d'amélioration dans les chapitres suivants

python hiraganaNN_predictor.py --img a2.png --model loss237model
Numéro de neurone candidat:30, Unicode:305f,Hiragana:Ta
Numéro de neurone candidat:52, Unicode:3075,Hiragana:Fu
Numéro de neurone candidat:52, Unicode:3075,Hiragana:Fu
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:32, Unicode:3061,Hiragana:Chi
Numéro de neurone candidat:71, Unicode:3088,Hiragana:Yo
Numéro de neurone candidat:52, Unicode:3075,Hiragana:Fu
Numéro de neurone candidat:9, Unicode:304a,Hiragana:Oh
Numéro de neurone candidat:52, Unicode:3075,Hiragana:Fu
Numéro de neurone candidat:9, Unicode:304a,Hiragana:Oh
Numéro de neurone candidat:1, Unicode:3042,Hiragana:Ah
Numéro de neurone candidat:9, Unicode:304a,Hiragana:Oh
Numéro de neurone candidat:10, Unicode:304b,Hiragana:Ou
**Numéro de neurone du jugement final:1, Unicode:3042,Hiragana:Ah**

Je peux le reconnaître correctement (même si c'est à peine)! Fondamentalement, nous avons utilisé des données d'impression comme données d'apprentissage pour l'apprentissage automatique, mais c'est un modèle qui peut reconnaître un peu l'écriture manuscrite. Puisque les candidats le reconnaissent par erreur, nous pouvons voir l'utilité de TTA.

Au fait Il y a 3 «A» et 4 «Fu» comme candidats, alors pourquoi la décision finale est-elle «A»? Si vous pensez, c'est génial! Cependant, nous ne prenons pas ici une décision à la majorité simple. Nous examinons les résultats de la prise de décisions plus confiantes. En d'autres termes, alors que les quatre «fu» ont été prédits par Ayafuya, trois «A» étaient confiants, le jugement final était donc «A».

Aperçu du code source

Enfin, un aperçu du code source. Principalement identique à hiraganaNN.py utilisé pour l'apprentissage automatique.

def forward(x_data, train=False):
    x = chainer.Variable(x_data, volatile=not train)
    h = F.max_pooling_2d(F.relu(model.bn1(model.conv1(x))), 2)
    h = F.max_pooling_2d(F.relu(model.bn2(model.conv2(h))), 2)
    h = F.max_pooling_2d(F.relu(model.conv3(h)), 2)
    h = F.dropout(F.relu(model.fl4(h)), train=train)
    y = model.fl5(h)
    return y.data

Il s'agit de la structure du réseau neuronal de Deep Learning et devrait avoir la même structure que l'avant de hiraganaNN.py.

src = cv2.imread(args.img, 0)
src = cv2.copyMakeBorder(
    src, 20, 20, 20, 20, cv2.BORDER_CONSTANT, value=255)
src = cv2.resize(src, (IMGSIZE, IMGSIZE))

Lisez l'image d'entrée et redimensionnez à la taille d'image de 64 * 64. En outre, l'image a une marge de 20 pixels chacun. Avec le modèle actuel, il ne peut être bien reconnu que si la marge est un montant approprié.

for x in xrange(0, 14):
    dst = dargs.argumentation([2, 3])
    ret, dst = cv2.threshold(dst,
                             23,
                             255,
                             cv2.THRESH_BINARY)
    #Pour la confirmation de l'image
    #cv2.imshow('ARGUMENTATED', dst)
    #cv2.waitKey(0)
    #cv2.destroyAllWindows()

    xtest = np.array(dst).astype(np.float32).reshape(
        (1, 1, IMGSIZE, IMGSIZE)) / 255
    if result is None:
        result = forward(xtest)
    else:
        result = result + forward(xtest)

Après avoir agrandi les données de l'image d'entrée et les avoir binarisées, la valeur de pixel est normalisée à 0-1 et prédite par la fonction avant.

tmp = np.argmax(forward(xtest))
for strunicode, number in unicode2number.iteritems():
    if number == tmp:
        hiragana = unichr(int(strunicode, 16))
        print 'Numéro de neurone candidat:{0}, Unicode:{1},Hiragana:{2}'.format(number, strunicode, hiragana.encode('utf_8'))

Le résultat de la reconnaissance du réseau neuronal (nombre 0-82) est converti en unicode et sorti en hiragana. Le chapitre 3 se termine ici. Dans le chapitre 4, nous allons agrandir une image à 3500 pour voir la précision.

chapitre Titre
Chapitre 1 Construire un environnement Deep Learning basé sur le chainer
Chapitre 2 Création d'un modèle de prédiction Deep Learning par Machine Learning
chapitre 3 Reconnaissance de caractères à l'aide d'un modèle
Chapitre 4 Amélioration de la précision de la reconnaissance en élargissant les données
Chapitre 5 Introduction à Neural Net et explication du code source
Chapitre 6 Amélioration de l'efficacité d'apprentissage en sélectionnant Optimizer
Chapitre 7 TTA,Amélioration de l'efficacité d'apprentissage par la normalisation des lots

Recommended Posts

Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 3 [Reconnaissance de caractères à l'aide d'un modèle]
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 2 [Génération de modèles par apprentissage automatique]
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance des caractères japonais Chapitre 1 [Construction de l'environnement]
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance de caractères japonais Chapitre 4 [Amélioration de la précision de la reconnaissance en développant les données]
[Apprentissage de renforcement d'introduction] Renforcement de l'apprentissage pour bouger pour le moment
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 10 Introduction à Cupy
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer Chapitre 9 Introduction à scikit-learn
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Une note utile lors de l'utilisation de Python après une longue période
Comment utiliser MkDocs pour la première fois
Implémentation du modèle Deep Learning pour la reconnaissance d'images
J'ai installé le framework Deep Learning Chainer
Essayez de publier sur Qiita pour la première fois
Création d'un modèle d'estimation de position pour la compétition d'intelligence humaine de loup à l'aide de l'apprentissage automatique
GTUG Girls + PyLadiesTokyo Meetup Je suis allé au premier machine learning
Enregistrer une tâche dans cron pour la première fois
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
J'ai essayé d'héberger un modèle d'apprentissage en profondeur de TensorFlow à l'aide de TensorFlow Serving
Introduction à la modélisation bayésienne à l'aide de la traduction japonaise pymc3 de modélisation bayésienne en Python (chapitre 0-2)
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM
J'ai essayé d'écrire dans un modèle de langage profondément appris
Je veux créer un Dockerfile pour le moment.
Si vous apprenez Linux pour la première fois, faites-le!
Premier Kaggle (kaggle ①)
Kaguru pour la première fois
Introduction au Deep Learning ~ Règles d'apprentissage ~
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage
Introduction au Deep Learning ~ Rétropropagation ~
Chapitre 1 Introduction à Python Découpez uniquement les bons points de Deeplearning à partir de zéro
Différences que les ingénieurs C # ont ressenties lors de l'apprentissage de Python pour la première fois
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Avant l'introduction à l'apprentissage automatique. ~ Technologie requise pour l'apprentissage automatique autre que l'apprentissage automatique ~
Essayez de modifier une nouvelle image à l'aide du modèle StyleGAN2 entraîné
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Raspberry Pi --1 --Première fois (Connectez un capteur de température pour afficher la température)
Introduction au Deep Learning (2) - Essayez votre propre régression non linéaire avec Chainer-
Résumé des pages utiles pour étudier le framework d'apprentissage profond Chainer
Divulguer le savoir-faire qui a créé un service de recherche d'images similaire pour les actrices audiovisuelles grâce à l'apprentissage profond par chainer
Introduction à l'apprentissage en profondeur ~ Approximation des fonctions ~
Introduction à l'apprentissage profond ~ Préparation au codage ~
[Salut Py (Partie 1)] Je veux faire quelque chose pour le moment, alors commencez par fixer un objectif.
Voir python pour la première fois
Démarrez Django pour la première fois
Créer un modèle d'apprentissage à l'aide de MNIST
Introduction au Deep Learning ~ Dropout Edition ~
Introduction au Deep Learning ~ Propagation vers l'avant ~
Introduction à l'apprentissage profond ~ Expérience CNN ~
Comment étudier pour le test G de Deep Learning Association (pour les débutants) [version 2020]
[Introduction à l'apprentissage automatique] Jusqu'à ce que vous exécutiez l'exemple de code avec chainer
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
Jusqu'à ce que l'environnement Deep Learning (TensorFlow) utilisant le GPU soit préparé pour Ubuntu 14.04
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
J'ai essayé tensorflow pour la première fois