---
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配置 | CPU配置 | 加速技术组合 |
|---|---|---|---|
| 常规模式 | FP32精度 / 无TRT加速 | FP32精度 / 8线程 | PaddleInference |
| 高性能模式 | 选择先验精度类型和加速策略的最优组合 | FP32精度 / 8线程 | 选择先验最优后端(Paddle/OpenVINO/TRT等) |
paddle_static 推理引擎,请先按照[飞桨框架安装](../paddlepaddle_installation.md)完成 PaddlePaddle 安装。
如果选择 `transformers` 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下命令:
```bash
# 使用 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 环境,然后执行如下命令:
```bash
# 使用 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"`,未来将支持更多主流模型源;
您也可以将表格结构识别的模块中的模型推理集成到您的项目中。运行以下代码前,请您下载[示例图片](https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/table_recognition.jpg)到本地。
```python
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_installation.md)完成 PaddlePaddle 安装。
如果选择 `transformers` 作为推理引擎,请确保已配置 Transformers 环境,然后执行如下代码:
```python
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 环境,然后执行如下代码:
```python
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` 引擎,请参考后文 [推理引擎](#五推理引擎) 中的 [权重转换](#52-权重转换) 部分将模型由 `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': ['', '', '| ', ' | ', '|||
| ', ' | ', ' | ', ' | ', ' |
| ', ' | ', ' | ', ' | ', ' |
| ', ' | ', ' | ', ' | ', ' |
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|None |
None |
model_dir |
含义:模型存储路径。 | str|None |
None |
device |
含义:用于推理的设备。 说明: 例如: "cpu"、"gpu"、"npu"、"gpu:0"、"gpu:0,1"。如指定多个设备,将进行并行推理。 默认情况下,优先使用 GPU 0;若不可用则使用 CPU。 |
str|None |
None |
engine |
含义:推理引擎。 说明:支持 None(默认值)、paddle、paddle_static、paddle_dynamic、transformers、onnxruntime。保持为默认值 None 时,本地推理默认使用 paddle_static 引擎。详细说明、取值、兼容性规则与示例请参见 推理引擎与配置说明。 |
str|None |
None |
engine_config |
含义:推理引擎配置。 说明:推荐与 engine 搭配使用。详细字段、兼容性规则与示例请参见 推理引擎与配置说明。 |
dict|None |
None |
enable_hpi |
含义:是否启用高性能推理。 | bool |
False |
use_tensorrt |
含义:是否启用 Paddle Inference 的 TensorRT 子图引擎。 说明: 如果模型不支持通过 TensorRT 加速,即使设置了此标志,也不会使用加速。 对于 CUDA 11.8 版本的飞桨,兼容的 TensorRT 版本为 8.x(x>=6),建议安装 TensorRT 8.6.1.6。 |
bool |
False |
precision |
含义:当使用 Paddle Inference 的 TensorRT 子图引擎时设置的计算精度。 说明: 可选项: "fp32"、"fp16"。 |
str |
"fp32" |
enable_mkldnn |
含义:是否启用 MKL-DNN 加速推理。 说明: 如果 MKL-DNN 不可用或模型不支持通过 MKL-DNN 加速,即使设置了此标志,也不会使用加速。 |
bool |
True |
mkldnn_cache_capacity |
含义:MKL-DNN 缓存容量。 | int |
10 |
cpu_threads |
含义:在 CPU 上推理时使用的线程数量。 | int |
10 |
predict() 方法进行推理预测,该方法会返回一个结果列表。另外,本模块还提供了 predict_iter() 方法。两者在参数接受和结果返回方面是完全一致的,区别在于 predict_iter() 返回的是一个 generator,能够逐步处理和获取预测结果,适合处理大型数据集或希望节省内存的场景。可以根据实际需求选择使用这两种方法中的任意一种。predict() 方法参数有 input 和 batch_size,具体说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
input |
含义:待预测数据,支持多种输入类型,必填。 说明:
|
Python Var|str|list |
|
batch_size |
含义:批大小。 说明: 可设置为任意正整数。 |
int |
1 |
json文件的操作:
| 方法 | 方法说明 | 参数 | 参数类型 | 参数说明 | 默认值 |
|---|---|---|---|---|---|
print() |
打印结果到终端 | format_json |
bool |
是否对输出内容进行使用 JSON 缩进格式化 |
True |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 |
False |
||
save_to_json() |
将结果保存为json格式的文件 | save_path |
str |
保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致 | 无 |
indent |
int |
指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_json 为 True 时有效 |
4 | ||
ensure_ascii |
bool |
控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_json为True时有效 |
False |
| 属性 | 属性说明 |
|---|---|
json |
获取预测的json格式的结果 |
| 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 |