comments: true
表格结构识别模块使用教程
一、概述
表格结构识别是表格识别系统中的重要组成部分,能够将不可编辑表格图片转换为可编辑的表格形式(例如html)。表格结构识别的目标是对表格的行、列和单元格位置进行识别,该模块的性能直接影响到整个表格识别系统的准确性和效率。表格结构识别模块会输出表格区域的html代码,这些代码将作为输入传递给表格识别产线进行后续处理。
二、支持模型列表
推理耗时仅包含模型推理耗时,不包含前后处理耗时。表格中的“常规模式”耗时对应本地
paddle_static推理引擎。
| 模型 | 模型下载链接 | 精度(%) | GPU推理耗时(ms) [常规模式 / 高性能模式] |
CPU推理耗时(ms) [常规模式 / 高性能模式] |
模型存储大小(MB) | 介绍 |
|---|---|---|---|---|---|---|
| SLANet | 推理模型/训练模型 | 59.52 | 23.96 / 21.75 | - / 43.12 | 6.9 | SLANet 是百度飞桨视觉团队自研的表格结构识别模型。该模型通过采用 CPU 友好型轻量级骨干网络 PP-LCNet、高低层特征融合模块 CSP-PAN、结构与位置信息对齐的特征解码模块 SLA Head,大幅提升了表格结构识别的精度和推理速度。 |
| SLANet_plus | 推理模型/训练模型 | 63.69 | 23.43 / 22.16 | - / 41.80 | 6.9 | SLANet_plus 是百度飞桨视觉团队自研的表格结构识别模型 SLANet 的增强版。相较于 SLANet,SLANet_plus 对无线表、复杂表格的识别能力得到了大幅提升,并降低了模型对表格定位准确性的敏感度,即使表格定位出现偏移,也能够较准确地进行识别。 |
| SLANeXt_wired | 推理模型/训练模型 | 69.65 | 85.92 / 85.92 | - / 501.66 | 351 | SLANeXt 系列是百度飞桨视觉团队自研的新一代表格结构识别模型。相较于 SLANet 和 SLANet_plus,SLANeXt 专注于对表格结构进行识别,并且对有线表格(wired)和无线表格(wireless)的识别分别训练了专用的权重,对各类型表格的识别能力都得到了明显提高,特别是对有线表格的识别能力得到了大幅提升。 |
| SLANeXt_wireless | 推理模型/训练模型 |
测试环境说明:
- 性能测试环境
- 测试数据集:内部自建的高难度中文表格识别数据集。
- 硬件配置:
- GPU:NVIDIA Tesla T4
- CPU:Intel Xeon Gold 6271C @ 2.60GHz
- 软件环境:
- Ubuntu 20.04 / CUDA 11.8 / cuDNN 8.9 / TensorRT 8.6.1.6
- paddlepaddle-gpu 3.0.0 / paddleocr 3.0.3
- 推理模式说明
| 模式 | GPU配置 | CPU配置 | 加速技术组合 |
|---|---|---|---|
| 常规模式 | FP32精度 / 无TRT加速 | FP32精度 / 8线程 | PaddleInference |
| 高性能模式 | 选择先验精度类型和加速策略的最优组合 | FP32精度 / 8线程 | 选择先验最优后端(Paddle/OpenVINO/TRT等) |
三、快速开始
❗ 在快速开始前,请先安装 PaddleOCR 的 wheel 包,详细请参考 安装教程。
使用一行命令即可快速体验:
paddleocr table_structure_recognition -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/table_recognition.jpg
上述示例默认使用 paddle_static 推理引擎,请先按照飞桨框架安装完成 PaddlePaddle 安装。
如果选择 transformers 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下命令:
# 使用 transformers 引擎进行推理
paddleocr table_structure_recognition -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/table_recognition.jpg \
--engine transformers
如果选择 onnxruntime 作为推理引擎,请确保已配置 ONNX Runtime 环境,然后执行如下命令:
# 使用 onnxruntime 引擎进行推理
paddleocr table_structure_recognition -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/table_recognition.jpg \
--engine onnxruntime
在大多数场景下,默认的 paddle_static 推理引擎通常具备更好的推理性能,建议优先使用。
注:PaddleOCR 官方模型默认从 HuggingFace 获取,如运行环境访问 HuggingFace 不便,可通过环境变量修改模型源为 BOS:PADDLE_PDX_MODEL_SOURCE="BOS",未来将支持更多主流模型源;
您也可以将表格结构识别的模块中的模型推理集成到您的项目中。运行以下代码前,请您下载示例图片到本地。
from paddleocr import TableStructureRecognition
model = TableStructureRecognition(model_name="SLANet")
output = model.predict(input="table_recognition.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_json("./output/res.json")
上述示例默认使用 paddle_static 推理引擎,请先按照飞桨框架安装完成 PaddlePaddle 安装。
如果选择 transformers 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下代码:
from paddleocr import TableStructureRecognition
model = TableStructureRecognition(
model_name="SLANet",
engine="transformers",
)
output = model.predict(input="table_recognition.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_json("./output/res.json")
如果选择 onnxruntime 作为推理引擎,请确保已配置 ONNX Runtime 环境,然后执行如下代码:
from paddleocr import TableStructureRecognition
model = TableStructureRecognition(
model_name="SLANet",
engine="onnxruntime",
)
output = model.predict(input="table_recognition.jpg", batch_size=1)
for res in output:
res.print(json_format=False)
res.save_to_json("./output/res.json")
在大多数场景下,默认的 paddle_static 推理引擎通常具备更好的推理性能,建议优先使用。
训练后的模型如果想使用 paddle_dynamic 或 transformers 引擎,请参考后文 推理引擎 中的 权重转换 部分将模型由 pdparams 格式通过 PaddleX 转换为 safetensors 格式。
运行后,得到的结果为:
{'res': {'input_path': 'table_recognition.jpg', 'page_index': None, 'bbox': [[42, 2, 390, 2, 388, 27, 40, 26], [11, 35, 89, 35, 87, 63, 11, 63], [113, 34, 192, 34, 186, 64, 109, 64], [219, 33, 399, 33, 393, 62, 212, 62], [413, 33, 544, 33, 544, 64, 407, 64], [12, 67, 98, 68, 96, 93, 12, 93], [115, 66, 205, 66, 200, 91, 111, 91], [234, 65, 390, 65, 385, 92, 227, 92], [414, 66, 537, 67, 537, 95, 409, 95], [7, 97, 106, 97, 104, 128, 7, 128], [113, 96, 206, 95, 201, 127, 109, 127], [236, 96, 386, 96, 381, 128, 230, 128], [413, 96, 534, 95, 533, 127, 408, 127]], 'structure': ['<html>', '<body>', '<table>', '<tr>', '<td', ' colspan="4"', '>', '</td>', '</tr>', '<tr>', '<td></td>', '<td></td>', '<td></td>', '<td></td>', '</tr>', '<tr>', '<td></td>', '<td></td>', '<td></td>', '<td></td>', '</tr>', '<tr>', '<td></td>', '<td></td>', '<td></td>', '<td></td>', '</tr>', '</table>', '</body>', '</html>'], 'structure_score': 0.99948007}}
参数含义如下:
input_path:输入的待预测表格图像的路径page_index:如果输入是PDF文件,则表示当前是PDF的第几页,否则为Noneboxes:预测的表格单元格信息,一个列表,由预测的若干表格单元格坐标组成。特别地, SLANeXt 系列模型预测的表格单元格无效structure:预测的表格结构Html表达式,一个列表,由预测的若干Html关键字按顺序组成structure_score:预测表格结构的置信度
TableStructureRecognition实例化表格结构识别模型(此处以SLANet为例),具体说明如下:参数 参数说明 参数类型 默认值 model_name含义:模型名称。
说明: 如果设置为None,则使用PP-LCNet_x1_0_table_cls。str|NoneNonemodel_dir含义:模型存储路径。 str|NoneNonedevice含义:用于推理的设备。
说明: 例如:"cpu"、"gpu"、"npu"、"gpu:0"、"gpu:0,1"。
如指定多个设备,将进行并行推理。
默认情况下,优先使用 GPU 0;若不可用则使用 CPU。str|NoneNoneengine含义:推理引擎。
说明:支持None(默认值)、paddle、paddle_static、paddle_dynamic、transformers、onnxruntime。保持为默认值None时,本地推理默认使用paddle_static引擎。详细说明、取值、兼容性规则与示例请参见 推理引擎与配置说明。str|NoneNoneengine_config含义:推理引擎配置。
说明:推荐与engine搭配使用。详细字段、兼容性规则与示例请参见 推理引擎与配置说明。dict|NoneNoneenable_hpi含义:是否启用高性能推理。 boolFalseuse_tensorrt含义:是否启用 Paddle Inference 的 TensorRT 子图引擎。
说明: 如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。
对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。
boolFalseprecision含义:当使用 Paddle Inference 的 TensorRT 子图引擎时设置的计算精度。
说明: 可选项:"fp32"、"fp16"。str"fp32"enable_mkldnn含义:是否启用 MKL-DNN 加速推理。
说明: 如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。
boolTruemkldnn_cache_capacity含义:MKL-DNN 缓存容量。 int10cpu_threads含义:在 CPU 上推理时使用的线程数量。 int10- 调用表格结构识别模型的
predict()方法进行推理预测,该方法会返回一个结果列表。另外,本模块还提供了predict_iter()方法。两者在参数接受和结果返回方面是完全一致的,区别在于predict_iter()返回的是一个generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。可以根据实际需求选择使用这两种方法中的任意一种。predict()方法参数有input和batch_size,具体说明如下:
参数 参数说明 参数类型 默认值 input含义:待预测数据,支持多种输入类型,必填。
说明:- Python Var:如
numpy.ndarray表示的图像数据 - str:如图像文件或者PDF文件的本地路径:
/root/data/img.jpg;如URL链接,如图像文件或PDF文件的网络URL:示例;如本地目录,该目录下需包含待预测图像,如本地路径:/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径) - list:列表元素需为上述类型数据,如
[numpy.ndarray, numpy.ndarray],["/root/data/img1.jpg", "/root/data/img2.jpg"],["/root/data1", "/root/data2"]
Python Var|str|listbatch_size含义:批大小。
说明: 可设置为任意正整数。int1 - 对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为
json文件的操作:
方法 方法说明 参数 参数类型 参数说明 默认值 print()打印结果到终端 format_jsonbool是否对输出内容进行使用 JSON缩进格式化Trueindentint指定缩进级别,以美化输出的 JSON数据,使其更具可读性,仅当format_json为True时有效4 ensure_asciibool控制是否将非 ASCII字符转义为Unicode。设置为True时,所有非ASCII字符将被转义;False则保留原始字符,仅当format_json为True时有效Falsesave_to_json()将结果保存为json格式的文件 save_pathstr保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 无 indentint指定缩进级别,以美化输出的 JSON数据,使其更具可读性,仅当format_json为True时有效4 ensure_asciibool控制是否将非 ASCII字符转义为Unicode。设置为True时,所有非ASCII字符将被转义;False则保留原始字符,仅当format_json为True时有效False- 此外,也支持通过属性获取结果,具体如下:
属性 属性说明 json获取预测的 json格式的结果四、二次开发
如果以上模型在您的场景上效果仍然不理想,您可以尝试以下步骤进行二次开发,此处以训练
SLANet_plus举例,其他模型替换对应配置文件即可。首先,您需要准备表格结构识别的数据集,可以参考表格结构识别 Demo 数据的格式准备,准备好后,即可按照以下步骤进行模型训练和导出,导出后,可以将模型快速集成到上述 API 中。此处以表格结构识别 Demo 数据示例。在训练模型之前,请确保已经按照安装文档安装了 PaddleOCR 所需要的依赖。4.1 数据集、预训练模型准备
4.1.1 准备数据集
# 下载示例数据集 wget https://paddle-model-ecology.bj.bcebos.com/paddlex/data/table_rec_dataset_examples.tar tar -xf table_rec_dataset_examples.tar4.1.2 下载预训练模型
# 下载 SLANet_plus 预训练模型 wget https://paddle-model-ecology.bj.bcebos.com/paddlex/official_pretrained_model/SLANet_plus_pretrained.pdparams4.2 模型训练
PaddleOCR 对代码进行了模块化,训练
SLANet_plus识别模型时需要使用SLANet_plus的配置文件。训练命令如下:
#单卡训练 (默认训练方式) python3 tools/train.py -c configs/table/SLANet_plus.yml \ -o Global.pretrained_model=./SLANet_plus_pretrained.pdparams Train.dataset.data_dir=./table_rec_dataset_examples \ Train.dataset.label_file_list='[./table_rec_dataset_examples/train.txt]' \ Eval.dataset.data_dir=./table_rec_dataset_examples \ Eval.dataset.label_file_list='[./table_rec_dataset_examples/val.txt]' #多卡训练,通过--gpus参数指定卡号 python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py \ -c configs/table/SLANet_plus.yml \ -o Global.pretrained_model=./SLANet_plus_pretrained.pdparams -o Global.pretrained_model=./PP-OCRv5_server_det_pretrained.pdparams \ Train.dataset.data_dir=./table_rec_dataset_examples \ Train.dataset.label_file_list='[./table_rec_dataset_examples/train.txt]' \ Eval.dataset.data_dir=./table_rec_dataset_examples \ Eval.dataset.label_file_list='[./table_rec_dataset_examples/val.txt]'4.3 模型评估
您可以评估已经训练好的权重,如,
output/xxx/xxx.pdparams,使用如下命令进行评估:# 注意将pretrained_model的路径设置为本地路径。若使用自行训练保存的模型,请注意修改路径和文件名为{path/to/weights}/{model_name}。 # demo 测试集评估 python3 tools/eval.py -c configs/table/SLANet_plus.yml -o \ Global.pretrained_model=output/xxx/xxx.pdparams Eval.dataset.data_dir=./table_rec_dataset_examples \ Eval.dataset.label_file_list='[./table_rec_dataset_examples/val.txt]'4.4 模型导出
python3 tools/export_model.py -c configs/table/SLANet_plus.yml -o \ Global.pretrained_model=output/xxx/xxx.pdparams \ Global.save_inference_dir="./SLANet_plus_infer/"导出模型后,静态图模型会存放于当前目录的
./SLANet_plus_infer/中,在该目录下,您将看到如下文件:./SLANet_plus_infer/ ├── inference.json ├── inference.pdiparams ├── inference.yml至此,二次开发完成,该静态图模型可以直接集成到 PaddleOCR 的 API 中。
训练后的模型如果想使用
paddle_dynamic或transformers引擎,请参考后文 推理引擎 中的 权重转换 部分将模型由pdparams格式通过 PaddleX 转换为safetensors格式。五、推理引擎 {#五推理引擎}
关于推理引擎的详细说明、取值、兼容性规则与示例请参见 推理引擎与配置说明。
5.1 速度数据
model engine Preprocessing (ms) Inference (ms) PostProcessing (ms) End-to-End (ms) SLANet onnxruntime 1.42 22.02 0.22 23.81 SLANet_plus onnxruntime 1.40 21.64 0.22 23.42 SLANeXt_wired paddle_static 1.50 30.91 0.23 32.77 paddle_dynamic 1.71 57.44 0.91 60.23 transformers 4.03 45.14 0.74 51.12 onnxruntime 1.60 30.96 0.25 32.99 SLANeXt_wireless paddle_static 1.67 30.49 0.22 32.51 paddle_dynamic 1.68 57.24 0.96 60.05 transformers 4.30 45.51 0.75 51.76 onnxruntime 1.62 31.01 0.26 33.06 测试环境说明:
- 测试数据:示例图片
- 硬件配置:
- GPU:NVIDIA A100 40G
- CPU:Intel(R) Xeon(R) Gold 6248 CPU @ 2.50GHz
- 软件环境:
- Ubuntu 22.04 / CUDA 12.6 / cuDNN 9.5
- paddlepaddle-gpu 3.2.1 / paddleocr 3.5 / transformers 5.4.0 / torch 2.10 / onnxruntime-gpu 1.23.2
5.2 权重转换 {#52-权重转换}
使用推理引擎时,系统会自动下载官方预训练模型。若需使用自训练模型配合
paddle_dynamic或transformers引擎,请参考 PaddleX 表格结构识别模块权重转换 部分,将pdparams格式通过 PaddleX 转换为safetensors格式,即可无缝集成到 PaddleOCR 的 API 中进行推理。若需使用自训练模型配合onnxruntime引擎,请参考PaddleX 获取 ONNX 模型获取onnx模型,即可无缝集成到 PaddleOCR 的 API 中进行推理。六、FAQ
- 调用表格结构识别模型的