跳转至

通用表格识别产线v2使用教程

1. 通用表格识别产线v2介绍

表格识别是一种自动从文档或图像中识别和提取表格内容及其结构的技术,广泛应用于数据录入、信息检索和文档分析等领域。通过使用计算机视觉和机器学习算法,表格识别能够将复杂的表格信息转换为可编辑的格式,方便用户进一步处理和分析数据。

通用表格识别产线v2用于解决表格识别任务,对图片中的表格进行识别,并以HTML格式输出。与通用表格识别产线不同,本产线引入了表格分类和表格单元格检测两个模块,并将其与表格结构识别模块串联以完成表格识别任务。基于本产线,可实现对表格的精准预测,使用场景覆盖通用、制造、金融、交通等各个领域。本产线同时提供了灵活的服务化部署方式,支持在多种硬件上使用多种编程语言调用。不仅如此,本产线也提供了二次开发的能力,您可以基于本产线在您自己的数据集上训练调优,训练后的模型也可以无缝集成。

通用表格识别产线v2中包含必选的表格结构识别模块、表格分类模块、表格单元格定位模块、文本检测模块和文本识别模块,以及可选的版面区域检测模块、文档图像方向分类模块和文本图像矫正模块

如果您更注重模型的精度,请选择精度较高的模型;如果您更在意模型的推理速度,请选择推理速度较快的模型;如果您关注模型的存储大小,请选择存储体积较小的模型。

👉模型列表详情

表格识别模块模型:

模型模型下载链接 精度(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小 (M) 介绍
SLANeXt_wired 推理模型/训练模型 69.65 -- -- 351M SLANeXt 系列是百度飞桨视觉团队自研的新一代表格结构识别模型。相较于 SLANet 和 SLANet_plus,SLANeXt 专注于对表格结构进行识别,并且对有线表格(wired)和无线表格(wireless)的识别分别训练了专用的权重,对各类型表格的识别能力都得到了明显提高,特别是对有线表格的识别能力得到了大幅提升。
SLANeXt_wireless 推理模型/训练模型

表格分类模块模型:

模型模型下载链接 Top1 Acc(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小 (M)
PP-LCNet_x1_0_table_cls推理模型/训练模型 94.2 2.35 / 0.47 4.03 / 1.35 6.6M

表格单元格检测模块模型:

模型模型下载链接 mAP(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小 (M) 介绍
RT-DETR-L_wired_table_cell_det 推理模型/训练模型 82.7 35.00 / 10.45 495.51 / 495.51 124M RT-DETR 是第一个实时的端到端目标检测模型。百度飞桨视觉团队基于 RT-DETR-L 作为基础模型,在自建表格单元格检测数据集上完成预训练,实现了对有线表格、无线表格均有较好性能的表格单元格检测。
RT-DETR-L_wireless_table_cell_det 推理模型/训练模型

文本检测模块模型:

模型模型下载链接 检测Hmean(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PP-OCRv4_server_det推理模型/训练模型 82.69 83.34 / 80.91 442.58 / 442.58 109 PP-OCRv4 的服务端文本检测模型,精度更高,适合在性能较好的服务器上部署
PP-OCRv4_mobile_det推理模型/训练模型 77.79 8.79 / 3.13 51.00 / 28.58 4.7 PP-OCRv4 的移动端文本检测模型,效率更高,适合在端侧设备部署

文本识别模块模型:

模型模型下载链接 识别 Avg Accuracy(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PP-OCRv4_mobile_rec推理模型/训练模型 78.20 4.82 / 4.82 16.74 / 4.64 10.6 M PP-OCRv4是百度飞桨视觉团队自研的文本识别模型PP-OCRv3的下一个版本,通过引入数据增强方案、GTC-NRTR指导分支等策略,在模型推理速度不变的情况下,进一步提升了文本识别精度。该模型提供了服务端(server)和移动端(mobile)两个不同版本,来满足不同场景下的工业需求。
PP-OCRv4_server_rec 推理模型/训练模型 79.20 6.58 / 6.58 33.17 / 33.17 71.2 M
模型模型下载链接 识别 Avg Accuracy(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
ch_SVTRv2_rec推理模型/训练模型 68.81 8.08 / 8.08 50.17 / 42.50 73.9 M SVTRv2 是一种由复旦大学视觉与学习实验室(FVL)的OpenOCR团队研发的服务端文本识别模型,其在PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务中荣获一等奖,A榜端到端识别精度相比PP-OCRv4提升6%。
模型模型下载链接 识别 Avg Accuracy(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
ch_RepSVTR_rec推理模型/训练模型 65.07 5.93 / 5.93 20.73 / 7.32 22.1 M RepSVTR 文本识别模型是一种基于SVTRv2 的移动端文本识别模型,其在PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务中荣获一等奖,B榜端到端识别精度相比PP-OCRv4提升2.5%,推理速度持平。
模型模型下载链接 mAP(0.5)(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PP-DocLayout-L推理模型/训练模型 90.4 34.6244 / 10.3945 510.57 / - 123.76 M 基于RT-DETR-L在包含中英文论文、杂志、合同、书本、试卷和研报等场景的自建数据集训练的高精度版面区域定位模型
PP-DocLayout-M推理模型/训练模型 75.2 13.3259 / 4.8685 44.0680 / 44.0680 22.578 基于PicoDet-L在包含中英文论文、杂志、合同、书本、试卷和研报等场景的自建数据集训练的精度效率平衡的版面区域定位模型
PP-DocLayout-S推理模型/训练模型 70.9 8.3008 / 2.3794 10.0623 / 9.9296 4.834 基于PicoDet-S在中英文论文、杂志、合同、书本、试卷和研报等场景上自建数据集训练的高效率版面区域定位模型
> ❗ 以上列出的是版面检测模块重点支持的3个核心模型,该模块总共支持11个全量模型,包含多个预定义了不同类别的模型,完整的模型列表如下: * 表格版面检测模型
模型模型下载链接 mAP(0.5)(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PicoDet_layout_1x_table推理模型/训练模型 97.5 8.02 / 3.09 23.70 / 20.41 7.4 M 基于PicoDet-1x在自建数据集训练的高效率版面区域定位模型,可定位表格这1类区域
* 3类版面检测模型,包含表格、图像、印章
模型模型下载链接 mAP(0.5)(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PicoDet-S_layout_3cls推理模型/训练模型 88.2 8.99 / 2.22 16.11 / 8.73 4.8 基于PicoDet-S轻量模型在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型
PicoDet-L_layout_3cls推理模型/训练模型 89.0 13.05 / 4.50 41.30 / 41.30 22.6 基于PicoDet-L在中英文论文、杂志和研报等场景上自建数据集训练的效率精度均衡版面区域定位模型
RT-DETR-H_layout_3cls推理模型/训练模型 95.8 114.93 / 27.71 947.56 / 947.56 470.1 基于RT-DETR-H在中英文论文、杂志和研报等场景上自建数据集训练的高精度版面区域定位模型
* 5类英文文档区域检测模型,包含文字、标题、表格、图片以及列表
模型模型下载链接 mAP(0.5)(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PicoDet_layout_1x推理模型/训练模型 97.8 9.03 / 3.10 25.82 / 20.70 7.4 基于PicoDet-1x在PubLayNet数据集训练的高效率英文文档版面区域定位模型
* 17类区域检测模型,包含17个版面常见类别,分别是:段落标题、图片、文本、数字、摘要、内容、图表标题、公式、表格、表格标题、参考文献、文档标题、脚注、页眉、算法、页脚、印章
模型模型下载链接 mAP(0.5)(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PicoDet-S_layout_17cls推理模型/训练模型 87.4 9.11 / 2.12 15.42 / 9.12 4.8 基于PicoDet-S轻量模型在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型
PicoDet-L_layout_17cls推理模型/训练模型 89.0 13.50 / 4.69 43.32 / 43.32 22.6 基于PicoDet-L在中英文论文、杂志和研报等场景上自建数据集训练的效率精度均衡版面区域定位模型
RT-DETR-H_layout_17cls推理模型/训练模型 98.3 115.29 / 104.09 995.27 / 995.27 470.2 基于RT-DETR-H在中英文论文、杂志和研报等场景上自建数据集训练的高精度版面区域定位模型

文本图像矫正模块模型(可选):

模型模型下载链接 MS-SSIM (%) 模型存储大小(M) 介绍
UVDoc推理模型/训练模型 54.40 30.3 M 高精度文本图像矫正模型

文档图像方向分类模块模型(可选):

模型模型下载链接 Top-1 Acc(%) GPU推理耗时(ms)
[常规模式 / 高性能模式]
CPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(M) 介绍
PP-LCNet_x1_0_doc_ori推理模型/训练模型 99.06 2.31 / 0.43 3.37 / 1.27 7 基于PP-LCNet_x1_0的文档图像分类模型,含有四个类别,即0度,90度,180度,270度
**测试环境说明:** - **性能测试环境** - **测试数据集** - 文档图像方向分类模型:PaddleX 自建的数据集,覆盖证件和文档等多个场景,包含 1000 张图片。 - 版面区域检测模型:PaddleOCR 自建的版面区域检测数据集,包含中英文论文、杂志、合同、书本、试卷和研报等常见的 500 张文档类型图片。 - 表格版面检测模型:PaddleOCR 自建的版面表格区域检测数据集,包含中英文 7835 张带有表格的论文文档类型图片。 - 3类版面检测模型:PaddleOCR 自建的版面区域检测数据集,包含中英文论文、杂志和研报等常见的 1154 张文档类型图片。 - 5类英文文档区域检测模型:[PubLayNet](https://developer.ibm.com/exchanges/data/all/publaynet) 的评估数据集,包含英文>文档的 11245 张文图片。 - 17类区域检测模型:PaddleOCR 自建的版面区域检测数据集,包含中英文论文、杂志和研报等常见的 892 张文档类型图片。 - 表格结构识别模型:PaddleX 内部自建高难度中文表格识别数据集。 - 表格单元格检测模型:PaddleX 内部自建评测集。 - 表格分类模型:PaddleX 内部自建评测集。 - 文本检测模型:PaddleOCR 自建的中文数据集,覆盖街景、网图、文档、手写多个场景,其中检测包含 500 张图片。 - 中文识别模型: PaddleOCR 自建的中文数据集,覆盖街景、网图、文档、手写多个场景,其中文本识别包含 1.1w 张图片。 - ch_SVTRv2_rec:PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务A榜评估集。 - ch_RepSVTR_rec:PaddleOCR算法模型挑战赛 - 赛题一:OCR端到端识别任务B榜评估集。 - 英文识别模型:PaddleX 自建的英文数据集。 - 多语言识别模型:PaddleX 自建的多语种数据集。 - **硬件配置**: - GPU:NVIDIA Tesla T4 - CPU:Intel Xeon Gold 6271C @ 2.60GHz - 其他环境:Ubuntu 20.04 / cuDNN 8.6 / TensorRT 8.5.2.2 - **推理模式说明** | 模式 | GPU配置 | CPU配置 | 加速技术组合 | |-------------|----------------------------------|------------------|---------------------------------------------| | 常规模式 | FP32精度 / 无TRT加速 | FP32精度 / 8线程 | PaddleInference | | 高性能模式 | 选择先验精度类型和加速策略的最优组合 | FP32精度 / 8线程 | 选择先验最优后端(Paddle/OpenVINO/TRT等) |

2. 快速开始

PaddleX 所提供的模型产线均可以快速体验效果,你可以在本地使用命令行或 Python 体验通用表格识别产线v2的效果。

2.1 在线体验

暂不支持在线体验。

2.2 本地体验

在本地使用通用表格识别产线v2前,请确保您已经按照PaddleX本地安装教程完成了PaddleX的wheel包安装。

2.1 命令行方式体验

一行命令即可快速体验表格识别产线效果,使用 测试文件,并将 --input 替换为本地路径,进行预测

paddlex --pipeline table_recognition_v2 \
        --input table_recognition.jpg \
        --save_path ./output \
        --device gpu:0

相关的参数说明可以参考2.2 Python脚本方式集成中的参数说明。

👉 运行后,得到的结果为:(点击展开)
{'res': {'input_path': 'table_recognition.jpg', 'model_settings': {'use_doc_preprocessor': False, 'use_layout_detection': True, 'use_ocr_model': True}, 'layout_det_res': {'input_path': None, 'page_index': None, 'boxes': [{'cls_id': 0, 'label': 'Table', 'score': 0.9922188520431519, 'coordinate': [3.0127392, 0.14648987, 547.5102, 127.72023]}]}, 'overall_ocr_res': {'input_path': None, 'page_index': None, 'model_settings': {'use_doc_preprocessor': False, 'use_textline_orientation': False}, 'dt_polys': [array([[234,   6],
       [316,   6],
       [316,  25],
       [234,  25]], dtype=int16), array([[38, 39],
       [73, 39],
       [73, 57],
       [38, 57]], dtype=int16), array([[122,  32],
       [201,  32],
       [201,  58],
       [122,  58]], dtype=int16), array([[227,  34],
       [346,  34],
       [346,  57],
       [227,  57]], dtype=int16), array([[351,  34],
       [391,  34],
       [391,  58],
       [351,  58]], dtype=int16), array([[417,  35],
       [534,  35],
       [534,  58],
       [417,  58]], dtype=int16), array([[34, 70],
       [78, 70],
       [78, 90],
       [34, 90]], dtype=int16), array([[287,  70],
       [328,  70],
       [328,  90],
       [287,  90]], dtype=int16), array([[454,  69],
       [496,  69],
       [496,  90],
       [454,  90]], dtype=int16), array([[ 17, 101],
       [ 95, 101],
       [ 95, 124],
       [ 17, 124]], dtype=int16), array([[144, 101],
       [178, 101],
       [178, 122],
       [144, 122]], dtype=int16), array([[278, 101],
       [338, 101],
       [338, 124],
       [278, 124]], dtype=int16), array([[448, 101],
       [503, 101],
       [503, 121],
       [448, 121]], dtype=int16)], 'text_det_params': {'limit_side_len': 960, 'limit_type': 'max', 'thresh': 0.3, 'box_thresh': 0.6, 'unclip_ratio': 2.0}, 'text_type': 'general', 'textline_orientation_angles': [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], 'text_rec_score_thresh': 0, 'rec_texts': ['CRuncover', 'Dres', '连续工作3', '取出来放在网上', '没想', '江、整江等八大', 'Abstr', 'rSrivi', '$709.', 'cludingGiv', '2.72', 'Ingcubic', '$744.78'], 'rec_scores': [0.9951260685920715, 0.9943379759788513, 0.9968608021736145, 0.9978817105293274, 0.9985721111297607, 0.9616036415100098, 0.9977153539657593, 0.987593948841095, 0.9906861186027527, 0.9959743618965149, 0.9970152378082275, 0.9977849721908569, 0.9984450936317444], 'rec_polys': [array([[234,   6],
       [316,   6],
       [316,  25],
       [234,  25]], dtype=int16), array([[38, 39],
       [73, 39],
       [73, 57],
       [38, 57]], dtype=int16), array([[122,  32],
       [201,  32],
       [201,  58],
       [122,  58]], dtype=int16), array([[227,  34],
       [346,  34],
       [346,  57],
       [227,  57]], dtype=int16), array([[351,  34],
       [391,  34],
       [391,  58],
       [351,  58]], dtype=int16), array([[417,  35],
       [534,  35],
       [534,  58],
       [417,  58]], dtype=int16), array([[34, 70],
       [78, 70],
       [78, 90],
       [34, 90]], dtype=int16), array([[287,  70],
       [328,  70],
       [328,  90],
       [287,  90]], dtype=int16), array([[454,  69],
       [496,  69],
       [496,  90],
       [454,  90]], dtype=int16), array([[ 17, 101],
       [ 95, 101],
       [ 95, 124],
       [ 17, 124]], dtype=int16), array([[144, 101],
       [178, 101],
       [178, 122],
       [144, 122]], dtype=int16), array([[278, 101],
       [338, 101],
       [338, 124],
       [278, 124]], dtype=int16), array([[448, 101],
       [503, 101],
       [503, 121],
       [448, 121]], dtype=int16)], 'rec_boxes': array([[234,   6, 316,  25],
       [ 38,  39,  73,  57],
       [122,  32, 201,  58],
       [227,  34, 346,  57],
       [351,  34, 391,  58],
       [417,  35, 534,  58],
       [ 34,  70,  78,  90],
       [287,  70, 328,  90],
       [454,  69, 496,  90],
       [ 17, 101,  95, 124],
       [144, 101, 178, 122],
       [278, 101, 338, 124],
       [448, 101, 503, 121]], dtype=int16)}, 'table_res_list': [{'cell_box_list': [array([3.18822289e+00, 1.46489874e-01, 5.46996138e+02, 3.08782365e+01]), array([  3.21032453,  31.1510637 , 110.20750237,  65.14108063]), array([110.18174553,  31.13076188, 213.00813103,  65.02860047]), array([212.96108818,  31.09959008, 404.19618034,  64.99535157]), array([404.08112907,  31.18304802, 547.00864983,  65.0847223 ]), array([  3.21772957,  65.0738733 , 110.33685875,  96.07921387]), array([110.23703575,  65.02486207, 213.08839226,  96.01378419]), array([213.06095695,  64.96230103, 404.28425407,  95.97141816]), array([404.23704338,  65.04879548, 547.01273918,  96.03654267]), array([  3.22793937,  96.08334137, 110.38572502, 127.08698823]), array([110.40586662,  96.10539795, 213.19943047, 127.07002045]), array([213.12627983,  96.0539148 , 404.42686272, 127.02842499]), array([404.33042717,  96.07251526, 547.01273918, 126.45088746])], 'pred_html': '<html><body><table><tr><td colspan="4">CRuncover</td></tr><tr><td>Dres</td><td>连续工作3</td><td>取出来放在网上 没想</td><td>江、整江等八大</td></tr><tr><td>Abstr</td><td></td><td>rSrivi</td><td>$709.</td></tr><tr><td>cludingGiv</td><td>2.72</td><td>Ingcubic</td><td>$744.78</td></tr></table></body></html>', 'table_ocr_pred': {'rec_polys': [array([[234,   6],
       [316,   6],
       [316,  25],
       [234,  25]], dtype=int16), array([[38, 39],
       [73, 39],
       [73, 57],
       [38, 57]], dtype=int16), array([[122,  32],
       [201,  32],
       [201,  58],
       [122,  58]], dtype=int16), array([[227,  34],
       [346,  34],
       [346,  57],
       [227,  57]], dtype=int16), array([[351,  34],
       [391,  34],
       [391,  58],
       [351,  58]], dtype=int16), array([[417,  35],
       [534,  35],
       [534,  58],
       [417,  58]], dtype=int16), array([[34, 70],
       [78, 70],
       [78, 90],
       [34, 90]], dtype=int16), array([[287,  70],
       [328,  70],
       [328,  90],
       [287,  90]], dtype=int16), array([[454,  69],
       [496,  69],
       [496,  90],
       [454,  90]], dtype=int16), array([[ 17, 101],
       [ 95, 101],
       [ 95, 124],
       [ 17, 124]], dtype=int16), array([[144, 101],
       [178, 101],
       [178, 122],
       [144, 122]], dtype=int16), array([[278, 101],
       [338, 101],
       [338, 124],
       [278, 124]], dtype=int16), array([[448, 101],
       [503, 101],
       [503, 121],
       [448, 121]], dtype=int16)], 'rec_texts': ['CRuncover', 'Dres', '连续工作3', '取出来放在网上', '没想', '江、整江等八大', 'Abstr', 'rSrivi', '$709.', 'cludingGiv', '2.72', 'Ingcubic', '$744.78'], 'rec_scores': [0.9951260685920715, 0.9943379759788513, 0.9968608021736145, 0.9978817105293274, 0.9985721111297607, 0.9616036415100098, 0.9977153539657593, 0.987593948841095, 0.9906861186027527, 0.9959743618965149, 0.9970152378082275, 0.9977849721908569, 0.9984450936317444], 'rec_boxes': [array([234,   6, 316,  25], dtype=int16), array([38, 39, 73, 57], dtype=int16), array([122,  32, 201,  58], dtype=int16), array([227,  34, 346,  57], dtype=int16), array([351,  34, 391,  58], dtype=int16), array([417,  35, 534,  58], dtype=int16), array([34, 70, 78, 90], dtype=int16), array([287,  70, 328,  90], dtype=int16), array([454,  69, 496,  90], dtype=int16), array([ 17, 101,  95, 124], dtype=int16), array([144, 101, 178, 122], dtype=int16), array([278, 101, 338, 124], dtype=int16), array([448, 101, 503, 121], dtype=int16)]}}]}}
运行结果参数说明可以参考[2.2 Python脚本方式集成](#22-python脚本方式集成)中的结果解释。 可视化结果保存在`save_path`下,其中表格识别的可视化结果如下:

2.2 Python脚本方式集成

  • 上述命令行是为了快速体验查看效果,一般来说,在项目中,往往需要通过代码集成,您可以通过几行代码即可完成产线的快速推理,推理代码如下:
from paddlex import create_pipeline

pipeline = create_pipeline(pipeline="table_recognition_v2")

output = pipeline.predict(
    input="table_recognition.jpg",
    use_doc_orientation_classify=False,
    use_doc_unwarping=False,
)

for res in output:
    res.print()
    res.save_to_img("./output/")
    res.save_to_xlsx("./output/")
    res.save_to_html("./output/")
    res.save_to_json("./output/")

在上述 Python 脚本中,执行了如下几个步骤:

(1)通过 create_pipeline() 实例化通用表格识别产线v2对象,具体参数说明如下:

参数 参数说明 参数类型 默认值
pipeline 产线名称或是产线配置文件路径。如为产线名称,则必须为 PaddleX 所支持的产线。 str None
config 产线具体的配置信息(如果和pipeline同时设置,优先级高于pipeline,且要求产线名和pipeline一致)。 dict[str, Any] None
device 产线推理设备。支持指定GPU具体卡号,如“gpu:0”,其他硬件具体卡号,如“npu:0”,CPU如“cpu”。 str gpu:0
use_hpip 是否启用高性能推理,仅当该产线支持高性能推理时可用。 bool False

(2)调用通用表格识别产线v2对象的 predict() 方法进行推理预测。该方法将返回一个 generator。以下是 predict() 方法的参数及其说明:

参数 参数说明 参数类型 可选项 默认值
input 待预测数据,支持多种输入类型,必填 Python Var|str|list
  • 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\"]
None
device 产线推理设备 str|None
  • CPU:如 cpu 表示使用 CPU 进行推理;
  • GPU:如 gpu:0 表示使用第 1 块 GPU 进行推理;
  • NPU:如 npu:0 表示使用第 1 块 NPU 进行推理;
  • XPU:如 xpu:0 表示使用第 1 块 XPU 进行推理;
  • MLU:如 mlu:0 表示使用第 1 块 MLU 进行推理;
  • DCU:如 dcu:0 表示使用第 1 块 DCU 进行推理;
  • None:如果设置为 None, 将默认使用产线初始化的该参数值,初始化时,会优先使用本地的 GPU 0号设备,如果没有,则使用 CPU 设备;
None
use_doc_orientation_classify 是否使用文档方向分类模块 bool|None
  • boolTrue 或者 False
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为True
None
use_doc_unwarping 是否使用文档扭曲矫正模块 bool|None
  • boolTrue 或者 False
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为True
None
text_det_limit_side_len 文本检测的图像边长限制 int|None
  • int:大于 0 的任意整数;
  • None:如果设置为 None, 将默认使用产线初始化的该参数值,初始化为 960
None text_det_limit_type 文本检测的图像边长限制类型 str|None
  • str:支持 minmaxmin 表示保证图像最短边不小于 det_limit_side_lenmax 表示保证图像最长边不大于 limit_side_len
  • None:如果设置为 None, 将默认使用产线初始化的该参数值,初始化为 max
None text_det_thresh 检测像素阈值,输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点 float|None
  • float:大于 0 的任意浮点数
  • None:如果设置为 None, 将默认使用产线初始化的该参数值 0.3
None text_det_box_thresh 检测框阈值,检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域 float|None
  • float:大于 0 的任意浮点数
  • None:如果设置为 None, 将默认使用产线初始化的该参数值 0.6
None text_det_unclip_ratio 文本检测扩张系数,使用该方法对文字区域进行扩张,该值越大,扩张的面积越大 float|None
  • float:大于 0 的任意浮点数
  • None:如果设置为 None, 将默认使用产线初始化的该参数值 2.0
None text_rec_score_thresh 文本识别阈值,得分大于该阈值的文本结果会被保留 float|None
  • float:大于 0 的任意浮点数
  • None:如果设置为 None, 将默认使用产线初始化的该参数值 0.0。即不设阈值
None
use_layout_detection 是否使用版面检测模块 bool|None
  • boolTrue 或者 False
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为True
None
layout_threshold 版面检测置信度阈值,得分大于该阈值才会被输出 float|dict|None
  • float:大于 0 的任意浮点数
  • dict:key是int类别id, value是大于 0 的任意浮点数
  • None:如果设置为 None, 将默认使用产线初始化的该参数值 0.5
None
layout_nms 是否使用版面检测后处理NMS bool|None
  • boolTrue 或者 False
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为True
None
layout_unclip_ratio 检测框的边长缩放倍数;如果不指定,将默认使用PaddleX官方模型配置 float|list|None
  • float, 大于0的浮点数,如 1.1 , 表示将模型输出的检测框中心不变,宽和高都扩张1.1倍
  • 列表, 如 [1.2, 1.5] , 表示将模型输出的检测框中心不变,宽度扩张1.2倍,高度扩张1.5倍
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为1.0
layout_merge_bboxes_mode 模型输出的检测框的合并处理模式;如果不指定,将默认使用PaddleX官方模型配置 string|None
  • large, 设置为large时,表示在模型输出的检测框中,对于互相重叠包含的检测框,只保留外部最大的框,删除重叠的内部框。
  • small, 设置为small,表示在模型输出的检测框中,对于互相重叠包含的检测框,只保留内部被包含的小框,删除重叠的外部框。
  • union, 不进行框的过滤处理,内外框都保留
  • None:如果设置为None, 将默认使用产线初始化的该参数值,初始化为large
None

(3)对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为图片、保存为xlsx文件、保存为HTML文件、保存为json文件的操作:

方法 方法说明 参数 参数类型 参数说明 默认值
print() 打印结果到终端 format_json bool 是否对输出内容进行使用 JSON 缩进格式化 True
indent int 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_jsonTrue 时有效 4
ensure_ascii bool 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_jsonTrue时有效 False
save_to_json() 将结果保存为json格式的文件 save_path str 保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致
indent int 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_jsonTrue 时有效 4
ensure_ascii bool 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_jsonTrue时有效 False
save_to_img() 将结果保存为图像格式的文件 save_path str 保存的文件路径,支持目录或文件路径
save_to_xlsx() 将结果保存为xlsx格式的文件 save_path str 保存的文件路径,支持目录或文件路径
save_to_html() 将结果保存为html格式的文件 save_path str 保存的文件路径,支持目录或文件路径
  • 调用print() 方法会将结果打印到终端,打印到终端的内容解释如下:

    • input_path: (str) 待预测图像的输入路径

    • page_index: (Union[int, None]) 如果输入是PDF文件,则表示当前是PDF的第几页,否则为 None

    • model_settings: (Dict[str, bool]) 配置产线所需的模型参数

      • use_doc_preprocessor: (bool) 控制是否启用文档预处理子产线
      • use_layout_detection: (bool) 控制是否启用版面区域检测子产线
      • use_ocr_model: (bool) 控制是否启用OCR子产线
        • layout_det_res: (Dict[str, Union[List[numpy.ndarray], List[float]]]) 版面检测子模块的输出结果。仅当use_layout_detection=True时存在
      • input_path: (Union[str, None]) 版面检测区域模块接受的图像路径,当输入为numpy.ndarray时,保存为None
      • page_index: (Union[int, None]) 如果输入是PDF文件,则表示当前是PDF的第几页,否则为 None
      • boxes: (List[Dict]) 版面印章区域的检测框列表,每个列表中的元素,包含以下字段
        • cls_id: (int) 检测框的印章类别id
        • score: (float) 检测框的置信度
        • coordinate: (List[float]) 检测框的四个顶点坐标,顺序为x1,y1,x2,y2表示左上角的x坐标,左上角的y坐标,右下角x坐标,右下角的y坐标
        • doc_preprocessor_res: (Dict[str, Union[str, Dict[str, bool], int]]) 文档预处理子产线的输出结果。仅当use_doc_preprocessor=True时存在
      • input_path: (Union[str, None]) 图像预处理子产线接受的图像路径,当输入为numpy.ndarray时,保存为None
      • model_settings: (Dict) 预处理子产线的模型配置参数
        • use_doc_orientation_classify: (bool) 控制是否启用文档方向分类
        • use_doc_unwarping: (bool) 控制是否启用文档扭曲矫正
      • angle: (int) 文档方向分类的预测结果。启用时取值为[0,1,2,3],分别对应[0°,90°,180°,270°];未启用时为-1
    • dt_polys: (List[numpy.ndarray]) 文本检测的多边形框列表。每个检测框由4个顶点坐标构成的numpy数组表示,数组shape为(4, 2),数据类型为int16

    • dt_scores: (List[float]) 文本检测框的置信度列表

    • text_det_params: (Dict[str, Dict[str, int, float]]) 文本检测模块的配置参数

      • limit_side_len: (int) 图像预处理时的边长限制值
      • limit_type: (str) 边长限制的处理方式
      • thresh: (float) 文本像素分类的置信度阈值
      • box_thresh: (float) 文本检测框的置信度阈值
      • unclip_ratio: (float) 文本检测框的膨胀系数
      • text_type: (str) 文本检测的类型,当前固定为"general"
    • text_rec_score_thresh: (float) 文本识别结果的过滤阈值

    • rec_texts: (List[str]) 文本识别结果列表,仅包含置信度超过text_rec_score_thresh的文本

    • rec_scores: (List[float]) 文本识别的置信度列表,已按text_rec_score_thresh过滤

    • rec_polys: (List[numpy.ndarray]) 经过置信度过滤的文本检测框列表,格式同dt_polys

    • rec_boxes: (numpy.ndarray) 检测框的矩形边界框数组,shape为(n, 4),dtype为int16。每一行表示一个矩形框的[x_min, y_min, x_max, y_max]坐标 ,其中(x_min, y_min)为左上角坐标,(x_max, y_max)为右下角坐标

  • 调用save_to_json() 方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}.json,如果指定为文件,则直接保存到该文件中。由于json文件不支持保存numpy数组,因此会将其中的numpy.array类型转换为列表形式。

  • 调用save_to_img() 方法会将可视化结果保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_ocr_res_img.{your_img_extension},如果指定为文件,则直接保存到该文件中。(产线通常包含较多结果图片,不建议直接指定为具体的文件路径,否则多张图会被覆盖,仅保留最后一张图)
  • 调用save_to_html() 方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}.html,如果指定为文件,则直接保存到该文件中。在通用表格识别产线v2中,将会把图像中表格的HTML形式写入到指定的html文件中。
  • 调用save_to_xlsx() 方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}.xlsx,如果指定为文件,则直接保存到该文件中。在通用表格识别产线v2中,将会把图像中表格的Excel表格形式写入到指定的xlsx文件中。

  • 此外,也支持通过属性获取带结果的可视化图像和预测结果,具体如下:

属性 属性说明
json 获取预测的 json 格式的结果
img 获取格式为 dict 的可视化图像
  • json 属性获取的预测结果为dict类型的数据,相关内容与调用 save_to_json() 方法保存的内容一致。
  • img 属性返回的预测结果是一个字典类型的数据。其中,键分别为 table_res_imgocr_res_imglayout_res_imgpreprocessed_img,对应的值是四个 Image.Image 对象,按顺序分别为:表格识别结果的可视化图像、OCR 结果的可视化图像、版面区域检测结果的可视化图像、图像预处理的可视化图像。如果没有使用某个子模块,则字典中不包含对应的结果图像。

此外,您可以获取通用表格识别产线v2配置文件,并加载配置文件进行预测。可执行如下命令将结果保存在 my_path 中:

paddlex --get_pipeline_config table_recognition_v2 --save_path ./my_path

若您获取了配置文件,即可对通用表格识别产线v2各项配置进行自定义,只需要修改 create_pipeline 方法中的 pipeline 参数值为产线配置文件路径即可。示例如下:

from paddlex import create_pipeline

pipeline = create_pipeline(pipeline="./my_path/table_recognition_v2.yaml")

output = pipeline.predict(
    input="table_recognition.jpg",
    use_doc_orientation_classify=False,
    use_doc_unwarping=False,
)

for res in output:
    res.print()
    res.save_to_img("./output/")
    res.save_to_xlsx("./output/")
    res.save_to_html("./output/")
    res.save_to_json("./output/")

注: 配置文件中的参数为产线初始化参数,如果希望更改通用通用表格识别产线v2初始化参数,可以直接修改配置文件中的参数,并加载配置文件进行预测。同时,CLI 预测也支持传入配置文件,--pipeline 指定配置文件的路径即可。

3. 开发集成/部署

如果产线可以达到您对产线推理速度和精度的要求,您可以直接进行开发集成/部署。

若您需要将产线直接应用在您的Python项目中,可以参考 2.2 Python脚本方式集成中的示例代码。

此外,PaddleX 也提供了其他三种部署方式,详细说明如下:

🚀 高性能推理:在实际生产环境中,许多应用对部署策略的性能指标(尤其是响应速度)有着较严苛的标准,以确保系统的高效运行与用户体验的流畅性。为此,PaddleX 提供高性能推理插件,旨在对模型推理及前后处理进行深度性能优化,实现端到端流程的显著提速,详细的高性能推理流程请参考PaddleX高性能推理指南

☁️ 服务化部署:服务化部署是实际生产环境中常见的一种部署形式。通过将推理功能封装为服务,客户端可以通过网络请求来访问这些服务,以获取推理结果。PaddleX 支持多种产线服务化部署方案,详细的产线服务化部署流程请参考PaddleX服务化部署指南

以下是基础服务化部署的API参考与多语言服务调用示例:

API参考

对于服务提供的主要操作:

  • HTTP请求方法为POST。
  • 请求体和响应体均为JSON数据(JSON对象)。
  • 当请求处理成功时,响应状态码为200,响应体的属性如下:
名称 类型 含义
logId string 请求的UUID。
errorCode integer 错误码。固定为0
errorMsg string 错误说明。固定为"Success"
result object 操作结果。
  • 当请求处理未成功时,响应体的属性如下:
名称 类型 含义
logId string 请求的UUID。
errorCode integer 错误码。与响应状态码相同。
errorMsg string 错误说明。

服务提供的主要操作如下:

  • infer

定位并识别图中的表格。

POST /table-recognition

  • 请求体的属性如下:
名称 类型 含义 是否必填
file string 服务器可访问的图像文件或PDF文件的URL,或上述类型文件内容的Base64编码结果。对于超过10页的PDF文件,只有前10页的内容会被使用。
fileType integer | null 文件类型。0表示PDF文件,1表示图像文件。若请求体无此属性,则将根据URL推断文件类型。
useDocOrientationClassify boolean | null 参见产线 predict 方法中的 use_doc_orientation_classify 参数说明。
useDocUnwarping boolean | null 参见产线 predict 方法中的 use_doc_unwarping 参数说明。
useLayoutDetection boolean | null 参见产线 predict 方法中的 use_layout_detection 参数说明。
useOcrModel boolean | null 参见产线 predict 方法中的 use_ocr_model 参数说明。
layoutThreshold number | null 参见产线 predict 方法中的 layout_threshold 参数说明。
layoutNms boolean | null 参见产线 predict 方法中的 layout_nms 参数说明。
layoutUnclipRatio number | array | null 参见产线 predict 方法中的 layout_unclip_ratio 参数说明。
layoutMergeBboxesMode string | null 参见产线 predict 方法中的 layout_merge_bboxes_mode 参数说明。
textDetLimitSideLen integer | null 参见产线 predict 方法中的 text_det_limit_side_len 参数说明。
textDetLimitType string | null 参见产线 predict 方法中的 text_det_limit_type 参数说明。
textDetThresh number | null 参见产线 predict 方法中的 text_det_thresh 参数说明。
textDetBoxThresh number | null 参见产线 predict 方法中的 text_det_box_thresh 参数说明。
textDetUnclipRatio number | null 参见产线 predict 方法中的 text_det_unclip_ratio 参数说明。
textRecScoreThresh number | null 参见产线 predict 方法中的 text_rec_score_thresh 参数说明。

tableRecResults中的每个元素为一个object,具有如下属性:

名称 类型 含义
prunedResult object 产线对象的 predict 方法生成结果的 JSON 表示中 res 字段的简化版本,其中去除了 input_path 字段
outputImages object | null 参见产线预测结果中的 img 属性说明。图像为JPEG格式,使用Base64编码。
inputImage string | null 输入图像。图像为JPEG格式,使用Base64编码。
多语言调用服务示例
Python
import base64
import requests

API_URL = "http://localhost:8080/table-recognition"
file_path = "./demo.jpg"

with open(file_path, "rb") as file:
    file_bytes = file.read()
    file_data = base64.b64encode(file_bytes).decode("ascii")

payload = {"file": file_data, "fileType": 1}

response = requests.post(API_URL, json=payload)

assert response.status_code == 200
result = response.json()["result"]
for i, res in enumerate(result["tableRecResults"]):
    print("Detected tables:")
    print(res["tables"])
    layout_img_path = f"layout_{i}.jpg"
    with open(layout_img_path, "wb") as f:
        f.write(base64.b64decode(res["layoutImage"]))
    ocr_img_path = f"ocr_{i}.jpg"
    with open(ocr_img_path, "wb") as f:
        f.write(base64.b64decode(res["ocrImage"]))
    print(f"Output images saved at {layout_img_path} and {ocr_img_path}")


📱 端侧部署:端侧部署是一种将计算和数据处理功能放在用户设备本身上的方式,设备可以直接处理数据,而不需要依赖远程的服务器。PaddleX 支持将模型部署在 Android 等端侧设备上,详细的端侧部署流程请参考PaddleX端侧部署指南。 您可以根据需要选择合适的方式部署模型产线,进而进行后续的 AI 应用集成。

4. 二次开发

如果通用表格识别产线v2提供的默认模型权重在您的场景中,精度或速度不满意,您可以尝试利用您自己拥有的特定领域或应用场景的数据对现有模型进行进一步的微调,以提升通用表格识别产线v2的在您的场景中的识别效果。

4.1 模型微调

由于通用表格识别产线v2包含若干模块,模型产线的效果如果不及预期,可能来自于其中任何一个模块。您可以对识别效果差的图片进行分析,进而确定是哪个模块存在问题,并参考以下表格中对应的微调教程链接进行模型微调。

情形 微调模块 微调参考链接
表格结分类错误 表格分类模块 链接
表格单元格定位错误 表格单元格检测模块 链接
表格结构识别错误 表格结构识别模块 链接
未能成功检测到表格所在区域 版面区域检测模块 链接
文本存在漏检 文本检测模块 链接
文本内容都不准 文本识别模块 链接
整图旋转矫正不准 文档图像方向分类模块 链接
图像扭曲矫正不准 文本图像矫正模块 暂不支持微调

4.2 模型应用

当您使用私有数据集完成微调训练后,可获得本地模型权重文件。

若您需要使用微调后的模型权重,只需对产线配置文件做修改,将微调后模型权重的本地路径替换至产线配置文件中的对应位置即可:

SubModules:
  LayoutDetection:
    module_name: layout_detection
    model_name: PicoDet_layout_1x_table
    model_dir: null # 替换为微调后的版面区域检测模型权重路径

  TableClassification:
    module_name: table_classification
    model_name: PP-LCNet_x1_0_table_cls
    model_dir: null # 替换为微调后的表格分类模型权重路径

  WiredTableStructureRecognition:
    module_name: table_structure_recognition
    model_name: SLANeXt_wired
    model_dir: null # 替换为微调后的有线表格结构识别模型权重路径

  WirelessTableStructureRecognition:
    module_name: table_structure_recognition
    model_name: SLANeXt_wireless
    model_dir: null # 替换为微调后的无线表格结构识别模型权重路径

  WiredTableCellsDetection:
    module_name: table_cells_detection
    model_name: RT-DETR-L_wired_table_cell_det
    model_dir: null # 替换为微调后的有线表格单元格检测模型权重路径

  WirelessTableCellsDetection:
    module_name: table_cells_detection
    model_name: RT-DETR-L_wireless_table_cell_det
    model_dir: null # 替换为微调后的无线表格单元格检测模型权重路径

SubPipelines:
  DocPreprocessor:
    pipeline_name: doc_preprocessor
    use_doc_orientation_classify: True
    use_doc_unwarping: True
    SubModules:
      DocOrientationClassify:
        module_name: doc_text_orientation
        model_name: PP-LCNet_x1_0_doc_ori
        model_dir: null # 替换为微调后的文档图像方向分类模型权重路径

      DocUnwarping:
        module_name: image_unwarping
        model_name: UVDoc
        model_dir: null

  GeneralOCR:
    pipeline_name: OCR
    text_type: general
    use_doc_preprocessor: False
    use_textline_orientation: False
    SubModules:
      TextDetection:
        module_name: text_detection
        model_name: PP-OCRv4_server_det
        model_dir: null # 替换为微调后的文本检测模型权重路径
        limit_side_len: 960
        limit_type: max
        thresh: 0.3
        box_thresh: 0.6
        unclip_ratio: 2.0

      TextRecognition:
        module_name: text_recognition
        model_name: PP-OCRv4_server_rec
        model_dir: null # 替换为微调后文本识别的模型权重路径
        batch_size: 1
        score_thresh: 0
随后, 参考2.2 本地体验中的命令行方式或Python脚本方式,加载修改后的产线配置文件即可。

5. 多硬件支持

PaddleX 支持英伟达 GPU、昆仑芯 XPU、昇腾 NPU和寒武纪 MLU 等多种主流硬件设备,仅需修改 --device 参数即可完成不同硬件之间的无缝切换。

例如,您使用昇腾 NPU 进行 OCR 产线的推理,使用的 CLI 命令为:

paddlex --pipeline table_recognition_v2 \
        --input table_recognition.jpg \
        --save_path ./output \
        --device npu:0

当然,您也可以在 Python 脚本中 create_pipeline() 时或者 predict() 时指定硬件设备。

若您想在更多种类的硬件上使用通用表格识别产线v2,请参考PaddleX多硬件使用指南

评论