需要Tesseract收据扫描建议

Jim*_*ers 19 ocr tesseract receipt

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

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

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

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

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

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

其中一个示例(稍微编辑以淡化某些区域,但另外完全从应用程序获得)在这里:

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

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

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

http://pastebin.com/nuZJBVg8

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

tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#()/*@%-.
Run Code Online (Sandbox Code Playgroud)

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

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

理想情况下,因为这是一个结构良好的PNG,如果我可以按像素宽度定义列,我希望它总是宽度相同,以便Tesseract可以独立地处理每一列.我试图研究这个但是我见过的UZN文件并没有像素宽度那样转换给我,它们看起来像高度是因为高度总是变化的因素不适用于这些因素.

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

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

Jim*_*ers 16

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

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

我在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"
Run Code Online (Sandbox Code Playgroud)

生成的文件需要在Excel中打开,然后运行文本到列功能,以便它不会通过自动将它们转换为数字来破坏UPC代码.这是一个众所周知的问题,我不会深入研究,但有很多方法可以处理,我采用这种稍微更加手动的方式.

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

 "=""12345"""
Run Code Online (Sandbox Code Playgroud)

这确实有效,但我希望UPC代码只是数字单独作为Excel中的文本,以防我以后能够对沃尔玛API进行查找.

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

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

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

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

  • 是的,分辨率很重要,我过去做了一些OCR准确度与图像分辨率的实验:你得到的不是增加的图形(更高的分辨率更好),而是具有局部最大值的一个(我猜)与DPI分辨率相对应训练.向上或向下缩放图像带来帮助; 这同样适用于其他OCR引擎. (2认同)

Cer*_*vec 12

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

原因很多:

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

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

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

最好通过分析结果的几何形状而不是正则表达式来进行布局.如果OCR有错误,则正则表达式有问题.例如,使用几何体,您可以找到UPC编号的良好候选者,在角色的中心画一条线,然后您确切地知道哪个价格属于该UPC.

此外,一些商业解决方案具有接收扫描的定制,甚至可以在移动设备上非常快地运行.

我正在与MicroBlink合作的公司有一个用于移动设备的OCR模块.如果你在iOS上,你可以使用CocoaPods轻松尝试

pod try PPBlinkOCR
Run Code Online (Sandbox Code Playgroud)