web-dev-qa-db-fra.com

Conseils de numérisation de reçus Tesseract nécessaires

J'ai eu du mal avec Tesseract pour divers projets d'OCR et j'ai trouvé aujourd'hui un cas d'utilisation que je pensais être un slam dunk pour cela, mais après plusieurs heures, je reviens toujours insatisfait. Je voulais poser le problème ici et voir si quelqu'un d'autre a des conseils sur la façon de résoudre cette tâche.

Ma femme est venue me voir ce matin et m'a demandé s'il était possible de numériser facilement ses reçus de Wal-Mart et, au fil du temps, de dresser un historique des prix dépensés dans les catégories et pour des articles spécifiques afin que nous puissions faire des recherches approfondies et facilement approfondies. où vont les dépenses. Au début, je sentais que c'était une tâche très difficile, mais après avoir creusé, j'ai trouvé quelques choses qui me font sentir que c'est à portée de main:

  1. Les reçus Wal-Mart sont en général très bien structurés et faciles à lire. Ils incluent même la UPC pour chaque article (possibilité de recherches contre une base de données UPC?)) Et semblent classer les aliments avec un F ou un I (pas sûr quelle est la différence) et avoir une colonne de code fiscal qui pourrait s'avérer utile si j'apprends les secrets de la signification des codes.

  2. J'ai découvert en outre qu'il existe une sorte d'API de recherche d'éléments Wal-Mart à laquelle j'aurais peut-être accès et qui s'avérerait utile dans la recherche UPC.

  3. Ils ont une application pour téléphones intelligents qui vous permet de numériser un code QR imprimé sur chaque reçu. Cette application recherche un code "TC" sur le reçu et extrait le reçu détaillé complet de leurs serveurs. Il vous montre une excellente représentation graphique du reçu, y compris des images miniatures de tous les articles et le coût, etc. Si cette application catégorisait et résumait simplement le reçu, j'aurais fini! Mais hélas, ce n'est pas le but de l'application ...

  4. La dernière pièce du puzzle est que vous pouvez exporter une image PNG générée par ordinateur du reçu au cas où vous voudriez l'enregistrer et jeter la version papier. Pour moi, c'est l'argent, car ces fichiers PNG sont créés par ordinateur et ne sont donc pas soumis aux problèmes de prise de photo ou de numérisation d'un reçu papier

Un exemple de l'un d'entre eux (légèrement modifié pour blanchir certaines zones mais sinon exactement comme obtenu depuis l'application) est ici:

https://postimg.cc/image/s56o0wbzf/

Vous pouvez voir que la partie importante du texte est parfaitement alignée sur 5 colonnes et c'est finalement ce que cette question concerne. Comment obtenir Tesseract pour l'OCR avec précision dans le texte. J'ai beaucoup d'idées où le prendre à partir d'ici, mais tout commence par l'OCR!

Le plus proche que je suis venu moi-même est cet exemple ici:

http://Pastebin.com/nuZJBVg8

J'ai utilisé psm6 et un jeu de limitation de caractères pour le forcer à faire des majuscules + des chiffres + quelques symboles seulement:

tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#()/*@%-.

À première vue, l'OCR semble presque correspondre. Mais en creusant plus profondément, vous verrez qu'il échoue assez horriblement dans l'ensemble. Les 3 et 8 sont presque toujours faux. Idem avec 6s et 5s. Parfois, il saute complètement les caractères ou commence à s'effondrer (comme la ligne 31+ dans l'exemple). Il commence à voir 2s comme 1s, ou même juste des caractères manquants. Le SO PIZZA sur la ligne 33 devrait être "2,82" mais apparaît comme "32".

J'ai essayé de faire un prétraitement sur l'image pour épaissir les caractères et m'assurer qu'elle est en noir et blanc pur, mais aucun de mes efforts n'a été plus proche que l'image brute de Wal-Mart + les commandes ci-dessus.

Idéalement, car il s'agit d'un PNG si bien structuré qui est probablement toujours la même largeur, j'adorerais si je pouvais définir les colonnes par largeur de pixel afin que Tesseract traite chaque colonne indépendamment. J'ai essayé de rechercher cela, mais les fichiers UZN que j'ai vus mentionnés ne me traduisent pas en ce qui concerne les largeurs de pixels et ils semblent que la hauteur est un facteur qui ne fonctionnerait pas sur ces derniers car la hauteur sera toujours variable.

De plus, j'ai besoin de comprendre comment former Tesseract à reconnaître les chiffres à 100% avec précision (les lettres ne sont pas vraiment importantes). J'ai commencé à rechercher comment former le programme, mais pour être honnête, cela m'est venu à l'esprit assez rapidement, car la formation dans la documentation est davantage pour lui faire reconnaître des langues entières, pas seulement 10 chiffres.

La solution ultime de jeu final serait une chaîne de commandes de pipeline qui a pris le PNG original de l'application et m'a rendu un CSV avec les 5 colonnes de données de la partie importante de la réception. Je ne m'attends pas à cela hors de cette question, mais toute aide me guidant vers elle serait grandement appréciée! À ce stade, je n'ai tout simplement plus envie d'être fouetté par Tesseract et je suis donc déterminé à trouver un moyen de la maîtriser!

19
Jim Sanders

J'ai fini par éliminer tout cela et je suis assez satisfait des résultats, alors j'ai pensé que je le publierais au cas où quelqu'un d'autre le trouverait utile.

Je n'ai pas eu à effectuer de fractionnement d'image et j'ai plutôt utilisé une expression régulière car les recettes Wal-Mart sont tellement prévisibles.

Je suis sous Windows, j'ai donc créé un script PowerShell pour exécuter les commandes de conversion et regex find & replace:

# -----------------------------------------------------------------
# Script: ParseReceipt.ps1
# Author: Jim Sanders
# Date: 7/27/2015
# Keywords: tesseract OCR ImageMagick CSV
# Comments:
#   Used to convert a Wal-mart receipt image to a CSV file
# -----------------------------------------------------------------
param(
    [Parameter(Mandatory=$true)] [string]$image
) # end param

# create output and temporary files based on input name
$base = (Get-ChildItem -Filter $image -File).BaseName
$csvOutfile = $base + ".txt"
$upscaleImage = $base + "_150.png"
$ocrFile = $base + "_ocr"

# upscale by 150% to ensure OCR works consistently
convert $image -resize 150% $upscaleImage

# perform the OCR to a temporary file
tesseract $upscaleImage -psm 6 $ocrFile

# column headers for the CSV
$newline = "Description,UPC,Type,Cost,TaxType`n"
$newline | Out-File $csvOutfile

# read in the OCR file and write back out the CSV (Tesseract automatically adds .txt to the file name)
$lines = Get-Content "$ocrFile.txt"

Foreach ($line in $lines) {
    # This wraps the 12 digit UPC code and the price with commas, giving us our 5 columns for CSV
    $newline = $line -replace '\s\d{12}\s',',$&,' -replace '.\d+\.\d{2}.',',$&,' -replace ',\s',',' -replace '\s,',','
    $newline | Out-File -Append $csvOutfile
}

# clean up temporary files
del $upscaleImage
del "$ocrFile.txt"

Le fichier résultant doit être ouvert dans Excel, puis exécuter la fonctionnalité de texte dans les colonnes afin de ne pas ruiner les codes UPC en les convertissant automatiquement en nombres. C'est un problème bien connu Je ne vais pas m'y plonger, mais il existe une multitude de façons de gérer et j'ai opté pour cette méthode un peu plus manuelle.

J'aurais été plus heureux de me retrouver avec un simple .csv que je pourrais double-cliquer mais je ne pouvais pas trouver un excellent moyen de le faire sans modifier les codes UPC encore plus comme en les enveloppant dans ce format:

 "=""12345"""

Cela fonctionne, mais je voulais que le code UPC soit uniquement les chiffres sous forme de texte dans Excel au cas où je serais en mesure de faire une recherche plus tard contre l'API Wal-mart.

Quoi qu'il en soit, voici à quoi ils ressemblent après l'importation et un formatage rapide:

https://s3.postimg.cc/b6cjsb4bn/Receipt_Excel.png

J'ai encore besoin de nettoyer les ordures sur les lignes qui ne sont pas des éléments de campagne, mais cela ne prend que quelques secondes, donc cela ne me dérange pas trop.

Merci pour le Nudge dans la bonne direction @RevJohn, je n'aurais pas pensé essayer de simplement redimensionner l'image mais cela a fait toute la différence dans le monde avec Tesseract!

15
Jim Sanders

La reconnaissance de texte sur les reçus est l'un des problèmes les plus difficiles à résoudre pour l'OCR.

Les raisons sont nombreuses:

  • les reçus sont imprimés sur du papier bon marché avec des imprimantes bon marché - pour les rendre bon marché, pas lisibles!
  • ils ont une très grande quantité de texte dense (en particulier les reçus Wall-Mart)
  • les moteurs OCR existants sont presque exclusivement formés aux données de non-réception (livres, documents, etc.)
  • la structure de réception, qui est quelque chose entre tabulaire et forme libre, est difficile à gérer pour tout moteur de mise en page.

Votre meilleur pari est d'effectuer les opérations suivantes:

  • Analysez les images d'entrée. S'ils sont difficiles à lire à l'œil nu, ils sont également difficiles à lire pour tesseract.
  • Effectuez un prétraitement d'image supplémentaire. La mise à l'échelle de l'image (0,5x, 1,5x, 2x) aide parfois beaucoup. Le nettoyage du bruit existant aide également.
  • Formation Tesseract. Ce n'est pas si difficile à faire :)
  • Post-traitement des résultats OCR pour assurer la mise en page.

La mise en page est mieux effectuée en analysant la géométrie des résultats, et non par des expressions rationnelles. Les expressions régulières ont des problèmes si l'OCR contient des erreurs. En utilisant la géométrie, par exemple, vous trouvez un bon candidat pour UPC nombre, tracez une ligne à travers les centres des caractères, puis vous savez exactement quel prix appartient à cet UPC.

De plus, certaines solutions commerciales ont des personnalisations pour la numérisation des reçus et peuvent même fonctionner très rapidement sur les appareils mobiles.

La société avec laquelle je travaille, MicroBlink , a un module OCR pour les appareils mobiles. Si vous êtes sur iOS, vous pouvez facilement l'essayer en utilisant CocoaPods

pod try PPBlinkOCR
12
Cerovec