OCR 软件能否可靠地从表中读取值?

Posted

技术标签:

【中文标题】OCR 软件能否可靠地从表中读取值?【英文标题】:Can OCR software reliably read values from a table? 【发布时间】:2011-09-04 15:09:07 【问题描述】:

OCR 软件能否可靠地将如下图像转换为值列表?

更新:

更详细的任务如下:

我们有一个客户端应用程序,用户可以在其中打开报告。此报告包含一个值表。 但并不是每个报表看起来都一样——不同的字体、不同的间距、不同的颜色,也许报表包含许多具有不同行数/列数的表格...

用户选择包含表格的报告区域。使用鼠标。

现在我们要使用我们的 OCR 工具将选定的表格转换为值。

当用户选择矩形区域时,我可以要求额外的信息 帮助 OCR 过程,并要求确认这些值已被正确识别。

它最初将是一个实验性项目,因此很可能使用开源 OCR 工具 - 或者至少是一个不需要任何资金用于实验目的的工具。

【问题讨论】:

softwarerecs.stackexchange.com/questions/34358/… 自发布此问题以来,Tabula 开源软件项目已经可用,值得一看:tabula.technology 【参考方案1】:

简单的答案是肯定的,您应该选择正确的工具。

我不知道开源是否可以在这些图像上获得接近 100% 的准确度,但根据这里的答案,如果您花一些时间在培训和解决表格分析问题之类的问题上,可能是的。

当我们谈论像 ABBYY 或其他这样的商业 OCR 时,它会为您提供 99% 以上的开箱即用准确率,并且会自动检测表格。没有培训,没有任何东西,只是工作。缺点是你必须支付它$$。有些人会反对,对于开源,你需要花时间来设置和维护它——但每个人都在这里为自己做决定。

但是,如果我们谈论商业工具,实际上还有更多选择。这取决于你想要什么。像 FineReader 这样的盒装产品实际上是针对将输入文档转换为 Word 或 Excel 等可编辑文档。由于您实际上想要获取数据,而不是 Word 文档,因此您可能需要查看不同的产品类别 - 数据捕获,它本质上是 OCR 加上一些额外的逻辑来在页面上查找必要的数据。如果是发票,它可以是公司名称、总金额、到期日、表格中的行项目等。

数据捕获是一个复杂的主题,需要一些学习,但正确使用可以在从文档中捕获数据时保证准确性。它使用不同的规则进行数据交叉检查、数据库查找等。必要时可以发送数据进行人工验证。企业每月广泛使用 Data Capture 应用程序来输入数百万份文档,并且严重依赖在其日常工作流程中提取的数据。

当然还有 OCR SDK,它可以让您通过 API 访问识别结果,您将能够编程如何处理数据。

如果您更详细地描述您的任务,我可以为您提供建议,哪个方向更容易实现。

更新

所以你所做的基本上是数据捕获应用程序,但不是完全自动化的,使用所谓的“点击索引”方法。市场上有许多类似的应用程序:您扫描图像,操作员单击图像上的文本(或在其周围绘制矩形),然后将字段填充到数据库中。当要处理的图像数量相对较少且手动工作量不足以证明全自动应用程序的成本时,这是一种很好的方法(是的,有全自动系统可以处理具有不同字体、间距、布局、数量的图像)表中的行等)。

如果您决定开发而不是购买,那么您只需选择 OCR SDK。所有的 UI 都是你自己写的,对吧?最大的选择是决定:开源还是商业。

据我所知,最好的开源是 tesseract OCR。它是免费的,但在表格分析方面可能存在实际问题,但使用手动分区方法,这应该不是问题。至于 OCR 准确性 - 人们经常训练 OCR 字体以提高准确性,但这不应该是你的情况,因为字体可能不同。因此,您可以尝试 tesseract 并查看您将获得什么精度 - 这将影响纠正它的手动工作量。

商业 OCR 会提供更高的准确度,但会花钱。我认为你无论如何都应该看看它是否值得,或者 tes-s-rack 对你来说足够好。我认为最简单的方法是下载一些盒子 OCR 产品的试用版,比如 FineReader。你会很好地了解 OCR SDK 的准确性。

【讨论】:

@Tomate - 感谢您分享您的一些经验。我更新了问题以提供更多详细信息。 我已经尝试过 ABBYY FineReader,它就像一个魅力。可惜对大多数人来说太贵了……【参考方案2】:

如果您的表格中总是有实线边框,您可以尝试以下解决方案:

    找到每页上的水平线和垂直线(长时间运行 黑色像素) 使用线坐标将图像分割成单元格 清理每个单元格(去除边框、黑白阈值) 对每个单元格执行 OCR 将结果组装成二维数组

如果您的文档有无边框表格,您可以尝试遵循此行:

光学字符识别是非常了不起的东西,但事实并非如此 永远完美。为了获得最好的结果,它有助于使用 最干净的输入。在我最初的实验中,我发现 对整个文档执行 OCR 实际上效果很好 只要我删除了单元格边框(长的水平和垂直 行)。但是,该软件将所有空白压缩为一个 空的空间。由于我的输入文档有多个列 每列中有几个单词,单元格边界正在丢失。 保持细胞之间的关系非常重要,所以一个 可能的解决方案是在每个字符上画一个独特的字符,例如“^” 单元格边界——OCR 仍能识别的东西,我 以后可以用来拆分结果字符串。

我在此链接中找到了所有这些信息,并询问 Google“OCR 到表格”。作者发布a full algorithm using Python and Tesseract,都是开源解决方案!

如果你想试试 Tesseract 的力量,也许你应该试试这个网站:

http://www.free-ocr.com/

【讨论】:

【参考方案3】:

您说的是哪种 OCR? 您会基于该 OCR 开发代码,还是会使用现成的东西?

仅供参考: Tesseract OCR

它已经实现了文档读取可执行文件,因此您可以输入整个页面,它会为您提取字符。它可以很好地识别空格,它可能有助于制表符间距。

【讨论】:

嗨,Gary,是的,我已经开始研究 Tesseract,但在前几次实验之后没有运气。对于我发布的带有问题的示例位图,我得到的结果是“空页”。但也许我只需要提供正确的参数? 多年来我一直在使用 OCR 进行自己的研究。如果我不提供空页,我几乎永远不会得到空页。但是,有时,我确实得到了它们,因为 1)binerization @ tesseract 过滤掉了大部分有价值的信息 2)即使在良好的 binerization 之后,字符也无法识别,因为 a)字符之间的“间距”太小(字符过于紧密地放在一起)。 b) 字符不是 Tesseract 用来训练的东西 对于 2a,您是否尝试将图像放大到原始图像的 400+%?我很幸运! +1:我从测试图像中删除了白线,放大了 400%,然后 Tesseract 对第二列值进行了 100% 的准确识别(忽略了第一个值)。看起来很有希望,但我需要做更多的实验。【参考方案4】:

自 98 年以来,我一直在对扫描的文档进行 OCR 处理。这是扫描文档经常出现的问题,尤其是那些包含旋转和/或倾斜页面的文档。

是的,有几个很好的商业系统,其中一些可以提供,一旦配置良好,极好的自动数据挖掘率,只在那些非常退化的领域寻求操作员的帮助。如果我是你,我会依赖其中的一些。

如果商业选择威胁到您的预算,OSS 可以助您一臂之力。但是,“没有免费的午餐”。因此,您将不得不依靠一堆量身定制的脚本来搭建一个负担得起的解决方案来处理您的一堆文档。幸运的是,你并不孤单。事实上,在过去的几十年里,很多人一直在处理这个问题。所以,恕我直言,这篇文章提供了这个问题的最佳和简明答案:

https://datascience.blog.wzb.eu/2017/02/16/data-mining-ocr-pdfs-using-pdftabextract-to-liberate-tabular-data-from-scanned-documents/

它的阅读是值得的!作者提供了他自己的有用工具,但文章的结论对于让您对如何解决此类问题有一个良好的心态非常重要。

“没有灵丹妙药。” (弗雷德·布鲁克斯,The Mitical Man-Month

【讨论】:

【参考方案5】:

这真的取决于实施。

有几个参数会影响 OCR 的识别能力: 1. OCR 的训练效果如何 - 示例数据库的大小和质量 2. 检测“垃圾”的训练效果如何(除了知道什么是字母,你还需要知道什么不是字母)。 3. OCR 的设计和类型 4. 如果是神经网络,神经网络的结构会影响其学习和“决策”的能力。

因此,如果您不自己制作,只需测试不同的种类,直到找到适合的。

【讨论】:

【参考方案6】:

您可以尝试其他方法。使用 tesseract(或其他 OCRS),您可以获得每个单词的坐标。然后您可以尝试通过垂直和水平坐标对这些单词进行分组以获得行/列。例如,区分空格和制表符空间。需要一些练习才能获得好的结果,但这是可能的。使用这种方法,即使表格使用不可见的分隔符,您也可以检测表格 - 没有线条。单词坐标是表格识别的坚实基础

【讨论】:

【参考方案7】:

我们也一直在努力解决识别表格中的文本的问题。有两种开箱即用的解决方案,ABBYY Recognition Server 和 ABBYY FlexiCapture。 Rec Server 是一种基于服务器的大容量 OCR 工具,旨在将大量文档转换为可搜索的格式。尽管它可通过 API 用于这些类型的用途,但我们推荐使用 FlexiCapture。 FlexiCapture 对从表格格式中提取数据提供低级别控制,包括自动检测页面上的表格项目。它可以在没有前端的完整 API 版本中使用,也可以在我们销售的现成版本中使用。如果您想了解更多信息,请联系我。

【讨论】:

【参考方案8】:

以下是对我有用的基本步骤。需要的工具包括Tesseract、Python、OpenCV 和ImageMagick,如果您需要对图像进行任何旋转以纠正歪斜。

    使用 Tesseract 检测旋转并使用 ImageMagick mogrify 修复它。 使用 OpenCV 查找和提取表格。 使用 OpenCV 从表格中查找并提取每个单元格。 使用 OpenCV 裁剪和清理每个单元格,这样就不会有干扰 OCR 软件的噪音。 使用 Tesseract 对每个单元格进行 OCR。 将每个单元格的提取文本组合成您需要的格式。

每个步骤的代码都很丰富,但是如果你想使用 python 包,它就像下面一样简单。

pip3 install table_ocr
python3 -m table_ocr.demo https://raw.githubusercontent.com/eihli/image-table-ocr/master/resources/test_data/simple.png

该包和演示模块会将下表转换为 CSV 输出。

Cell,Format,Formula
B4,Percentage,None
C4,General,None
D4,Accounting,None
E4,Currency,"=PMT(B4/12,C4,D4)"
F4,Currency,=E4*C4

如果您需要进行任何更改以使代码适用于不同宽度的表格边框,https://eihli.github.io/image-table-ocr/pdf_table_extraction_and_ocr.html 上有大量注释

【讨论】:

以上是关于OCR 软件能否可靠地从表中读取值?的主要内容,如果未能解决你的问题,请参考以下文章

专门为渲染文本设计开源 OCR 引擎(截图)

条码Code39扫描可靠吗?

从扫描的文档/图像中可靠地提取身份字段?

从表值参数将数据插入表中

我能否可靠地找出正确的 mime 类型来提供不受信任的内容?

如何在软件中可靠地生成以太网帧错误?