GOT-OCR表格数据合成深度评测:效果与速度对比

2026-06-18阅读 0热度 0
ai 人工智能

表格数据合成,特别是基于LaTeX的渲染管线,原理上并不复杂,但几个关键难点必须攻克。本文以GOT-OCR为入口,详细拆解完整流程。

首先需要搭建正确的运行环境,否则后续操作无法执行。

再谈表格数据合成-GOT-OCR

基础效果复现

准备工作并不复杂,使用以下LaTeX模板即可。本文仅合成表格数据,因此模板保持精简。

documentclass[10pt]{article}
usepackage[top=.5in,bottom=1in,left=.5in,right=.5in]{geometry}

usepackage[UTF8]{ctex}
usepackage[pagebackref=true,breaklinks=true,colorlinks,bookmarks=false]{hyperref}
usepackage{amsmath,amsfonts,mathrsfs,amssymb}
% 设置中文字体
usepackage{multirow}
renewcommand{normalsize}{fontsize{6pt}{6pt}selectfont}
pagestyle{empty} % 去掉页码
setCJKmainfont{SimSun}[BoldFont=KaiTi, ItalicFont=SimHei]
begin{document}
begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
hline
& & multicolumn{3}{|c|}{textbf{参考情景}} & multicolumn{3}{|c|}{textbf{情景1}} & multicolumn{3}{|c|}{textbf{情景2}} & multicolumn{3}{|c|}{textbf{情景3}} & multicolumn{3}{|c|}{textbf{情景4}} \
hline
品种 & G & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} \
hline
& 1 & 0.86 & 0.81 & 0.53 & 0.73 & 0.80 & 0.22 & 0.69 & 0.80 & 0.15 & 0.70 & 0.78 & 0.26 & 0.72 & 0.76 & 0.31 \
cline{2-17}
& 2 & 0.64 & 0.69 & 0.56 & 0.57 & 0.65 & 0.20 & 0.46 & 0.69 & 0.19 & 0.59 & 0.69 & 0.27 & 0.54 & 0.65 & 0.22 \
cline{2-17}
& 3 & 0.48 & 0.63 & 0.57 & 0.48 & 0.50 & 0.23 & 0.39 & 0.63 & 0.20 & 0.47 & 0.61 & 0.21 & 0.47 & 0.61 & 0.22 \
cline{2-17}
& 4 & 0.37 & 0.59 & 0.60 & 0.42 & 0.52 & 0.24 & 0.33 & 0.57 & 0.21 & 0.34 & 0.54 & 0.18 & 0.40 & 0.58 & 0.24 \
cline{2-17}
& 5 & 0.31 & 0.56 & 0.61 & 0.36 & 0.47 & 0.23 & 0.25 & 0.52 & 0.20 & 0.28 & 0.48 & 0.20 & 0.32 & 0.52 & 0.26 \
hline
& & multicolumn{3}{|c|}{textbf{参考情景}} & multicolumn{3}{|c|}{textbf{情景1}} & multicolumn{3}{|c|}{textbf{情景2}} & multicolumn{3}{|c|}{textbf{情景3}} & multicolumn{3}{|c|}{textbf{情景4}} \
hline
品种 & G & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} \
hline
& 1 & 0.85 & 0.77 & 0.47 & 0.87 & 0.81 & 0.56 & 0.74 & 0.81 & 0.13 & 0.88 & 0.85 & 0.60 & 0.72 & 0.82 & 0.19 \
cline{2-17}
& 2 & 0.64 & 0.65 & 0.43 & 0.60 & 0.64 & 0.55 & 0.55 & 0.68 & 0.16 & 0.71 & 0.76 & 0.59 & 0.54 & 0.69 & 0.18 \
cline{2-17}
& 3 & 0.50 & 0.58 & 0.49 & 0.42 & 0.59 & 0.55 & 0.45 & 0.59 & 0.18 & 0.59 & 0.70 & 0.63 & 0.40 & 0.62 & 0.16 \
cline{2-17}
& 4 & 0.38 & 0.58 & 0.53 & 0.37 & 0.56 & 0.54 & 0.37 & 0.54 & 0.19 & 0.49 & 0.65 & 0.68 & 0.36 & 0.56 & 0.15 \
cline{2-17}
& 5 & 0.30 & 0.55 & 0.56 & 0.24 & 0.54 & 0.58 & 0.32 & 0.49 & 0.18 & 0.35 & 0.60 & 0.68 & 0.28 & 0.48 & 0.14 \
hline
end{tabular}
end{document}

将以上代码保存为tmp.tex,然后执行以下命令:

lualatex -output-directory=./tmp -interaction=nonstopmode  --shell-escape tmp_copy.tex

即可获得渲染生成的PDF文件,效果类似下图:

关键问题解析

在继续之前,先思考以下几个问题,你可以尝试自行设计解决方案:

  • 问题 1:表格多样性具体包含哪些维度?如何通过渲染过程获取这些多样性特征?
  • 问题 2:PDF渲染完成后,如何精确定位表格区域并截取出来?
  • 问题 3:整个渲染流程能否实现全自动化处理?

接下来,本文逐一深入解答这三个核心问题。

表格多样性

表格多样性的常见维度包括:

  • 表格边框样式的多样性;
  • 表格数据内容的多样性;
  • 表格字体的多样性;
  • 表格布局形状的多样性;
  • 表格背景与文字颜色的多样性;

其中,表格边框、数据内容、布局形状的多样性主要依赖于原始LaTeX文本的生成策略。可参考“表格数据合成—GOT_OCR数据合成”部分,核心思路是利用大语言模型生成不同格式的表格数据。

表格字体与颜色的多样性则需要熟悉LaTeX语法。以上代码中setCJKmainfont{SimSun}[BoldFont=KaiTi, ItalicFont=SimHei]是设置字体的关键指令。实现字体多样性的方法很简单:在系统中安装多种字体,然后在代码中随机指定即可。

颜色方面,如果仅在文档场景下使用,可以暂不处理。训练阶段通过将图像灰度化即可忽略颜色差异。

PDF表格获取

最直接的做法是将PDF转换为图像,然后使用二值化算法提取表格区域。OpenCV提供了多种二值化方案,例如:

  • 简单阈值化:适用于背景均匀的简单场景。
  • 自适应阈值化:能有效处理光照不均匀的图像。
  • Otsu二值化:适合直方图呈现明显双峰分布的情况。
  • 三角形法二值化:在单峰直方图场景中表现优秀。
  • 双阈值化:用于限定特定像素值范围的二值化处理。

实际测试表明,自适应阈值化可以满足绝大多数需求。以下为代码示例:

import fitz  # PyMuPDF
import numpy as np
import matplotlib.pyplot as plt
import cv2

def pdf_to_images_with_bbox(pdf_path):
# 打开PDF文件
pdf_document = fitz.open(pdf_path)

for page_num in range(len(pdf_document)):
# 获取当前页
page = pdf_document.load_page(page_num)

# 将页面转换为PIL图像
pix = page.get_pixmap(dpi=288)
img = np.frombuffer(buffer=pix.samples, dtype=np.uint8).reshape((pix.height, pix.width, 3))

image = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

# 应用自适应阈值化
max_value = 255
adaptive_method = cv2.ADAPTIVE_THRESH_MEAN_C # 或 cv2.ADAPTIVE_THRESH_GAUSSIAN_C
block_size = 11
C = 2
binary_image = cv2.adaptiveThreshold(image, max_value, adaptive_method, cv2.THRESH_BINARY, block_size, C)
print(binary_image.shape)
y = np.sum(255 - binary_image, axis=-1)
x = np.sum(255 - binary_image, axis=0)
x = np.where(x>=1)[0]
y = np.where(y >= 1)[0]
x_min, x_max = x[0], x[-1]
y_min, y_max = y[0], y[-1]
print([x_min, y_min, y_min, y_max])
cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0,0, 255), 3)
plt.imshow(img)
plt.show()
# 示例用法
pdf_path = "./tmp.pdf"
pdf_to_images_with_bbox(pdf_path)

注意:截取表格时,建议在四个方向随机外扩一定像素。紧贴表格边缘截图通常会影响后续识别效果。

如何实现自动化生成

理解以上原理后,自动化生成便可以顺利实现。将LaTeX代码拆分为三个部分:

第一部分:固定模板

documentclass[10pt]{article}
usepackage[top=.5in,bottom=1in,left=.5in,right=.5in]{geometry}

usepackage[UTF8]{ctex}
usepackage[pagebackref=true,breaklinks=true,colorlinks,bookmarks=false]{hyperref}
usepackage{amsmath,amsfonts,mathrsfs,amssymb}
% 设置中文字体
usepackage{multirow}
renewcommand{normalsize}{fontsize{6pt}{6pt}selectfont}
pagestyle{empty} % 去掉页码
字体大小可以通过图像后处理时调整DPI来控制,因此这部分内容可以直接固定。

第二部分:可变参数

setCJKmainfont{SimSun}[BoldFont=KaiTi, ItalicFont=SimHei]

这里仅展示了字体设置的全局变量。如果熟悉LaTeX,可以将所有可变参数集中于此。为了与Python代码配合,可以按以下方式改写:

fonts = ["字体1","字体2","字体3",..., "字体n"]
temp = f"\setCJKmainfont{{{font1}}}[BoldFont={font2}, ItalicFont={font3}]"
set_font = temp.format(font1=random.choice(fonts),
font2=random.choice(fonts),
font3=random.choice(fonts),)

这样set_font便具备了随机性。

第三部分:表格多样性

temp = f"""\begin{{document}}
{tabular}
\end{{document}}
"""
tabular_text = r"""
begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}
hline
& & multicolumn{3}{|c|}{textbf{参考情景}} & multicolumn{3}{|c|}{textbf{情景1}} & multicolumn{3}{|c|}{textbf{情景2}} & multicolumn{3}{|c|}{textbf{情景3}} & multicolumn{3}{|c|}{textbf{情景4}} \
hline
品种 & G & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} \
hline
& 1 & 0.86 & 0.81 & 0.53 & 0.73 & 0.80 & 0.22 & 0.69 & 0.80 & 0.15 & 0.70 & 0.78 & 0.26 & 0.72 & 0.76 & 0.31 \
cline{2-17}
& 2 & 0.64 & 0.69 & 0.56 & 0.57 & 0.65 & 0.20 & 0.46 & 0.69 & 0.19 & 0.59 & 0.69 & 0.27 & 0.54 & 0.65 & 0.22 \
cline{2-17}
& 3 & 0.48 & 0.63 & 0.57 & 0.48 & 0.50 & 0.23 & 0.39 & 0.63 & 0.20 & 0.47 & 0.61 & 0.21 & 0.47 & 0.61 & 0.22 \
cline{2-17}
& 4 & 0.37 & 0.59 & 0.60 & 0.42 & 0.52 & 0.24 & 0.33 & 0.57 & 0.21 & 0.34 & 0.54 & 0.18 & 0.40 & 0.58 & 0.24 \
cline{2-17}
& 5 & 0.31 & 0.56 & 0.61 & 0.36 & 0.47 & 0.23 & 0.25 & 0.52 & 0.20 & 0.28 & 0.48 & 0.20 & 0.32 & 0.52 & 0.26 \
hline
& & multicolumn{3}{|c|}{textbf{参考情景}} & multicolumn{3}{|c|}{textbf{情景1}} & multicolumn{3}{|c|}{textbf{情景2}} & multicolumn{3}{|c|}{textbf{情景3}} & multicolumn{3}{|c|}{textbf{情景4}} \
hline
品种 & G & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} & textbf{BV} & textbf{Add} & textbf{Dom} \
hline
& 1 & 0.85 & 0.77 & 0.47 & 0.87 & 0.81 & 0.56 & 0.74 & 0.81 & 0.13 & 0.88 & 0.85 & 0.60 & 0.72 & 0.82 & 0.19 \
cline{2-17}
& 2 & 0.64 & 0.65 & 0.43 & 0.60 & 0.64 & 0.55 & 0.55 & 0.68 & 0.16 & 0.71 & 0.76 & 0.59 & 0.54 & 0.69 & 0.18 \
cline{2-17}
& 3 & 0.50 & 0.58 & 0.49 & 0.42 & 0.59 & 0.55 & 0.45 & 0.59 & 0.18 & 0.59 & 0.70 & 0.63 & 0.40 & 0.62 & 0.16 \
cline{2-17}
& 4 & 0.38 & 0.58 & 0.53 & 0.37 & 0.56 & 0.54 & 0.37 & 0.54 & 0.19 & 0.49 & 0.65 & 0.68 & 0.36 & 0.56 & 0.15 \
cline{2-17}
& 5 & 0.30 & 0.55 & 0.56 & 0.24 & 0.54 & 0.58 & 0.32 & 0.49 & 0.18 & 0.35 & 0.60 & 0.68 & 0.28 & 0.48 & 0.14 \
hline
end{tabular}
"""

table_text = temp.format(tabular=tabular_text)

将以上三个部分拼接:第一部分 + 第二部分 + 第三部分,即可获得一个完整的可渲染LaTeX文档。

总结

以上是自动生成多样化表格数据集的基础流程。实际渲染过程中仍有许多细节需要自行调试,例如:

  • 渲染的表格超出PDF页面边界该如何处理?
  • PDF渲染失败时的排查与修复方法?
  • 特殊字体无法正常渲染的解决方案?

面对这类问题,需要实际动手调整参数与逻辑,才能真正打通整个生成流程。

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策