web-dev-qa-db-ja.com

Tesseractレシートスキャンのアドバイスが必要

私はさまざまなOCRプロジェクトでTesseractと何度も何度も奮闘してきましたが、今日はスラムダンクだと思っていたユースケースを見つけましたが、何時間も経過してもまだ満足できません。私はここで問題を提起し、このタスクを解決する方法について他の誰かにアドバイスがあるかどうかを確認したいと思いました。

私の妻は今朝私に来て、とにかく彼女がウォルマートからの領収書を簡単にスキャンして、時間の経過とともにカテゴリーおよび特定のアイテムに費やされた価格の履歴を構築できるかどうか尋ねました。支出はどこに行くのでしょうか。最初はこれは非常に難しい注文だと感じましたが、いくつかの掘り下げを行った後、これが手近にあると感じさせるいくつかのことがわかりました。

  1. ウォルマートのレシートは一般的に、非常によく構成されており、読みやすいです。これらには、UPC for item(UPC database?)に対する検索の可能性があります)も含まれ、食品アイテムをFまたはIで分類しているように見えます(不明)違いは何ですか?)そして、コードが何を意味するかの秘密を知る必要がある場合に役立つかもしれない税コード列も持っています。

  2. 私はさらに、UPCルックアップで有用であることが判明するであろうアクセスを取得できる可能性のあるある種のウォルマートアイテムルックアップAPIがあることを発見しました。

  3. 彼らはあなたがすべてのレシートに印刷されたQRコードをスキャンすることができるスマートフォン用のアプリを持っています。そのアプリはレシートから「TC」コードを検索し、アイテム化されたレシート全体をサーバーから取得します。これは、すべてのアイテムのサムネイル画像やコストなどを含む、レシートの優れたグラフィック表現を示しています。このアプリでレシートを単純に分類して要約すれば、私は完了です!しかし、悲しいかな、それはアプリの目的ではありません...

  4. パズルの最後のピースは、保存して紙のバージョンを捨てたい場合に備えて、コンピュータで生成されたレシートのPNG画像をエクスポートできることです。これは私にとってお金のショットです。これらのPNGはコンピューターで作成されているため、写真の撮影や領収書のスキャンに関する問題の影響を受けません。

これらの1つの例(一部の領域を白くするために少し編集されていますが、それ以外はアプリから取得したとおりに正確に)は次のとおりです。

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

テキストの重要な部分が5列に完全に配置されていることがわかります。これが最終的にこの質問に関するものです。 Tesseractにこれをテキストに正確にOCRさせる方法。ここからどこへ行くべきかたくさんのアイデアがありますが、すべてOCRから始まります!

私が私に来た最も近いものはこの例です:

http://Pastebin.com/nuZJBVg8

私はpsm6と文字制限セットを使用して、大文字+数字+いくつかの記号のみを強制的に実行しました。

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

一見すると、OCRはほぼ一致しているようです。しかし、深く掘り下げると、全体的にかなりひどく失敗することがわかります。 3と8はほとんどの場合間違っています。 6秒と5秒と同じです。その後、文字を完全にスキップするか、ばらばらになり始める場合があります(例では31行目以上)。 2sを1sと見なし始めたり、文字が欠けていたりします。 33行目のSO PIZZAは "2.82"になるはずですが、 "32"と表示されます。

画像を前処理して文字を濃くし、純粋な白黒であることを確認しましたが、Wal-Martの生の画像+上記のコマンドよりも、どの作業にも近づきませんでした。

これは、Tesseractが各列を個別に処理できるようにピクセル幅で列を定義できれば、おそらく常に同じ幅であるような適切に構造化されたPNGであるため、理想的です。私はこれを調査しようとしましたが、言及したUZNファイルはピクセル幅までは変換されません。高さは常に変化するため、高さはこれらに機能しない要因のようです。

さらに、数字を100%正確に認識するようにTesseractをトレーニングする方法を理解する必要があります(文字はそれほど重要ではありません)。プログラムのトレーニング方法の調査を始めましたが、正直に言うと、ドキュメントのトレーニングの範囲は10桁だけでなく言語全体を認識するためのものなので、すぐに頭に浮かびました。

究極のエンドゲームソリューションは、アプリから元のPNGを取得し、領収書の重要な部分の5列のデータを含むCSVを返すコマンドのパイプラインチェーンになります。私はこの質問からそれを期待していませんが、それに向けて私を導くどんな援助も大歓迎です!現時点では、もう一度テッセラクトにホイップされたくないので、彼女をマスターする方法を見つけようと決心しました。

19
Jim Sanders

私はこれを完全にフラッシュすることになり、結果にかなり満足しているので、他の誰かがこれを有用だと思った場合に備えて投稿すると思いました。

Wal-martのレシートは非常に予測可能であるため、画像分割を行う必要はなく、代わりに正規表現を使用しました。

私はWindowsを使用しているので、変換コマンドと正規表現の検索と置換を実行するためのPowerShellスクリプトを作成しました。

# -----------------------------------------------------------------
# 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"

結果のファイルはExcelで開く必要があり、次にテキストから列への機能を実行して、UPCコードを数値に自動変換することによってコードを破壊しないようにする必要があります。これはよく知られている問題です。掘り下げることはしませんが、処理方法は多数あり、私はこの少し手作業の方法を採用しました。

私はダブルクリックできる単純な.csvで終わるのが一番幸せでしたが、UPCコードをラップしてさらにコードを複雑にしないと、これを行う優れた方法を見つけることができませんでした。このフォーマット:

 "=""12345"""

これは機能しますが、UPCコードは、後でWal-mart APIに対してルックアップできるように、Excelのテキストとして数字だけにしたいと考えました。

とにかく、インポートといくつかの簡単なフォーマット後の様子を次に示します。

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

私はまだ、行項目ではない行のガベージクリーニングを行う必要がありますが、すべて数秒しかかからないので、あまり気になりません。

正しい方向に向けたナッジのおかげで、@ RevJohn、私は単に画像をスケーリングしようとは思っていませんでしたが、それがTesseractで世界にすべての違いをもたらしました!

15
Jim Sanders

領収書のテキスト認識は、OCRが処理するのが最も難しい問題の1つです。

理由は多数あります。

  • 領収書は安価なプリンターで安価な紙に印刷されます。
  • 非常に大量の密なテキスト(特にウォールマートの領収書)がある
  • 既存のOCRエンジンは、非独占的なデータ(ブック、ドキュメントなど)についてほぼ独占的にトレーニングされています
  • 表形式とフリーフォームの間のレシート構造は、どのレイアウトエンジンでも処理するのが困難です。

あなたの最善の策は、以下を実行することです:

  • 入力画像を分析します。目で読むのが難しいとテッセラクトも読めません。
  • 追加の画像前処理を実行します。画像のスケーリング(0.5x、1.5x、2x)が役立つ場合があります。既存のノイズを取り除くことも役立ちます。
  • Tesseractトレーニング。難しいことではありません:)
  • レイアウトを確実にするためのOCR結果後処理。

レイアウトは、正規表現ではなく、結果のジオメトリを分析することで最適に実行されます。 OCRにエラーがある場合、正規表現に問題があります。たとえば、ジオメトリを使用して、UPC数値の適切な候補を見つけ、文字の中心を通る線を引くと、その価格がそのUPCに属することが正確にわかります。

また、一部の商用ソリューションは、レシートスキャン用にカスタマイズされており、モバイルデバイスでも非常に高速に実行できます。

私が協力している会社 MicroBlink には、モバイルデバイス用の OCRモジュール があります。 iOSを使用している場合は、CocoaPodsを使用して簡単に試すことができます

pod try PPBlinkOCR
12
Cerovec