使用 OCR 和深度学习 PlatoBlockchain 数据智能实现收据数字化自动化。 垂直搜索。 哎。

使用OCR和深度学习自动进行收据数字化

使用OCR和深度学习自动进行收据数字化

想要自动从收据中提取数据? 查看 Nanonets 的预训练 收据 OCR or 建立你自己的 定制收据 OCR。 你也可以 安排演示 了解有关我们的 AP 用例的更多信息!


收据 OCR 或收据数字化解决了从收据中自动提取信息的挑战。 在本文中,我将介绍收据数字化背后的理论,并使用 OpenCV 和实现端到端管道 正方体. 我还回顾了一些使用深度学习进行收据数字化的重要论文。

什么是收据数字化?

收据包含公司之间进行贸易所需的信息,其中大部分以纸质或半结构化格式(例如PDF和纸质/硬拷贝图像)形式存在。 为了有效地管理此信息,公司提取并存储了这些文档中包含的相关信息。 传统上,这是通过手动提取相关信息并将其输入到数据库中来实现的,这是一项劳动密集且昂贵的过程。

收据数字化解决了从收据中自动提取信息的难题。

从收据中提取关键信息并将其转换为结构化文档可以为许多应用程序和服务提供服务,例如有效的归档,快速索引编制和文档分析。 他们在简化许多财务,会计和税务领域的文档密集型流程和办公室自动化中发挥着关键作用。

使用OCR和深度学习自动进行收据数字化

需要一个健壮的 收据OCR or 收据扫描仪 从收据中提取数据? 查看纳米网 收据OCR API!


谁会发现收据数字化有用?

在以下几个方面,收据数字化会产生巨大的影响:

应付帐款和应收帐款自动化

手动计算应付帐款(AP)和应收帐款(AR)既昂贵又费时,并且可能导致经理,客户和供应商之间产生混淆。 借助数字化,公司可以消除这些弊端,并且可以拥有更多优势-更高的透明度,数据分析,更高的营运资金和更轻松的跟踪。

供应链优化

供应链是许多公司正常运作的基础。 管理任务,信息流和产品流是确保完全控制供应和生产的关键。 如果组织要满足交货时间并控制生产成本,那么这是至关重要的。

如今真正蓬勃发展的公司有一些共同点:数字化供应链。 89%的公司 凭借数字化供应链从国际供应商处获得完美订单,确保准时交货。 实现下一代数字供应链 4.0 的关键要素之一是自动化数据捕获和管理,其中很多数据是收据和 发票. 手动输入收据是整个供应链的瓶颈,并导致不必要的延误。 如果将收据处理数字化,则可以显着提高时间和效率。


有 OCR 问题吗? 想要数字化 发票、PDF 或车牌? 前往 纳米网 并免费构建OCR模型!


为什么这是一个难题?

收据数字化非常困难,因为收据有很多差异,有时质量很差。 扫描收据还会在我们的数字副本中引入一些文物。 这些工件带来了许多可读性挑战。

使用OCR和深度学习自动进行收据数字化

这是一些难以破解的问题的清单

  • 手写文字
  • 小字体
  • 嘈杂的图像
  • 图片褪色
  • 相机运动和震动
  • 水印
  • 皱纹/细纹
  • 文字褪色

传统的收据数字化管道

这种端到端方法的典型管道包括:

  • 前处理
  • 光学字符识别
  • 信息提取
  • 资料转储
使用OCR和深度学习自动进行收据数字化

让我们更深入地研究管道的每个部分。 该过程的第一步是预处理。

前处理

大多数扫描的收据都是嘈杂的且带有伪影,因此,为了使OCR和信息提取系统正常工作,必须对收据进行预处理。 常见的预处理方法包括–灰度,阈值(二值化)和噪声消除。

灰度只是将RGB图像转换为灰度图像。

噪声消除通常涉及去除盐和胡椒噪声或高斯噪声。

大多数OCR引擎在黑白图像上都能正常工作。 这可以通过阈值化来实现,阈值化是像素值相对于所提供的阈值的分配。 将每个像素值与阈值进行比较。 如果像素值小于阈值,则将其设置为0,否则,将其设置为最大值(通常为255)。

OpenCV 提供各种阈值选项——简单阈值、自适应阈值

使用OCR和深度学习自动进行收据数字化

光学字符识别

下一步的流程是 OCR。 它用于从图像(例如扫描的文档或图片)中读取文本。 这项技术实际上可以将包含书面文本(打字,手写或打印)的任何类型的图像转换为机器可读的文本数据. OCR涉及两个步骤-文本检测和文本识别。

使用OCR和深度学习自动进行收据数字化

有很多OCR方法。 传统的计算机视觉方法是

  • 使用过滤器将字符与背景分开
  • 应用轮廓检测​​以识别过滤的字符
  • 使用法师分类来识别角色

应用滤镜和图像分类是非常简单的(想想使用SVN的MNIST分类),但是轮廓匹配是一个非常困难的问题,需要大量的人工工作并且无法推广。

接下来是深度学习方法。 深度学习的概括非常好。 EAST是最流行的文本检测方法之一。 EAST(高效准确的场景文本检测器)是一种简单而功能强大的文本检测方法。 EAST网络实际上是众所周知的U-Net的一个版本,可以很好地检测不同大小的特征。

使用OCR和深度学习自动进行收据数字化

神经网络光学字符识别 (空间变压器网络)是执行OCR的其他流行论文。

信息提取

解决信息提取问题的最常见方法是基于规则的,其中在OCR之后编写规则以提取所需的信息。 这是一种功能强大且准确的方法,但是它要求您为新类型的文档编写新规则或模板。

几种基于规则的 发票 分析系统存在于文献中。

基于规则的方法严重依赖于预定义的模板规则,以从特定的发票布局中提取信息

在过去几年中非常普遍的一种方法是使用标准对象检测框架(例如YOLO,Faster R-CNN)来识别字段。 因此,代替纯文本检测,字段识别和文本检测是同时执行的。 这使管道更小(文本检测→识别→提取到检测→识别)。 由于对象检测器学会了识别这些字段,因此无需编写任何规则。

资料转储

提取信息后,就可以按照我们的用例要求完成数据转储。 通常,以JSON格式存储字段信息很方便。 这些JSON文件可以容易地转换为XML文件,Excel工作表,CSV文件或纯文本文件,具体取决于谁想要处理数据以及如何处理。

收据数字化使用 正方体

现在我们有了管道的概念,让我们在示例收据上实现它. 这是我们将使用的收据。 最后,我们的目标是提取餐厅名称,购买的商品及其数量和成本,购买日期以及总数。

使用OCR和深度学习自动进行收据数字化

前处理

因为我们的收据已经是灰度的,并且没有很多杂音,所以我仅通过应用阈值210来进行阈值化。您可以调整该值以获得正确的输出。 太少了,您会错过很多。 太接近255会使所有东西变黑。

我们需要先安装OpenCV。

pip install opencv-python

这是阈值化的代码。

import cv2
import numpy as np
from matplotlib import pyplot as plt # Read the image
img = cv2.imread('receipt.jpg',0)
# Simple thresholding
ret,thresh1 = cv2.threshold(img,210,255,cv2.THRESH_BINARY)
cv2.imshow(thresh1,’gray’)

这就是输出的样子。

使用OCR和深度学习自动进行收据数字化

文字检测

对于文本检测,我将使用一个名为 正方体。 它是权威的OCR库,由Google自2006年以来开发。Tesseract(v4)的最新版本支持基于深度学习的OCR,其​​准确性更高。 底层的OCR引擎本身利用长短期内存(LSTM)网络。

首先,让我们安装最新版本的Tesseract。

对于ubuntu

sudo apt install tesseract-ocr

对于macOS

brew install tesseract --HEAD

对于Windows,您可以从Windows下载二进制文件

验证您的tesseract版本。

tesseract -v

输出–

tesseract 4.0.0-beta.3
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11
Found AVX512BW
Found AVX512F
Found AVX2
Found AVX
Found SSE

安装您的Tesseract + Python绑定

现在我们已经安装了Tesseract二进制文件,现在我们需要安装Tesseract + Python绑定,以便我们的Python脚本可以与Tesseract进行通信。 由于收据是德语,因此我们还需要安装德语包。

pip install pytesseract
sudo apt-get install tesseract-ocr-deu

现在我们已经安装了 Tesseract,让我们开始检测文本框。正方体 具有检测文本框的内置功能。

import pytesseract
from pytesseract import Output
import cv2 img = cv2.imread('receipt.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.imshow(img,'img')

这是文本检测代码的输出。

使用OCR和深度学习自动进行收据数字化

文字识别

我们将Tesseract执行OCR。 Tesseract 4使用了深度学习方法,该方法的性能明显优于大多数其他开源实现。

这是文本识别的代码。 尽管这是一个非常简单的单行代码,但仍有很多不足之处。

extracted_text = pytesseract.image_to_string(img, lang = 'deu')

这是原始输出。

'BerghotelnGrosse Scheideggn3818 GrindelwaldnFamilie R.MüllernnRech.Nr. 4572 30.07.2007/13:29: 17nBar Tisch 7/01n2xLatte Macchiato &ä 4.50 CHF 9,00n1xGloki a 5.00 CH 5.00n1xSchweinschnitzel ä 22.00 CHF 22.00nIxChässpätz 1 a 18.50 CHF 18.50nnTotal: CHF 54.50nnIncl. 7.6% MwSt 54.50 CHF: 3.85nnEntspricht in Euro 36.33 EURnEs bediente Sie: UrsulannMwSt Nr. : 430 234nTel.: 033 853 67 16nFax.: 033 853 67 19nE-mail: grossescheidegs@b luewin. ch'

这是格式化的输出

Berghotel
Grosse Scheidegg
3818 Grindelwald
Familie R.Müller Rech.Nr. 4572 30.07.2007/13:29: 17
Bar Tisch 7/01
2xLatte Macchiato &ä 4.50 CHF 9,00
1xGloki a 5.00 CH 5.00
1xSchweinschnitzel ä 22.00 CHF 22.00
IxChässpätz 1 a 18.50 CHF 18.50 Total: CHF 54.50 Incl. 7.6% MwSt 54.50 CHF: 3.85 Entspricht in Euro 36.33 EUR
Es bediente Sie: Ursula MwSt Nr. : 430 234
Tel.: 033 853 67 16
Fax.: 033 853 67 19
E-mail: grossescheidegs@b luewin. ch

需要数字化文件、收据或 发票 但是懒得写代码? 前往 纳米网 并免费构建OCR模型!


信息提取

如前所述,提取信息的最常见方法是基于规则的方法。

这家酒店的所有收据将采用固定的结构,并且信息显示在不同的行中。 这反映在OCR输出中,其中换行符用'n'表示。 使用这些,我们编写一组规则来提取信息。 这套规则可以应用于该酒店的任何收据,因为它们将遵循相同的格式。

使用OCR和深度学习自动进行收据数字化

我将使用简单的python命令和正则表达式提取餐厅名称,交易日期,购买的商品,数量,每件商品的总成本以及总金额。

这是一本字典,我将在其中存储提取的信息。

receipt _ocr = {}

第一步是提取餐厅名称。 餐厅名称的位置在所有收据中都将保持不变,即在前两行中。 让我们用它来创建一个规则。

splits = extracted_text.splitlines()
restaurant_name = splits[0] + '' + splits[1]

接下来,我们提取交易日期。 日期正则表达式非常简单。


import re
# regex for date. The pattern in the receipt is in 30.07.2007 in DD:MM:YYYY date_pattern = r'(0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.](19|20)dd'
date = re.search(date_pattern, extracted_text).group()
receipt_ocr['date'] = date
print(date)

输出–

‘30.10.2007’

接下来,我们提取与项目和成本相关的所有信息。

这些物品包含 CHF,即瑞士法郎。 让我们检测所有发生的 CHF。 现在我们可以通过识别 2 n 之间且包含 CHF 的字符来检测行。 我也在这里检测总数。

# get lines with chf
lines_with_chf = []
for line in splits: if re.search(r'CHF',line): lines_with_chf.append(line) print(lines_with_chf)

输出–

2xLatte Macchiato &ä 4.50 CHF 9,00
1xSchweinschnitzel ä 22.00 CHF 22.00
IxChässpätz 1 a 18.50 CHF 18.50
Total: CHF 54.50
Incl. 7.6% MwSt 54.50 CHF: 3.85

如果您注意到,Tesseract错过了一项,因为它检测到CH而不是CHF。 在下一节中,我将介绍传统OCR系统中的挑战。

# get items, total, ignore Incl
items = []
for line in lines_with_chf: print(line) if re.search(r'Incl',line): continue if re.search(r'Total', line): total = line else: items.append(line) # Get Name, quantity and cost all_items = {}
for item in items: details = item.split() quantity_name = details[0] quantity = quantity_name.split('x')[0] name = quantity_name.split('x')[1] cost = details[-1] all_items[name] = {'quantity':quantity, 'cost':cost} total = total.split('CHF')[-1] # Store the results in the dict
receipt_ocr['items'] = all_items
receipt_ocr[‘total’] = total import json receipt_json = json.dumps(receipt_ocr)
print(receipt_json)

打印我们的JSON输出–

{'date': '30.07.2007', 'items': {'Chässpätz': {'cost': '18.50', 'quantity': 'I'}, 'Latte': {'cost': '9,00', 'quantity': '2'}, 'Schweinschnitzel': {'cost': '22.00', 'quantity': '1'}}, 'total': ' 54.50'}

所有关键信息已被提取并转储到receive_json中。

常规方法的问题

尽管我们提取了信息,但上述管道漏掉了一些东西,因此不够理想。 对于每个新收据,我们都需要编写一组新规则,因此无法扩展。

布局,字体和字体大小,手写文档等可能会有很多变化。 布局上的差异将影响基于规则的方法,因此需要加以考虑,这变得非常繁琐。 字体和字体大小的差异使得难以识别和提取信息。

为什么端到端深度学习管道更好?

标准方法的最大问题之一是缺乏概括性。 基于规则的方法不能一概而论,需要为任何新模板编写新规则。 同样,也需要考虑现有模板中的任何更改或变化。

深度学习方法将能够学习这些规则,并且能够轻松地在不同的布局中进行概括,只要我们将它们包含在训练数据集中即可。

深度学习和信息提取

在这里,我回顾了一些使用端到端深度学习方法的论文.

可爱

CUTIE:学习使用卷积通用文本信息提取器理解文档

本文提出 人力资源需求有限的基于学习的关键信息提取方法。 它结合了语义和文档中文本空间分布的信息。 他们提出的模型卷积通用文本信息提取器(CUTIE)将卷积神经网络应用于网格化文本,其中文本被嵌入为具有语义内涵的特征。

使用OCR和深度学习自动进行收据数字化

提出的模型, 解决以下关键信息提取问题

  • 首先用建议的方法创建网格文本 网格位置映射方法。 为了生成卷积神经网络的网格数据,OCR引擎对扫描的文档图像进行处理,以获取文本及其绝对/相对位置。 将文本从原始扫描的文档图像映射到目标网格,以便映射后的网格保留文本之间的原始空间关系,但更适合用作卷积神经网络的输入。
  • 然后,将CUTIE模型应用于网格文本。 丰富的语义信息是在卷积神经网络的最开始阶段通过单词嵌入层从网格文本中编码的。

CUTIE允许同时查看扫描的文档图像中文本的语义信息和空间信息,并且可以达到用于关键信息提取的最新技术水平。

CUTIE模型

他们有2个型号CUTIE-A和CUTIE-B。 提出的CUTIE-A是一种高容量卷积神经网络,可融合多分辨率特征而不会丢失高分辨率特征。 CUTIE-B是具有无规卷积的卷积网络,用于扩大视野,而无规空间金字塔池(ASPP)模块可捕获多尺度上下文。 在开始阶段,CUTIE-A和CUITE-B都通过单词嵌入层进行语义含义编码过程。

CUTIE的任务类似于语义分割任务。 与以像素分布的图像相比,映射的网格包含分散的数据点(文本标记)。 网格位置映射的键文本由于文档布局的类型不同而彼此接近或远离。 因此,合并多尺度上下文处理能力将使网络受益。

数据集

拟议的方法在SDARE数据集的ICDAR 2019鲁棒性阅读挑战中进行了评估,并且还在具有3种类型的扫描文档图像的自建数据集上进行了评估。

ICDAR 2019 SROIE数据集 使用包含1000个完整扫描的收据图像的文件。 每个收据图像包含大约四个关键文本字段,例如商品名称,单价,日期和总成本。 数据集中注释的文本主要由数字和英文字符组成。

自我构建的数据集包含4个带注释的扫描西班牙收据文件,其中包括出租车收据,餐饮娱乐(ME)收据和酒店收据,并具有484种不同的关键信息类别。

成果

使用平均精度(AP –并根据9类的每类精度)和软平均精度(softAP)来评估整体性能,在这些情况下,如果肯定的基本事实确定关键信息类别的预测是正确的即使最终预测中包含一些误报也可以正确预测。 AP和softAP的联合分析可更好地了解模型性能。

您可以在下表中查看结果。

使用OCR和深度学习自动进行收据数字化

VRD的GCN

图卷积用于从视觉丰富的文档中提取多峰信息

本文介绍了一种基于图卷积的模型,以结合Visually Rich文档(VRD)中呈现的文本和视觉信息。 图形嵌入经过训练可以总结文档中文本段的上下文,并进一步与文本嵌入结合以进行实体提取。

在本文中,他们将文档称为VRD,而我会坚持使用。

每个文档都被建模为文本段的图形,其中每个文本段都由该段的位置和其中的文本组成。 该图由代表文本段的节点和代表两个节点之间的视觉依存关系(例如相对形状和距离)的边组成。

使用OCR和深度学习自动进行收据数字化

通过图卷积产生的图嵌入总结了文档中文本段的上下文,并进一步与文本嵌入结合使用标准BiLSTM-CRF模型进行实体提取。

型号

该模型首先使用多层图卷积将文档中的每个文本段编码为图嵌入。 在给定其视觉和文本上下文的情况下,嵌入表示文本段中的信息。 视觉上下文是文档的布局以及各个段相对于其他段的相对位置。 文本上下文是整个文档中文本信息的集合; 该模型学习为来自相邻段的文本分配更高的权重。 然后,本文将图形嵌入与文本嵌入相结合,并应用标准的BiLSTM-CRF模型进行实体提取。

使用OCR和深度学习自动进行收据数字化

数据集

使用了两个真实世界的数据集。 它们是增值税发票(VATI)和国际采购收据(IPR)。 VATI包含3000张用户上传的图片,并具有16个实体。 示例实体是买方/卖方的名称,日期和税额。 发票为中文,由于是国家标准发票,因此具有固定的模板。

IPR是由1500个英文扫描的收据文件组成的数据集,其中有4个要精确的实体(发票编号,供应商名称,付款人名称和总金额)。 有146个收据模板。

成果

F1分数用于评估所有实验中模型的性能。 下表列出了thr 2个数据集的结果。

使用OCR和深度学习自动进行收据数字化

基线I将BiLSTM-CRF应用于每个文本段,其中每个文本段都是一个单独的句子。

基准II将标记模型应用于串联的文本段。

更快的RCNN + AED

收据识别的深度学习方法

本文提出了一种用于识别扫描收据的深度学习方法。 识别系统具有两个主要模块:基于Connectionist文本提议网络的文本检测和基于基于注意力的Encoder-Decoder的文本识别。 该系统在检测和识别任务方面取得了F71.9分数的1%。

文字检测

CTPN结构类似于Faster R-CNN,但增加了LSTM层。 网络模型主要由三部分组成:通过VGG16进行特征提取,双向LSTM和边界框回归

使用OCR和深度学习自动进行收据数字化

文字识别

AED用于识别文本行。 AED具有两个主要模块:用于从文本图像中提取特征的DenseNet;以及与注意力模型相结合的LSTM,用于预测输出文本。

使用OCR和深度学习自动进行收据数字化

数据集

使用SROIE 2019中的数据集。 他们将培训数据分为培训,验证和测试,并随机选择80%的收据进行培训,10%的收据进行验证以及其余用于测试。 得到500张用于培训的收据,63张用于验证的收据和63张用于测试的收据。

成果

对于文本检测,本文使用紧密度统一的交叉口(TIoU)进行文本识别,本文使用F1,Precision和Recall。

使用OCR和深度学习自动进行收据数字化

表I显示了在三种条件下的CTPN结果:原始图像上的CTPN; 预处理+ CTPN,预处理+ CTPN + OCR验证。 表2显示了AED网络的结果。

使用OCR和深度学习自动进行收据数字化

当然,还有一种更简单、更直观的方法来做到这一点。


需要一个健壮的 收据OCR 从收据中提取数据? 查看纳米网 收据OCR API!


带有纳米网的OCR

更新#1:我们刚刚发布了我们的 收据OCR 预训练模型。 前往 https://app.nanonets.com 并开始测试!

使用OCR和深度学习自动进行收据数字化

纳米网 OCR API 使您可以轻松构建OCR模型。 您不必担心图像预处理,也不必担心模板匹配或构建基于规则的引擎来提高OCR模型的准确性。

您可以上传数据,对其进行注释,设置模型以进行训练并等待通过基于浏览器的UI进行预测,而无需编写任何代码,也不必担心GPU或为深度学习模型找到合适的架构。 您还可以获取每个预测的JSON响应,以将其与您自己的系统集成,并基于最新的算法和强大的基础架构构建机器学习支持的应用程序。

使用GUI: https://app.nanonets.com/

您还可以按照以下步骤使用Nanonets-OCR API:

步骤1:克隆存储库,安装依赖项

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

第2步:获取免费的API密钥
从以下位置获取免费的API密钥 http://app.nanonets.com/#/keys

使用OCR和深度学习自动进行收据数字化

步骤3:将API密钥设置为环境变量

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

步骤4:建立新模型

python ./code/create-model.py

请注意: 这将生成下一步所需的MODEL_ID

步骤5:将模型ID添加为环境变量

export NANONETS_MODEL_ID=YOUR_MODEL_ID

请注意: 您将从上一步中获得YOUR_MODEL_ID

第6步:上传培训数据
培训数据位于 images (图像文件)和 annotations (图像文件的注释)

python ./code/upload-training.py

步骤7:训练模型
图片上传后,开始训练模型

python ./code/train-model.py

步骤8:获取模型状态
该模型需要约2个小时的训练时间。 一旦训练好模型,您将收到一封电子邮件。 同时,您检查模型的状态

python ./code/model-state.py

步骤9:进行预测
一旦模型被训练。 您可以使用模型进行预测

python ./code/prediction.py ./images/151.jpg

延伸阅读

更新:
‌ 添加了更多关于使用 OCR 和深度学习实现收据数字化自动化的最新进展的阅读材料。

时间戳记:

更多来自 人工智能与机器学习