随着当前技术时代大量应用、工具和在线平台的蓬勃发展,所收集的数据量与日新月之分急剧增加。为了高效处理和访问这些巨大的数据,有必要开发有价值的信息提取工具。信息提取字段中需要注意的子区域之一是从表格窗体中提取和访问数据。
表提取 (TE)是检测和分解文档中的表信息的任务。
为了用一种微妙的方式解释这一点,假设您有很多文件,你会使用表,并且使用相同的文件,你想操纵数据。通常,您可以手动复制它们(在纸上)或将它们加载到 Excel 纸张中。但是,通过表提取,您只要将表作为图片发送到计算机,它就提取所有信息并将它们堆叠到整洁的文档中。这节省了充足的时间,而且不那么错误。
如上一节所述,表经常用于以干净格式表示数据。我们可以经常看到它们跨越多个领域,从跨表构建数据来组织我们的工作,到存储公司的巨大资产。有很多组织每天都要处理数百万个表。为了便于手动完成所有事情的艰巨任务,我们需要采用更快的技术。让我们讨论一些表可能是必不可少的用例:
来源: 帕特里克·托马索, 未飞溅
表提取过程也可用于小型个人用例。有时,我们会在手机上捕获文档,然后将它们复制到我们的计算机上。我们可以直接捕获文档,并保存为自定义模板中的可编辑格式,而不是使用此过程。以下是一些有关我们如何将表提取放入个人日常操作中的用例 -
将文档扫描到电话:我们经常在手机上捕获重要表的图像并保存它们,但通过表提取技术,我们可以捕获表的图像,并直接将它们存储在表格格式中,无论是 Excel 或 google 工作表。这样,我们不需要搜索图像或将表内容复制到任何新文件,相反,我们可以直接使用导入的表并开始处理提取的信息。
到 HTML 的文档: 在网页中,我们发现使用表格显示的大量信息。它们帮助我们与数据进行比较,并给我们一个有组织的快速记录数字。通过使用表提取过程,我们可以扫描 PDF 文档或 JPG/PNG 图像,并直接将信息加载到自定义自设计的表格式中。我们可以进一步编写脚本,以基于现有表添加其他表,从而使信息数字化。这有助于我们编辑内容并加快存储过程。
全球有几个行业在文书工作和文件方面大有作为,尤其是在银行和保险行业。从存储客户的详细信息到照顾客户需求,表被广泛使用。此信息再次作为文档(硬拷贝)传递到不同的分支机构进行审批,有时,沟通不畅会导致错误,同时从表中抓取信息。相反,在这里使用自动化,使我们的生活轻松得多。一旦捕获和批准初始数据,我们可以直接将这些文件扫描到表中,并进一步处理数字化数据。更不用说减少时间消耗和故障了,我们可以通知客户处理信息的时间和位置。因此,这确保了数据的可靠性,并简化了我们处理操作的方式。现在,让我们看看其他可能的用例:
质量控制:质量控制是顶级行业提供的核心服务之一。它通常是在内部和利益相关者完成的。作为其中的一部分,从消费者那里收集了大量反馈表单,以提取有关所提供服务的反馈。在工业部门,他们使用表格记下每日清单和笔记,了解生产线的组成情况。所有这些都可以在单个位置轻松记录,使用表提取。
资产跟踪:在制造业中,人们使用硬编码表来跟踪钢铁、钢铁、塑料等制造实体。每个制造物料都标有唯一的编号,其中它们使用表格来跟踪每天制造和交付的物品。自动化有助于在错位或数据不一致方面节省大量时间和资产。
有几个商业行业在 Excel 工作表和脱机窗体上运行。但是,在一个时间点,很难通过这些表格和表格进行搜索。如果我们手动输入这些表,则非常耗时,并且输入错误数据的可能性也会很高。因此,表提取是解决业务用例的更好选择,因为下面的情况很少。
发票自动化:有许多小规模和大规模的行业,其发票仍然以表格格式生成。这些没有提供适当担保的税务报表。为了克服这些障碍,我们可以使用表提取将所有发票转换为可编辑格式,从而将它们升级到较新版本。
表单自动化:在线表单通过帮助企业收集他们需要的信息并同时将其连接到其工作流中内置的其他软件平台,从而中断了这种尝试性且真实的方法。除了减少对手动数据输入和后续电子邮件需求外,表提取还可以消除打印、邮寄、存储、组织和销毁传统纸张替代品的成本。
心中有 OCR 问题吗?想要数字化发票、PDF 或车牌?前往纳米网,免费构建OCR模型!
深度学习是基于人工神经网络的机器学习方法的更广泛系列的一部分。
神经网络是一个框架,通过模仿人脑运作方式的过程来识别给定数据中的基本关系。它们具有不同的人工层,通过这些图层数据通过这些图层,从而了解要素。有不同的体系结构,如卷积 NN、循环 NN、自动编码器、生成对抗 NN 来处理不同类型的数据。这些非常复杂,但描绘了高性能,以实时解决问题。现在,让我们来研究一下使用神经网络在表提取领域进行的研究,并且,让我们简要地回顾一下它们。
说明:TableNet:用于端到端表检测的深度学习模型,以及从扫描的文档图像中提取表格数据
简介:TableNet 是一个现代深度学习架构,由 TCS 研究年的团队在 2019 年提出。主要动机是通过手机或相机从扫描的表格中提取信息。
他们提出了一个解决方案,其中包括准确检测图像中的表格区域,然后检测和提取检测到表的行和列中的信息。
数据集:使用的数据集是马莫特。它有2000页PDF格式,这是收集与相应的地面真相。这还包括中文页面。链接 - http://www.icst.pku.edu.cn/cpdp/sjzy/index.htm
架构:该体系结构基于 Long 等人,这是用于语义分段的编码器解码器模型。相同的编码器/解码器网络用作用于表提取的 FCN 体系结构。使用 Tesseract OCR 对图像进行预处理和修改。
该模型分两个阶段派生,将输入主题为深度学习技术。在第一阶段,他们使用了预先训练的VGG-19网络的重量。它们已用 1x1 卷积层替换了已使用的 VGG 网络的完全连接层。所有卷积层后跟 ReLU 激活和概率 0.8 的辍学层。他们称第二阶段为解码网络,由两个分支组成。这是根据直觉,列区域是表区域的子集。因此,单个编码网络可以使用表和列区域的特征以更好的精度筛选出活动区域。第一个网络的输出将分发到两个分支。在第一个分支中,应用两个卷积操作,并升级最终要素图以满足原始图像尺寸。在用于检测列的另一个分支中,有一个附加的卷积层,具有 ReLU 激活函数,还有一个与前面提到的相同的辍学概率的辍学层。要素贴图在 (1x1) 卷积层后使用小步卷积进行向上采样。下面是体系结构的图像:
TableNet 的体系结构
输出:使用模型处理文档后,将生成表和列的掩码。这些蒙版用于从图像中筛选出表及其列区域。现在使用 Tesseract OCR,从分段区域中提取信息。下面是显示从表中生成和稍后提取的蒙版的图像:
他们还提出了与ICDAR进行微调的相同型号,其性能优于原始型号。微调车型的召回、精度和 F1 得分分别是 0.9628、0.9697 和 0.9662。原始模型的记录指标为 0.9621、0.9547、0.9583。现在,让我们深入探讨一个架构。
论文:DeepDeSRT:文档图像中表检测和结构识别的深度学习
简介:DeepDeSRT 是一个神经网络框架,用于检测和理解文档或图像中的表。它有两个解决方案,如标题中提及:
建议的模型完全基于数据,不需要文档或图像的启发式或元数据。培训的一个主要优点是它们不使用大型培训数据集,而是使用转移学习和域适应的概念来检测表检测和表结构识别。
数据集:使用的数据集是 ICDAR 2013 表竞争数据集,包含 67 个文档,总页数为 238 页。
建筑:
输出:
表检测的输出
结构识别的输出 [6]
评估结果表明,DeepDeSRT在台表检测和结构识别方面优于最先进的方法,在2015年之前,在表检测和结构识别方面分别达到96.77%和91.44%的F1测量。
论文:使用图形神经网络重新思考表识别
简介:在这项研究中,来自国家人工智能中心(NCAI)深度学习实验室的作者提出了用于从表中提取信息的图形神经网络。他们认为图形网络是这些问题更自然的选择,并进一步探讨了两个基于梯度的图形神经网络。
本建议的模型结合了两者的好处,卷积神经网络用于视觉特征提取和处理问题结构的图形网络。
数据集:作者提出了一个新的大型综合生成数据集,共生成 0.50 万个表,分为四个类别。
架构:他们使用浅卷积网络生成各自的卷积特征。如果输出要素的空间尺寸与输入图像不同,它们会收集根据输入和输出尺寸之间的比率线性缩小的位置,并将其发送到具有两个图形网络(称为 DGCNN 和 GravNet)的交互网络。图形网络的参数与原始 CNN 相同。最后,他们使用运行时对采样对内部使用蒙特卡罗算法提取的内容进行分类。以下是输出:
输出:
图形神经网络生成的输出
以下是网络为四个类别的网络生成的表格精度数字,如"数据集"部分所示:
论文:使用条件生成对抗网络和遗传算法从文档中提取表
简介:在这项研究中,作者使用自上而下的方法,而不是使用自下而上的方法(将行集成到单元格、行或列中)方法。
在此方法中,他们使用生成对抗网络将表映像映射到标准化的"骨架"表窗体。此骨架表表示没有表内容的近似行和列边框。其次,它们使用遗传算法优化的距离测量将候选潜在表结构的渲染拟合到骨架结构中。
数据集:作者使用自己的数据集,该数据集包含 4000 个表。
架构:提议的模型由两部分组成。在第一部分中,输入图像使用条件生成对抗神经网络抽象为骨架表。GAN 再次有两个网络,即生成随机样本和鉴别器的生成器,它告诉生成的图像是假的还是原始的。生成器 G 是一个编码器解码器网络,其中输入图像通过一系列逐渐向下采样层,直到进程反转的瓶颈层。为了向解码层传递足够的信息,使用具有跳过连接的 U-Net 体系结构,并通过串联在层 i 和 n 之间添加跳过连接,其中 n 是图层总数,而 i 是编码器中的图层编号。PatchGAN 体系结构用于鉴别器 D。这会以补丁的规模惩罚输出图像结构。它们将输出生成为骨架表。
在第二部分中,他们利用每个候选数据与骨架之间的距离的度量,优化候选潜在数据结构与生成的骨架图像的拟合。这是提取图像中文本的一种方法。下面是描述体系结构的图像:
方法的一般示意图
输出:通过比较 - 行和列号、左上角位置、行高度和列宽度来评估估计的表结构
遗传算法在从表中提取信息时,在列上给出了95.5%的准确率和96.7%的准确度。
需要数字化单据、收据或发票,但懒得编码?前往纳米网,免费构建OCR模型!
在本节中,我们将学习如何使用深度学习和 OpenCV 从表中提取信息的过程。你可以把这个解释作为介绍,但是,建立最先进的模型将需要大量的经验和实践。这将有助于您了解我们如何用各种可能的方法和算法培训计算机的基本原理。
为了更准确地理解问题,我们定义了一些基本术语,这些术语将在本文中使用:
我们将使用传统的计算机视觉技术从扫描的表格中提取信息。这是我们的管道;我们最初使用普通摄像机捕获数据(我们需要从其中提取信息的表),然后使用计算机视觉,我们将尝试查找边框、边缘和单元格。我们将使用不同的滤镜和轮廓,我们将突出显示表的核心特征。
我们需要一张桌子的图像。我们可以在手机上捕获此图像或使用任何现有图像。下面是代码片段,
file = r’table.png’
table_image_contour = cv2.imread(file, 0)
table_image = cv2.imread(file)
在这里,我们加载了相同的图像图像两个变量,因为我们将在将检测到的table_image_contour绘制到加载的图像时使用模型。以下是我们在程序中使用的表的图像:
表的图像
我们将采用一种称为反向图像阈值的技术,该技术可增强给定图像中存在的数据。
ret, thresh_value = cv2.threshold(
table_image_contour, 180, 255, cv2.THRESH_BINARY_INV)
另一个重要的预处理步骤是图像扩张。扩展是应用于二进制图像(黑白)的简单数学操作,它逐渐放大前景像素区域的边界(通常为白色像素)。
kernel = np.ones((5,5),np.uint8)
dilated_value = cv2.dilate(thresh_value,kernel,iterations = 1)
在 OpenCV 中,我们使用该方法,findContours获取当前图像中的轮廓。此方法采用三个参数,第一个参数是扩张图像(用于生成扩张图像的图像为 table_image_contour - findContours 方法仅支持二进制图像),第二个参数是cv2。RETR_TREE,它告诉我们使用等高线检索模式,第三个是cv2。CHAIN_APPROX_SIMPLE轮廓近似模式。findContours 解压缩了两个值,因此我们将再添加一个名为层次结构的变量。当图像嵌套时,轮廓散发出相互依赖性。为了表示这种关系,使用层次结构。
contours, hierarchy = cv2.findContours(
dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
等高线标记数据在图像中的确切存在。现在,我们迭代我们在上一步中计算的等高线列表,并使用方法 cv2.iningRect 计算矩形框的坐标,如在原始图像中观察到的。在上次迭代中,我们将这些框放在原始图像上table_image方法 cv2.rectangle() 。
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
# bounding the images
if y < 50:
table_image = cv2.rectangle(table_image, (x, y), (x + w, y + h), (0, 0, 255), 1)
这是我们的最后一步。在这里,我们使用名为Window的方法来呈现我们的表,其中嵌入了提取的内容和轮廓。下面是代码段:
plt.imshow(table_image)
plt.show()
cv2.namedWindow('detecttable', cv2.WINDOW_NORMAL)
输出
在上面的代码段中将 y 的值更改为 300,这将是您的输出:
提取表后,可以通过 tesseract OCR 引擎运行每个轮廓裁剪,教程可在这里找到。一旦我们拥有每个文本的框,我们就可以根据它们的 x 和 y 坐标对它们进行聚类,以派生它们所属的对应行和列。
除此之外,还可以使用 PDFMiner 将 pdf 文档转换为 HTML 文件,我们可以使用正则表达式分析这些文件,以便最终获取表。下面是如何做到这一点。
要从较小的文档中提取信息,需要配置深度学习模型或编写计算机视觉算法。相反,我们可以使用 Python 中的正则表达式从PDF 文档中提取文本。此外,请记住,此技术对图像不起作用。我们只能用它来从 HTML 文件或 PDF 文档中提取信息。这是因为,当您使用正则表达式时,您需要将内容与源和提取信息相匹配。使用图像时,您将无法匹配文本,正则表达式将失败。现在,让我们使用简单的 PDF 文档,并从中的表中提取信息。下图如下:
在第一步,我们将 PDF 加载到我们的程序中。完成后,我们将 PDF 转换为 HTML,以便可以直接使用正则表达式,从而从表中提取内容。为此,我们使用的模块是pdfminer。这有助于从 PDF 中读取内容并将其转换为 HTML 文件。
下面是代码段:
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.converter import HTMLConverter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
import re
def convert_pdf_to_html(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = HTMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0 #is for all
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
return str
代码学分:泽夫罗斯
我们导入了很多模块,包括正则表达式和 PDF 相关库。在方法convert_pdf_to_html中,我们发送需要转换为 HTML 文件的 PDF 文件的路径。该方法的输出将是 HTML 字符串,如下所示:
'Changing Echoes\n
7632 Pool Station Road\n
Angels Camp, CA 95222\n
(209) 785-3667\n
Intake: (800) 633-7066\n
SA s TX DT BU s RS RL OP PH s CO CJ \n
s SF PI s AH SP\n
正则表达式是用于模式匹配的最棘手、最酷的编程技术之一。这些应用程序被广泛用于多个应用程序,例如,用于代码格式、Web 刮擦和验证目的。在开始从 HTML 表中提取内容之前,让我们快速了解有关正则表达式的一些内容。
此库提供各种内置方法来匹配和搜索模式。下面是几个:
import re
# Match the pattern in the string
re.match(pattern, string)
# Search for a pattern in a string
re.search(pattern, string)
# Finds all the pattern in a string
re.findall(pattern, string)
# Splits string based on the occurrence of pattern
re.split(pattern, string, [maxsplit=0]
# Search for the pattern and replace it with the given string
re.sub(pattern, replace, string)
通常在正则表达式中看到的字符/表达式包括:
现在,为了找出 HTML 中的特定模式,我们使用正则表达式,然后相应地编写模式。我们首先拆分数据,以便地址块根据程序名称(天使营地、APPLE VALLEY 等)被隔离成单独的块:
pattern = '(?<=)(.*?)(?=
稍后,我们会找到始终遵循相同模式的程序名称、城市、州和 zip(文本、逗号、两位大写字母、5 个数字(或 5 个数字连字符四个数字) - 这些出现在我们认为为输入的 PDF 文件中。检查以下代码段:
# To identify the program name
programname = re.search('^(?!
).*(?=\\n)', programinfo.group(0))
# since some programs have odd characters in the name we need to escape
programname = re.escape(programname)
citystatezip =re.search('(?<=>)([a-zA-Z\s]+, [a-zA-Z\s]{2} \d{5,10})(?=\\n)', programinfo.group(0))
mainphone =re.search('(?<=
)\(\d{3}\) \d{3}-\d{4}x{0,1}\d{0,}(?=\\n)', programinfo.group(0))
altphones = re.findall('(?<=
)[a-zA-Z\s]+: \(\d{3}\) \d{3}-\d{4}x{0,1}\d{0,}(?=\\n)(?=\\n)', programinfo.group(0))
这是一个简单的示例,说明我们如何使用正则表达式从 PDF 文件中提取信息。提取所有必需的信息后,我们将这些数据加载到 CSV 文件中。
def createDirectory(instring, outpath, split_program_pattern):
i = 1
with open(outpath, 'wb') as csvfile:
filewriter = csv.writer(csvfile, delimiter=',' , quotechar='"', quoting=csv.QUOTE_MINIMAL)
# write the header row
filewriter.writerow(['programname', 'address', 'addressxtra1', 'addressxtra2', 'city', 'state', 'zip', 'phone', 'altphone', 'codes'])
# cycle through the programs
for programinfo in re.finditer(split_program_pattern, instring, re.DOTALL):
print i
i=i+1
# pull out the pieces
programname = getresult(re.search('^(?!
).*(?=\\n)', programinfo.group(0)))
programname = re.escape(programname) # some facilities have odd characters in the name
因此,这是一个简单的示例,说明如何将提取的 HTML 推送到 CSV 文件中。首先,我们创建一个 CSV 文件,查找我们所有的属性,然后一个一个推送到各自的列中。下面是一个截图:
使用正则表达式从表中提取的项目的屏幕截图
有时,上述技术似乎很复杂,如果所有表都是嵌套和复杂的,则对程序员构成挑战。在这里,选择 CV 或深度学习模型可以节省大量时间。让我们看看哪些缺点和挑战阻碍了这些传统方法的使用。
在本节中,我们将深入了解表提取过程可能失败的原因,并进一步了解如何使用深度学习中诞生的现代方法克服这些障碍。不过, 这个过程不是蛋糕步道。原因是表通常不保持不变。它们具有不同的结构来表示数据,表内的数据可以是具有各种格式样式(字体样式、颜色、字体大小和高度)的多语言语言。因此,要构建一个强大的模型,人们应该意识到所有这些挑战。通常,此过程包括三个步骤:表检测、提取和转换。让我们一个个确定所有阶段中的问题:
在此阶段中,我们确定给定输入中表的确切存在。输入可以是任何格式,如图像、PDF/Word 文档,有时还有视频。我们使用不同的技术和算法来检测表,无论是按行还是按坐标。在某些情况下,我们可能会遇到完全没有边界的表,我们需要选择不同的方法。除了这些,还有一些其他的挑战:
这是标识表后提取信息的阶段。关于内容的结构以及表中存在的内容,有很多因素。因此,在构建算法之前了解所有挑战非常重要。
最后一个阶段包括将表中提取的信息转换为在 Excel 中或使用其他软件将其编译为可编辑文档。让我们了解一些挑战。
这些是我们使用传统技术在表提取过程中面临的挑战。现在,让我们看看如何克服这些与深度学习的帮助下。它正广泛地在各部门进行研究。
在这篇文章中,我们详细回顾了从表中提取信息。我们已经看到,现代技术(如深度学习和计算机视觉)如何通过构建强大的算法来输出准确结果,实现平凡任务的自动化。在初始部分中,我们了解了表提取在促进个人、行业和业务部门任务方面的作用,并回顾了从 PDF/HTML 提取表、表单自动化、发票自动化等的用例。我们使用计算机视觉对算法进行编码,使用阈值、扩张和等高线检测技术查找表中信息的位置。我们已经讨论了在使用传统技术时在表检测、提取和转换过程中可能面临的挑战,并陈述了深度学习如何帮助我们克服这些问题。最后,我们回顾了一些神经网络体系结构,并了解了它们根据给定的训练数据实现表提取的方法。
Nanonets 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 密钥
,从您那里获取http://app.nanonets.com/#/keys
第 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
"中等"屏幕有助于更正和进入流程,将手动审阅者的工作减少近 90%,将组织的成本降低 50%。
功能包括
所有字段都构建成易于使用的 GUI,允许用户利用 OCR 技术,并协助使其在运行时变得更好,而无需键入任何代码或了解技术的工作原理。