我们如何从图像中提取字段?
我有一个类似的用例和一个基于tensorflow object-detection api和pytesseract用于 OCR 的工作产品。在提取的文本之上,我执行正则表达式以验证提取的信息并对其进行清理以满足其他流程的要求。
步骤:
1. 使用labelimg等工具对图像进行注释。
我注释了一组 1K 图像,与你的类似,有 23 个不同的类。数据集是不平衡的,有些类几乎出现在每张图像中,而有些类只出现在 60 个中。但是,有一些方法可以确保这种不平衡不会影响网络的性能。
2. 从tf model zoo中选择一个模型(我使用这个frcnn模型)并使用迁移学习重新训练最后两层。
3.导出推理图,进行物体检测识别感兴趣区域,对感兴趣区域进行OCR提取文本。
我建议将提取的数据存储在字典中,将对象的类作为键,将提取的文本作为值。
4. 最后,让正则表达式验证提取字段中的文本并执行任何必要的操作/转换。
训练好的模型可以在tfserving的帮助下部署到生产环境中。同样训练有素的网络也可以部署到移动应用程序中——为此寻找关于 tensorflowlite 的教程。
希望我的回答对你有帮助!我有一个艰难(但有趣)的时间来收集获得生产级产品所需的知识,该产品目前每天服务于数百个请求。我建议完全阅读我在此答案中共享的所有链接,并随时提出更多问题。祝你好运!
我想你已经有一些 OCR 了?我不知道你是否也有识别文本的 xy 位置和大小?
我希望你有一个模型知道(已经学会)'invoice #'作为标签的出现。
也许您可以通过机器学习识别可能是发票编号的值。2034, 200.00 可以是发票号码,“日期”和“服务费”不是。
您可以机器学习对象之间的关系,可能借助距离函数。
我会说一个主要包含数字的字符串值靠近与“发票#”匹配的标签,并且也具有相似的大小,是最有可能的发票号码。
564 可能是发票编号,但它与发票编号太远(超过 2034)。
“日期”接近发票编号,但它与发票编号的预期字符串不匹配,因为它主要是字母。
我建议您应该使用预训练的 OCR 模型并训练您自己的仅输出所需数据的自定义模型。
训练方法:
只需使用这样的预训练 OCR 模型,然后删除模型的尾部并添加具有所需字段数量的自定义输出层(在您的情况下为发票和日期)。在此之后,冻结模型的头部并使用您拥有的数据训练您的自定义模型。
笔记:
- 如果您通过使用尽可能多的不同发票模板来训练此自定义模型,则可以提高模型的准确性。因为这个自定义 OCR 模型必须学会自己找出发票的位置和日期。
- 如果模型的输出对于某些模板不正确,您始终可以通过编辑模板并添加该特定模板的许多示例来生成自己的(合成)数据。
使用预训练模型,您可以用更少的训练数据获得相当不错的结果。如果您没有使用预训练模型,这里有一种更通用的在 PyTorch 中使用样式迁移的方法。我希望它会帮助你。
或多或少这会有所帮助
链接:从文档中提取信息
来自上述博客的方法和算法
方法
该算法会寻找看起来像日期的短语。然后它选择出现在文档中最高位置的那个。在我们使用的语料库中,几乎每个日期都包含用单词写成的月份(例如 April),用数字写成的日期(13),然后是年份(1994)。有时,日期会在月份之前打印(例如 1984 年 9 月 4 日)。该算法查找模式 MDY 和 DMY,其中 M 是作为单词给出的月份,D 是表示日期的数字,Y 是表示年份的数字。
软件工具
我们的实现在带有 Python 3 的 Jupyter Notebook 中运行。我们使用 Tesseract 版本 4,通过包装器 pytesseract 进行 OCR。由于软件有时会错误地获取月份的字母(例如,正式而不是七月),因此我们接受几乎看起来像一个月的所有字符串,因为只需更改几个字母即可达到有效月份。这些操作的数量称为 Levenshtein 距离,这是自然语言处理 (NLP) 中常见的字符串度量。例如,duly 和 July 的 Levenshtein 距离为 1。对于 Moy、Septenber 或类似的错误也是如此。我们使用 python-Levenshtein。为了检测数字(年和日),我们使用正则表达式。我们在 Pandas 中处理所有表格,并使用 tqdm 来制作整洁的进度条。
来自 Stackoverflow 的类似问题: