Reconnaissance de caractères manuscrits apprise dans OpenCV Tutorial.
Un nouveau venu qui a été assigné cette année a dit: «J'avais l'habitude de reconnaître les personnages quand j'étais à l'université», alors j'essaie de me faire une idée.
Utilisez digits.png inclus dans la distribution OpenCV comme données de dictionnaire. Malheureusement, l'environnement
conda install --channel https://conda.anaconda.org/menpo opencv3``` dans l'environnement Anaconda n'incluait pas digits.png.
Il s'agit des données d'image des nombres manuscrits de 0 à 9. En fait, si vous essayez de créer une OCR en japonais, vous devez créer une énorme quantité de données de dictionnaire si vous l'implémentez telle quelle. Si vous essayez de distinguer les variations de kanji telles que Watanabe-san et Saito-san, ce sera difficile. Sera-t-il géré?
Wikipedia a une entrée comme méthode de voisinage k. En particulier, Figure a KNN. C'est très simple et facile à comprendre.
C'est-à-dire que lorsque l'on souhaite déterminer si un échantillon inconnu appartient au groupe A ou au groupe B dans un espace d'une certaine coordonnée, on dit qu '"il appartient au groupe avec de nombreuses données classifiées connues à proximité". C'est pour juger.
Maintenant que vous comprenez le concept, il est facile à utiliser avec python (+ OpenCV).
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
Qu'est-ce que cela fait? En parlant de cela, l'image appelée digits.png est de taille 1000x2000, et chaque nombre est écrit 500 fois en taille 20x20, donc la verticale est divisée par 100 et l'horizontale est divisée par 50 sous forme de tableau en cellules. Indique qu'il est stocké. Cependant, en réalité, je ne peux pas le comprendre, ou je ne peux jamais l'écrire moi-même. Il peut suffire de savoir qu'il existe des moyens de fractionner le tableau, tels que np.hsplit () et np.vsplit ().
Après l'avoir stocké dans un tableau de numpy appelé x, divisez 250 de chaque nombre en un ensemble d'apprentissage et les 250 restants en un ensemble de test.
x = np.array(cells)
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)
Définissez également une étiquette pour chaque donnée.
np.arange(10)Puis 10 de 0 à 9 tableau de ce tableau d'entiers contigus([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])Est créé, répétez-le 250 fois pour l'étiqueter.
```python
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
Enfin exécutez KNN. Lançons-le avec k = 5.
knn = cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist = knn.find_nearest(test,k=5)
En fait, ce qui précède entraînera une erreur. Tutoriel semble être faux. Réécrivez les trois lignes ci-dessus comme suit.
knn = cv2.ml.KNearest_create()
knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)
ret, results, neighbours, dist = knn.findNearest(test, 5)
Jetons un coup d'œil aux résultats du discriminateur.
matches = results==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/results.size
print(accuracy)
Le résultat de cette exécution est `` 91,76 ''. J'ai l'impression que cette précision est un peu faible en ne distinguant que 10 caractères.
C'est tout pour aujourd'hui.
Recommended Posts