我正在尝试结合使用 Opencv、Tesseract 和 Keras 从一系列不同的收据中提取信息。该项目的最终结果是我应该能够使用手机拍摄收据照片,并从该照片中获取商店名称、支付类型(卡或现金)、支付金额和找零。
到目前为止,我已经使用 Opencv 对一系列不同的样本收据进行了一些不同的预处理步骤,例如去除背景、去噪和转换为二值图像,并留下如下图像:
然后我使用 Tesseract 对收据执行 ocr,并将结果写入文本文件。我已经设法让 ocr 以可接受的水平执行,因此我现在可以拍一张收据的照片并在上面运行我的程序,我将得到一个包含收据上所有文本的文本文件。
我的问题是我不想要收据上的所有文字,我只想要某些信息,例如上面列出的参数。我不确定如何训练一个模型来提取我需要的数据。
我认为应该使用 Keras 对图像的不同部分进行分割和分类,然后将我的模型分类为包含相关数据的部分中的文本写入文件,这样的想法是否正确?或者对于我需要做的事情有更好的解决方案吗?
很抱歉,如果这是一个愚蠢的问题,这是我的第一个 Opencv/机器学习项目,我的理解力还远远不够。任何建设性的批评将不胜感激。
最佳答案
我的回答不像现在流行的那样花哨,但我认为它适用于您的情况,特别是如果这是用于产品(不是用于研究和出版目的)。
我会实现论文 Text/Graphics Separation Revisited .我已经在 Matlab 和 C++ 中实现了它,我从你的描述中保证它不会花你很长时间。总结:
获取所有具有统计信息的连接组件。您对每个字符的边界框特别感兴趣。
这篇论文从连通分量属性的直方图中获取阈值,这使得它有点稳健。在连接组件的几何属性上使用这些阈值(效果出奇地好),丢弃任何不是字符的内容。
对于您的角色,获取其所有边界框的质心,并根据您自己的标准(高度、垂直位置、欧几里得距离等)对最接近的质心进行分组。使用获得的质心簇创建矩形文本区域。
关联相同高度和垂直位置的文本区域。
对您的文本区域运行 OCR 并查找诸如“现金”之类的关键字。老实说,我认为你可以不用带文本文件的字典,也可以不用为移动设备完成计算机视觉,我知道你的资源是有限的(也受隐私保护)。
老实说,我认为神经网络不会比某种关键字匹配(例如使用 Levenshtein 距离或类似的东西来增加一点稳健性)好多少,因为无论如何你都需要手动创建和标记这些词创建您的训练数据集,那么...为什么不直接写下来呢?
基本上就是这样。你很快就能得到一些东西(特别是如果你想使用手机并且你不能将图像发送到服务器)并且它可以正常工作。不需要机器学习,因此也不需要数据集。
但如果这是为了学校...抱歉我太粗鲁了。请使用具有 10,000 张手动标记的收据图像和自然语言处理方法的 TensorFlow,您的教授会很高兴。
关于opencv - 如何从收据中提取相关信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796771/