需要Tesseract收据扫描建议

时间:2015-07-26 03:39:01

标签: ocr tesseract receipt

我已经与Tesseract一起努力争取各种OCR项目,我今天发现了一个用例,我认为这会是一个扣篮,但经过几个小时我仍然不满意。我想在这里提出问题,看看是否有其他人就如何解决这个问题提出了建议。

我的妻子今天早上来找我并询问是否有她可以轻松扫描沃尔玛的收据,并随着时间的推移建立了类别和特定项目的价格历史记录,以便我们可以轻松地做一些趋势深入研究支出的来源。起初我觉得这是一个非常高的订单,但在做了一些挖掘之后,我发现了一些让我觉得这是触手可及的事情:

  1. 沃尔玛收据一般,结构合理,易于阅读。他们甚至包括每个项目的UPC(可能对UPC数据库进行查找?)并且似乎用F或I对食品进行分类(不确定区别是什么)并且还有一个税法代码列,这可能证明是有用的我了解了代码含义的秘密。

  2. 我进一步发现,我可以获得某种沃尔玛项目查找API,这对于UPC查找非常有用。

  3. 他们有一个智能手机应用程序,可让您扫描每张收据上打印的二维码。该应用程序查找" TC"代码关闭收据并从服务器中提取整个逐项收据。它向您显示收据的优秀图形表示,包括所有项目的缩略图和成本等。如果此应用程序只是分类和汇总收据,我会完成!但是,唉,这不是应用程序的目的....

  4. 最后一个难题是您可以导出计算机生成的收据的PNG图像,以防您想要保存并扔掉纸质版本。这对我而言就是拍摄的钱,因为这些PNG是由计算机创建的,因此不会受到围绕拍照或扫描纸质收据的问题的影响

  5. 其中一个示例(稍微编辑以淡化某些区域,但其他方面与应用程序完全相同)在此处:

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

    你可以看到文本的重要部分完全对齐在5列中,这最终是这个问题的内容。如何让Tesseract准确地将其转换成文本。我有很多想法从这里开始,但一切都从OCR开始!

    我最亲近的就是这个例子:

    http://pastebin.com/nuZJBVg8

    我使用了psm6和一个字符限制集来强制它只做大写+数字+几个符号:

    tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#()/*@%-.
    
    乍一看,OCR似乎几乎匹配。但是当你深入挖掘时,你会发现整体失败的可能性非常大。 3s和8s几乎总是错的。与6s和5s相同。然后有时候它会完全跳过字符或者开始分崩离析(例如示例中的第31行)。它开始将2s视为1,甚至只是缺少字符。第33行的SO PIZZA应为" 2.82"但是出现在" 32"。

    我尝试对图像进行一些预处理,以加厚字符,并确保它的纯黑色和白色,但我的努力没有比沃尔玛+上面的原始图像更接近命令。

    理想情况下,因为这是一个结构良好的PNG,如果我可以按像素宽度定义列,我希望它总是宽度相同,以便Tesseract可以独立地处理每一列。我试图对此进行研究,但我所见过的UZN文件并没有像素宽度那样翻译给我,看起来高度是一个因为高度不高而无法解决这些问题的因素。永远都是变数。

    另外,我需要弄清楚如何训练Tesseract准确地识别数字100%(这些字母并不是非常重要)。我开始研究如何训练该程序,但说实话,它很快就超出了我的头脑,因为文档中的培训范围更多的是让它识别整个语言而不仅仅是10位数。

    终极游戏解决方案将是一个管道连锁命令,它从应用程序中获取原始PNG,并从收据的重要部分返回一个包含5列数据的CSV。我不希望出现这个问题,但是我将非常感谢任何指导我的帮助!在这一点上,我只是觉得再次被Tesseract鞭打,所以我决心找到一种方法来掌握她!

2 个答案:

答案 0 :(得分:14)

我最终完全清除了这一点,并对结果非常满意所以我想我会发布它以防其他人发现它有用。

我没有必要进行任何图像分割,而是使用正则表达式,因为沃尔玛的收据是如此可预测。

我在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中打开,然后运行text to columns功能,以便它不会通过自动将它们转换为数字来破坏UPC代码。这是一个我不会深入研究的众所周知的问题,但是有很多方法可以处理,我采用了这种稍微更加手动的方式。

我最幸福的是最终得到一个简单的.csv我可以双击但是我找不到一个很好的方法来做到这一点而不会破坏UPC代码甚至更像是用这种格式包装它们:

 "=""12345"""

这确实有效但我希望UPC代码只是Excel中的文本数字,以防我以后能够对Wal-mart API进行查找。

无论如何,这是他们看待导入和快速格式化的方式:

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

我仍然需要对不是订单项的行进行一些垃圾清理,但这只需要几秒钟,所以不会打扰我太多。

感谢@RevJohn在正确方向上的推动,我不会想到只是简单地缩放图像,但这在世界上与Tesseract有所不同!

答案 1 :(得分:11)

收据上的文字识别是OCR要处理的最难的问题之一。

原因很多:

  • 收据用便宜的打印机打印在便宜的纸上 - 使它们便宜,不易阅读!
  • 他们有非常多的密集文本(特别是沃尔玛收据)
  • 现有的OCR引擎几乎全部接受非收据数据(书籍,文件等)的培训。
  • 收据结构,这是表格和自由形式之间的东西,任何布局引擎都难以处理。

您最好的选择是执行以下操作:

  • 分析输入图像。如果它们难以用眼睛阅读,那么它们也难以阅读。
  • 执行其他图像预处理。图像缩放(0.5x,1.5x,2x)有时会有很大帮助。清洁现有的噪音也有帮助。
  • Tesseract培训。做起来并不难:)
  • OCR结果后处理以确保布局。

最好通过分析结果的几何图形而不是正则表达式来执行布局。如果OCR有错误,则正则表达式有问题。例如,使用几何体,你可以找到一个很好的UPC号码候选者,在角色的中心画一条线,然后你就知道哪个价格属于那个UPC。

此外,一些商业解决方案具有收据扫描的自定义功能,甚至可以在移动设备上快速运行。

我正在与之合作的公司MicroBlink,有OCR module个移动设备。如果您使用的是iOS,则可以使用CocoaPods轻松尝试

pod try PPBlinkOCR