Jim*_*ers 19 ocr tesseract receipt
我一直在与Tesseract一起努力争取各种OCR项目,我今天发现了一个用例,我认为这会是一个扣篮,但是经过几个小时后我仍然不满意.我想在这里提出问题,看看是否还有其他人就如何解决这个问题提出了建议.
我的妻子今天早上来找我,问她是否可以轻松扫描她收到的沃尔玛收据,随着时间的推移,建立了类别和特定物品价格的历史记录,这样我们就可以做一些趋势并轻松深入研究支出在哪里.起初我觉得这是一个非常高的订单,但在做了一些挖掘后,我发现了一些让我觉得这是触手可及的事情:
沃尔玛的收据一般,结构合理,易于阅读.他们甚至包括每个项目的UPC(可能对UPC数据库进行查找?)并且似乎用F或I对食品进行分类(不确定区别是什么)并且还有一个税法代码列,这可能证明是有用的我了解代码的含义秘诀.
我进一步发现,我可能能够获得某种沃尔玛项目查找API,这对于UPC查找非常有用.
他们有一个智能手机应用程序,可以扫描每张收据上打印的二维码.该应用程序从收据中查找"TC"代码,并从其服务器中提取整个逐项收据.它向您显示收据的优秀图形表示,包括所有项目的缩略图和成本等.如果此应用程序只是分类和汇总收据,我会完成!但唉,这不是应用程序的目的....
最后一个难题是,您可以导出计算机生成的收据的PNG图像,以防您想要保存并扔掉纸质版本.这对我而言是拍摄的,因为这些PNG是由计算机创建的,因此不受拍摄照片或扫描纸质收据的问题的影响
其中一个示例(稍微编辑以淡化某些区域,但另外完全从应用程序获得)在这里:
https://postimg.cc/image/s56o0wbzf/
您可以看到文本的重要部分完全对齐在5列中,这最终是这个问题的内容.如何让Tesseract准确地将其转换成文本.我有很多想法从这里开始,但这一切都从OCR开始!
我最亲近的就是这个例子:
我使用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的世界完全不同!
Cer*_*vec 12
收据上的文本识别是OCR要处理的最难的问题之一.
原因很多:
您最好的选择是执行以下操作:
最好通过分析结果的几何形状而不是正则表达式来进行布局.如果OCR有错误,则正则表达式有问题.例如,使用几何体,您可以找到UPC编号的良好候选者,在角色的中心画一条线,然后您确切地知道哪个价格属于该UPC.
此外,一些商业解决方案具有接收扫描的定制,甚至可以在移动设备上非常快地运行.
我正在与MicroBlink合作的公司有一个用于移动设备的OCR模块.如果你在iOS上,你可以使用CocoaPods轻松尝试
pod try PPBlinkOCR
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14648 次 |
| 最近记录: |