web-dev-qa-db-fra.com

Tesseract OCR ne parvient pas à détecter la taille de police variable et les lettres qui ne sont pas alignées horizontalement

J'essaie de détecter ces textes d'étiquettes de prix qui sont toujours clairement prétraités. Bien qu'il puisse facilement lire le texte écrit au-dessus, il ne parvient pas à détecter les valeurs de prix. J'utilise python bindings pytesseract bien qu'il échoue également à lire à partir des commandes CLI. La plupart du temps, il essaie de reconnaître la partie où le prix est un ou deux personnages.

Exemple 1:

tesseract D:\tesseract\tesseract_test_images\test.png output

Et la sortie de l'exemple d'image est la suivante.

je Beutel

13

Cependant, si je recadre et étire le prix pour donner l'impression qu'ils sont séparés et qu'ils ont la même taille de police, la sortie est très bien.

Image traitée (prix recadré et réduit):

je Beutel

1,89

Comment faire pour que l'OCS tesseract fonctionne comme je le souhaitais, car je vais parcourir de nombreuses images similaires? Modifier: Ajout de plus d'étiquettes de prix:
sample2sample3sample4sample5sample6sample7

15
NONONONONO

Le problème est que le moteur Tesseract n'a pas été formé pour lire ce type de topologie de texte.

Vous pouvez:

  • formez votre propre modèle, et vous aurez notamment besoin de fournir des images avec des variations de topologie (position des caractères). Vous pouvez réellement utiliser la même image et mélanger les positions des personnages.
  • réorganiser l'image en grappes de texte et utiliser tesseract, en particulier, je considérerais la partie cents et la déplacerais à droite du coma, dans ce cas, vous pouvez utiliser tesseract hors de la boîte. Peu de critères pertinents seraient la hauteur des grappes (pour différencier les cents et les entiers), et la position du clusters (lus de gauche à droite).

En général, les algorithmes de vision par ordinateur (y compris les CNN) vous donnent un outil pour avoir une représentation plus élevée d'une image (caractéristiques ou descripteurs), mais ils ne parviennent pas à créer une logique ou un algorithme pour traiter les résultats intermédiaires d'une certaine manière.

Dans votre cas, ce serait:

  • "si la hauteur de ces lettres est plus petite, c'est des cents",
  • "Si la hauteur et la position verticale sont les mêmes, c'est à peu près le même nombre, soit à gauche du coma, soit à droite du coma".

Le fait est qu'il est difficile d'y parvenir grâce à la formation, et en même temps, il est extrêmement simple d'écrire ceci pour un humain en tant qu'algorithme. Désolé de ne pas vous avoir donné d'implémentation réelle, mais mon texte est le pseudo-code.

TrainingTesseract2

TrainingTesseract4

Apprentissage conjoint non supervisé des représentations profondes et des clusters d'images

6
Soleil

Le problème est que l'image que vous utilisez est de petite taille. Maintenant, lorsque tesseract traite l'image, il considère ' 8 ', ' 9 'et' , 'en une seule lettre et le prédit ainsi à' 3 'ou peut considérer' 8 'et' , 'comme une lettre et ' 9 ' comme une lettre différente et produit donc une sortie erronée. L'image ci-dessous l'explique.

detected contours of original(small) image

Une solution simple pourrait être d'augmenter sa taille par un facteur de 2 ou 3 ou même plus selon la taille de votre image d'origine, puis de passer à tesseract pour qu'il détecte chaque lettre individuellement comme indiqué ci-dessous. (Ici, j'ai augmenté sa taille par un facteur de 2)

detected contours of resized(larger) image

Ci-dessous est un simple script python qui résoudra votre objectif

import pytesseract
import cv2

img = cv2.imread('dKC6k.png')
img = cv2.resize(img, None, fx=2, fy=2)

data = pytesseract.image_to_string(img)
print(data)

Texte détecté:

je Beutel

89
1.

Maintenant, vous pouvez simplement extraire les données requises du texte et les formater selon vos besoins.

data = data.replace('\n\n', '\n')
data = data.split('\n')

dollars = data[2].strip(',').strip('.')
cents = data[1]

print('{}.{}'.format(dollars, cents))

Format souhaité:

1.89
7
Shivam K. Thakkar