面包屑图标 当前位置: 首页
AI资讯
热点详情

再谈表格数据合成:GOT-OCR技术解析

AI热点日报
AI热点日报时间:2026-06-01
热点解读

基于LaTeX的表格数据合成流程,先搭建环境并渲染模板得到PDF,再利用自适应阈值化方法定位并截取表格。通过随机化字体与内容,可自动化生成多样化的表格数据,适用于数据增强及训练集扩充等场景。

谈到表格数据合成,尤其是基于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's 二值化:适合直方图有明显双峰的情况。
  • 三角形法二值化:擅长处理单峰直方图。
  • 双阈值化:用于处理特定像素值范围的二值化任务。

实际经验表明,自适应阈值化基本能满足需求。以下是代码示例:

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渲染失败如何处理?
  • 特殊字体无法渲染怎么解决?

等等。遇到问题动手调试,才能真正走通这条路子。

热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:再谈表格数据合成:GOT-OCR技术解析要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://www.53ai.com/news/neirongchuangzuo/2024102745732.html
ai 人工智能

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-06-01 09:38
天工AI生成播客提纲提示词的三种风格版本方法

通过角色、约束与结构模板强制分叉AI生成路径,可产出轻量社交、深度访谈、教学实践三种风格播客提纲,且需严格遵循版本参数、限制条件和输出格式,从而确保提纲风格多样且符合规范要求。

AI热点2026-06-01 09:38
2026年6月1日英伟达实时热点速递

1、美国封堵英伟达、AMD向海外中企出口人工智能芯片的漏洞 美国商务部近日出手,封堵了近一年来让中国AI企业通过海外子公司轻松获取先进芯片的漏洞。新指引明确:任何总部位于中国的实体,无论其芯片收货地设在马来西亚还是其他地方,想要采购英伟达、AMD等公司的高端AI芯片,都必须先通过许可证审批。 这个漏

AI热点2026-06-01 09:37
微信上线桌面AI小微助手 一键搜索电脑全部内容

微信发布PC端AI工具小微助手,通过对话方式实现本地文件、系统功能及Chrome书签的智能搜索,支持自然语言输入。内置翻译、剪贴板管理、JSON解析等实用工具,提供自定义快捷面板。圈子功能支持共享空间,可接入微信对话开放平台、混元及ChatGPT等外部大模型,支持定制开发。

AI热点2026-06-01 09:36
通义智文引领智能写作新风尚创作更高效精彩

通义智文是阿里云推出的免费阅读助手,基于通义大模型实现自动摘要、智能笔记、语义搜索与多格式支持。它针对网页、论文、图书等场景配置不同引擎,可生成全文概要与逐章导读,支持提问溯源,帮助用户高效获取信息。

延伸阅读