Press "Enter" to skip to content

使用Transformer检测图像中的表格行和列

介绍

您是否曾经处理过非结构化数据,并考虑过一种方式来检测文档中表格的存在?以帮助您快速处理您的文档?在本文中,我们将不仅了解如何检测表格的存在,还将通过使用Transformer模型来识别这些表格的结构。这将由两个不同的模型实现。一个用于文档中的表格检测,另一个用于结构识别,可以识别表格中的行和列。

学习目标

  • 如何在图像中检测表格的行和列?
  • Table Transformers和Detection Transformer(DETR)的介绍
  • PubTables-1M数据集概述
  • 如何使用Table Transformer进行推理

使用Transformer检测图像中的表格行和列 四海 第1张

文档、文章和PDF文件是有价值的信息来源,通常包含传递关键数据的表格。从这些表格中高效提取信息可能会面临不同格式和表示之间的挑战。手动复制或重新创建这些表格可能耗时且繁琐。在PubTables-1M数据集上训练的Table Transformers解决了表格检测、结构识别和功能分析的问题。

本文是Data Science Blogathon的一部分。

如何实现的?

这是通过一种名为Table Transformer的Transformer模型实现的。它使用了一个名为PubTables-1M的大型注释数据集,可以检测文章中的文档或图像。该数据集包含约一百万个参数,并采用了一些措施来给模型带来最新的感觉。通过解决不完美注释、空间对齐问题和表格结构一致性等挑战,实现了高效性。与该模型一起发布的研究论文利用了Detection Transformer(DETR)模型,用于联合建模表格结构识别(TSR)和功能分析(FA)。因此,DETR模型是Table Transformer运行的骨干,由微软研究开发。让我们更详细地了解一下DETR。

DEtection TRansformer(DETR)

如前所述,DETR是DEtection TRansformer的缩写,包括使用编码器-解码器Transformer的卷积骨干,例如ResNet架构。这使得它有潜力进行目标检测任务。DETR提供了一种不需要复杂模型(如Faster R-CNN和Mask R-CNN)的方法,这些模型依赖于区域提议、非极大值抑制和锚点生成等复杂元素。它可以进行端到端的训练,通过其损失函数(称为二分图匹配损失)实现。通过在PubTables-1M上进行实验,验证了所有这些,并证明了规范数据在提高性能方面的重要性。

PubTables-1M数据集

PubTables-1M是表格提取领域的一个贡献。它由从科学文章中收集的表格集合制作而成。该数据集支持多种输入格式,并包含详细的标题和位置信息,用于表格建模策略,使其非常好用。PubTables-1M的一个显著特点是它专注于解决由于过度分割而导致的基本事实不一致,提高了注释的准确性。

来源:Smock et al. (2021)

使用PubTables-1M进行Table Transformer的训练实验证明了数据集的有效性。正如前面提到的,基于Transformer的目标检测方法,特别是DETR模型,在表格检测、结构识别和功能分析任务上表现出色。实验结果突出了规范数据在提高模型准确性和可靠性方面的有效性。

PubTables-1M数据集的规范化

PubTables-1M的一个关键方面是创新的规范化过程。它解决了基于过度分割的基本事实注释中可能存在的歧义问题。通过对表格的结构做出假设,规范化算法纠正了注释,使其与表格的逻辑组织相一致。这增强了数据集的可靠性,并对性能产生影响。

实现一个推理表格转换器

我们将使用Table Transformer来实现一个推理。我们首先从Hugging Face存储库中安装transformers库。您可以在这里找到本文的完整代码。或者https://github.com/inuwamobarak/detecting-tables-in-documents

!pip install -q git+https://github.com/huggingface/transformers.git

接下来,我们使用pip安装‘timm’,这是一个流行的模型、训练过程和工具库。

# 使用pip安装'timm'库
!pip install -q timm

接下来,我们可以加载我们想要运行推理的图像。我已经从我的Huggingface存储库中添加了一个自定义数据集。您可以使用它或根据您的数据进行调整。我在下面提供了这段代码和其他原始链接的GitHub存储库的链接。

# 导入所需的库
from huggingface_hub import hf_hub_download
from PIL import Image

# 从指定的Hugging Face存储库和位置下载文件
file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-30-54.png")

# 使用PIL库打开下载的图像并将其转换为RGB格式
image = Image.open(file_path).convert("RGB")

# 获取图像的原始宽度和高度
width, height = image.size

# 将图像的尺寸调整为原始尺寸的50%
resized_image = image.resize((int(width * 0.5), int(height * 0.5)))

使用Transformer检测图像中的表格行和列 四海 第3张

所以,我们将会检测上面图像中的表格,并识别行和列。

让我们做一些基本的预处理任务。

# 从Transformers库中导入DetrFeatureExtractor类
from transformers import DetrFeatureExtractor

# 创建DetrFeatureExtractor的实例
feature_extractor = DetrFeatureExtractor()

# 使用特征提取器对图像进行编码
# 'image'应该是之前获取的PIL图像对象
encoding = feature_extractor(image, return_tensors="pt")

# 获取编码字典的键
keys = encoding.keys()

现在,我们将从Microsoft on Huggingface加载表格转换器。

# 从transformers库中导入TableTransformerForObjectDetection类
from transformers import TableTransformerForObjectDetection

# 加载预训练的用于对象检测的表格转换器模型
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-detection")

import torch

# 在推理时禁用梯度计算
with torch.no_grad():
    # 将编码的图像通过模型进行推理
    # 'model'是之前加载的TableTransformerForObjectDetection模型
    # 'encoding'包含使用DetrFeatureExtractor获取的编码图像特征
    outputs = model(**encoding)

现在我们可以绘制结果。

import matplotlib.pyplot as plt

# 定义用于可视化的颜色
COLORS = [[0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125],
          [0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933]]

def plot_results(pil_img, scores, labels, boxes):
    # 创建一个用于可视化的图形
    plt.figure(figsize=(16, 10))
    
    # 显示PIL图像
    plt.imshow(pil_img)
    
    # 获取当前轴
    ax = plt.gca()
    
    # 为可视化重复多次COLORS列表
    colors = COLORS * 100
    
    # 遍历分数、标签、框和颜色进行可视化
    for score, label, (xmin, ymin, xmax, ymax), c in zip(scores.tolist(), labels.tolist(), boxes.tolist(), colors):
        # 为检测到的对象的边界框在图像上添加一个矩形
        ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,
                                   fill=False, color=c, linewidth=3))
        
        # 准备标签和分数的文本
        text = f'{model.config.id2label[label]}: {score:0.2f}'
        
        # 将标签和分数文本添加到图像中
        ax.text(xmin, ymin, text, fontsize=15,
                bbox=dict(facecolor='yellow', alpha=0.5))
    
    # 关闭轴
    plt.axis('off')
    
    # 显示可视化结果
    plt.show()

# 获取图像的原始宽度和高度
width, height = image.size

# 使用特征提取器对目标检测输出进行后处理
results = feature_extractor.post_process_object_detection(outputs, threshold=0.7, target_sizes=[(height, width)])[0]

# 绘制结果的可视化
plot_results(image, results['scores'], results['labels'], results['boxes'])
检测到的表格

所以,我们成功地检测到了表格,但尚未识别出行和列。让我们现在来做这件事。我们将加载另一个图像来实现这个目的。

# 导入必要的库
from huggingface_hub import hf_hub_download
from PIL import Image

# 从指定的Hugging Face仓库和位置下载图像文件
# 根据您的用例,使用以下任一'repo_id'行
file_path = hf_hub_download(repo_id="nielsr/example-pdf", repo_type="dataset", filename="example_table.png")
# file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-40-10.png")

# 使用PIL库打开下载的图像并将其转换为RGB格式
image = Image.open(file_path).convert("RGB")

# 获取图像的原始宽度和高度
width, height = image.size

# 将图像缩放到其原始尺寸的90%
resized_image = image.resize((int(width * 0.9), int(height * 0.9)))
用于识别的示例表格

现在,让我们还是准备上面的图像。

# 使用特征提取器对缩放后的图像进行编码
encoding = feature_extractor(image, return_tensors="pt")

# 获取编码字典的键
keys = encoding.keys()

接下来,我们可以像上面那样加载Transformer模型。

# 从transformers库导入TableTransformerForObjectDetection类
from transformers import TableTransformerForObjectDetection

# 加载预训练的Table Transformer模型用于表格结构识别
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-structure-recognition")

with torch.no_grad():
  outputs = model(**encoding)

现在我们可以可视化我们的结果。

# 创建一个目标尺寸列表以进行后处理
# 'image.size[::-1]'交换宽度和高度以匹配目标尺寸格式(高度,宽度)
target_sizes = [image.size[::-1]]

# 使用特征提取器对目标检测输出进行后处理
# 使用0.6的置信度阈值
results = feature_extractor.post_process_object_detection(outputs, threshold=0.6, target_sizes=target_sizes)[0]

# 绘制结果的可视化
plot_results(image, results['scores'], results['labels'], results['boxes'])
识别出的行和列

就是这样了。尝试使用您的表格并查看效果如何。请关注我的GitHub和社交媒体以获取更多有趣的带有Transformers的教程。如果您觉得这篇文章有用,请在下方留言。

结论

从非结构化信息中发现洞察力的可能性比以往任何时候都更加光明。表格检测的一个重要成功是PubTables-1M数据集的引入和规范化的概念。我们已经看到了表格提取和改变领域的创新解决方案。将规范化视为一种确保一致的基准真值注释的新方法,以解决过分分割的问题。将注释与表格的结构对齐将提高数据集的可靠性和准确性,为强大的模型性能铺平道路。

主要观点

  • PubTables-1M数据集通过提供一系列来自科学文章的注释表格,革新了表格提取。
  • 规范化的创新概念解决了基准真值不一致的挑战。
  • 基于Transformer的目标检测模型,尤其是Detection Transformer (DETR),在表格检测、结构识别和功能分析任务中表现出色。

常见问题

参考资料

  • GitHub 仓库:https://github.com/inuwamobarak/detecting-tables-in-documents
  • Smock, B., Pesala, R., & Abraham, R. (2021). PubTables-1M:面向非结构化文档的全面表格提取。ArXiv. /abs/2110.00061
  • https://arxiv.org/abs/2110.00061
  • Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020). 基于 Transformer 的端到端目标检测。ArXiv. /abs/2005.12872
  • https://huggingface.co/docs/transformers/model_doc/detr
  • https://huggingface.co/docs/transformers/model_doc/table-transformer
  • https://huggingface.co/microsoft/table-transformer-detection
  • https://huggingface.co/microsoft/table-transformer-structure-recognition

本文中展示的媒体内容不归 Analytics Vidhya 所有,仅由作者自行决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *