---
comments: true
---
# 印章文本识别产线使用教程
## 1. 印章文本识别产线介绍
印章文本识别是一种自动从文档或图像中提取和识别印章内容的技术,印章文本的识别是文档处理的一部分,在很多场景都有用途,例如合同比对,出入库审核以及发票报销审核等场景。
印章文本识别产线中包含版面区域分析模块、印章印章文本检测模块和文本识别模块。
如您更考虑模型精度,请选择精度较高的模型,如您更考虑模型推理速度,请选择推理速度较快的模型,如您更考虑模型存储大小,请选择存储大小较小的模型。
版面区域分析模块模型:
| 模型 | 模型下载链接 | mAP(0.5)(%) | GPU推理耗时(ms) | CPU推理耗时 (ms) | 模型存储大小(M) | 介绍 |
|---|---|---|---|---|---|---|
| PicoDet_layout_1x | 推理模型/训练模型 | 86.8 | 13.0 | 91.3 | 7.4 | 基于PicoDet-1x在PubLayNet数据集训练的高效率版面区域定位模型,可定位包含文字、标题、表格、图片以及列表这5类区域 |
| PicoDet_layout_1x_table | 推理模型/训练模型 | 95.7 | 12.623 | 90.8934 | 7.4 M | 基于PicoDet-1x在自建数据集训练的高效率版面区域定位模型,可定位包含表格这1类区域 |
| PicoDet-S_layout_3cls | 推理模型/训练模型 | 87.1 | 13.5 | 45.8 | 4.8 | 基于PicoDet-S轻量模型在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型,包含3个类别:表格,图像和印章 |
| PicoDet-S_layout_17cls | 推理模型/训练模型 | 70.3 | 13.6 | 46.2 | 4.8 | 基于PicoDet-S轻量模型在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型,包含17个版面常见类别,分别是:段落标题、图片、文本、数字、摘要、内容、图表标题、公式、表格、表格标题、参考文献、文档标题、脚注、页眉、算法、页脚、印章 |
| PicoDet-L_layout_3cls | 推理模型/训练模型 | 89.3 | 15.7 | 159.8 | 22.6 | 基于PicoDet-L在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型,包含3个类别:表格,图像和印章 |
| PicoDet-L_layout_17cls | 推理模型/训练模型 | 79.9 | 17.2 | 160.2 | 22.6 | 基于PicoDet-L在中英文论文、杂志和研报等场景上自建数据集训练的高效率版面区域定位模型,包含17个版面常见类别,分别是:段落标题、图片、文本、数字、摘要、内容、图表标题、公式、表格、表格标题、参考文献、文档标题、脚注、页眉、算法、页脚、印章 |
| RT-DETR-H_layout_3cls | 推理模型/训练模型 | 95.9 | 114.6 | 3832.6 | 470.1 | 基于RT-DETR-H在中英文论文、杂志和研报等场景上自建数据集训练的高精度版面区域定位模型,包含3个类别:表格,图像和印章 |
| RT-DETR-H_layout_17cls | 推理模型/训练模型 | 92.6 | 115.1 | 3827.2 | 470.2 | 基于RT-DETR-H在中英文论文、杂志和研报等场景上自建数据集训练的高精度版面区域定位模型,包含17个版面常见类别,分别是:段落标题、图片、文本、数字、摘要、内容、图表标题、公式、表格、表格标题、参考文献、文档标题、脚注、页眉、算法、页脚、印章 |
注:以上精度指标的评估集是 PaddleOCR 自建的版面区域分析数据集,包含中英文论文、杂志和研报等常见的 1w 张文档类型图片。GPU 推理耗时基于 NVIDIA Tesla T4 机器,精度类型为 FP32, CPU 推理速度基于 Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz,线程数为 8,精度类型为 FP32。
印章文本检测模块模型:
| 模型 | 模型下载链接 | 检测Hmean(%) | GPU推理耗时(ms) | CPU推理耗时 (ms) | 模型存储大小(M) | 介绍 |
|---|---|---|---|---|---|---|
| PP-OCRv4_server_seal_det | 推理模型/训练模型 | 98.21 | 84.341 | 2425.06 | 109 | PP-OCRv4的服务端印章文本检测模型,精度更高,适合在较好的服务器上部署 |
| PP-OCRv4_mobile_seal_det | 推理模型/训练模型 | 96.47 | 10.5878 | 131.813 | 4.6 | PP-OCRv4的移动端印章文本检测模型,效率更高,适合在端侧部署 |
注:以上精度指标的评估集是自建的数据集,包含500张圆形印章图像。GPU 推理耗时基于 NVIDIA Tesla T4 机器,精度类型为 FP32, CPU 推理速度基于 Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz,线程数为 8,精度类型为 FP32。
文本识别模块模型:
| 模型 | 模型下载链接 | 识别Avg Accuracy(%) | GPU推理耗时(ms) | CPU推理耗时 | 模型存储大小(M) | 介绍 |
|---|---|---|---|---|---|---|
| PP-OCRv4_mobile_rec | 推理模型/训练模型 | 78.20 | 7.95018 | 46.7868 | 10.6 M | PP-OCRv4的移动端文本识别模型,效率更高,适合在端侧部署 |
| PP-OCRv4_server_rec | 推理模型/训练模型 | 79.20 | 7.19439 | 140.179 | 71.2 M | PP-OCRv4的服务端文本识别模型,精度更高,适合在较好的服务器上部署 |
注:以上精度指标的评估集是 PaddleOCR 自建的中文数据集 ,覆盖街景、网图、文档、手写多个场景,其中文本识别包含 1.1w 张图片。以上所有模型 GPU 推理耗时基于 NVIDIA Tesla T4 机器,精度类型为 FP32, CPU 推理速度基于 Intel(R) Xeon(R) Gold 5117 CPU @ 2.00GHz,线程数为8,精度类型为 FP32。
## 2. 快速开始 PaddleX 所提供的预训练的模型产线均可以快速体验效果,你可以在本地使用命令行或 Python 体验印章文本识别产线的效果。 在本地使用印章文本识别产线前,请确保您已经按照[PaddleX本地安装教程](../../../installation/installation.md)完成了PaddleX的wheel包安装。 ### 2.1 命令行方式体验 一行命令即可快速体验印章文本识别产线效果,使用 [测试文件](https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/seal_text_det.png),并将 `--input` 替换为本地路径,进行预测 ``` paddlex --pipeline seal_recognition --input seal_text_det.png --device gpu:0 --save_path ./output ``` 参数说明: ``` --pipeline:产线名称,此处为印章文本识别产线 --input:待处理的输入图片的本地路径或URL --device: 使用的GPU序号(例如gpu:0表示使用第0块GPU,gpu:1,2表示使用第1、2块GPU),也可选择使用CPU(--device cpu) --save_path: 输出结果保存路径 ``` 在执行上述 Python 脚本时,加载的是默认的印章文本识别产线配置文件,若您需要自定义配置文件,可执行如下命令获取:paddlex --get_pipeline_config seal_recognition
执行后,印章文本识别产线配置文件将被保存在当前路径。若您希望自定义保存位置,可执行如下命令(假设自定义保存位置为 ./my_path ):
paddlex --get_pipeline_config seal_recognition --save_path ./my_path
获取产线配置文件后,可将 --pipeline 替换为配置文件保存路径,即可使配置文件生效。例如,若配置文件保存路径为 ./seal_recognition.yaml,只需执行:
paddlex --pipeline seal_recognition.yaml --input seal_text_det.png --save_path ./output
其中,--model、--device 等参数无需指定,将使用配置文件中的参数。若依然指定了参数,将以指定的参数为准。
{'input_path': PosixPath('/root/.paddlex/temp/tmpa8eqnpus.png'), 'layout_result': {'input_path': PosixPath('/root/.paddlex/temp/tmpa8eqnpus.png'), 'boxes': [{'cls_id': 2, 'label': 'seal', 'score': 0.9813321828842163, 'coordinate': [0, 5.1820183, 639.59314, 637.7533]}]}, 'ocr_result': {'dt_polys': [array([[166, 468],
[206, 503],
[249, 523],
[312, 535],
[364, 529],
[390, 521],
[428, 505],
[465, 476],
[468, 474],
[473, 474],
[476, 475],
[478, 477],
[508, 507],
[510, 510],
[511, 514],
[509, 518],
[507, 521],
[458, 559],
[455, 560],
[399, 584],
[399, 584],
[369, 591],
[367, 592],
[308, 597],
[305, 596],
[240, 584],
[239, 584],
[220, 577],
[169, 552],
[166, 551],
[120, 510],
[117, 507],
[116, 503],
[117, 499],
[121, 495],
[153, 468],
[156, 467],
[161, 467]]), array([[439, 444],
[443, 444],
[446, 446],
[448, 448],
[450, 451],
[450, 454],
[448, 498],
[448, 502],
[445, 505],
[442, 507],
[439, 507],
[399, 505],
[196, 506],
[192, 505],
[189, 503],
[187, 500],
[187, 497],
[186, 458],
[186, 456],
[187, 451],
[188, 448],
[192, 444],
[194, 444],
[198, 443]]), array([[463, 347],
[468, 347],
[472, 350],
[474, 353],
[476, 360],
[477, 425],
[476, 429],
[474, 433],
[470, 436],
[466, 438],
[463, 438],
[175, 439],
[170, 438],
[166, 435],
[163, 432],
[161, 426],
[161, 361],
[161, 356],
[163, 352],
[167, 349],
[172, 347],
[184, 346],
[186, 346]]), array([[325, 38],
[485, 91],
[489, 94],
[493, 96],
[587, 225],
[588, 230],
[589, 234],
[592, 384],
[591, 389],
[588, 393],
[585, 397],
[581, 399],
[576, 399],
[572, 398],
[508, 380],
[503, 379],
[499, 375],
[498, 370],
[497, 367],
[493, 258],
[428, 171],
[421, 165],
[323, 136],
[225, 165],
[207, 175],
[144, 260],
[141, 365],
[141, 370],
[138, 374],
[134, 378],
[131, 379],
[ 66, 398],
[ 61, 398],
[ 56, 398],
[ 52, 395],
[ 48, 391],
[ 47, 386],
[ 47, 384],
[ 47, 235],
[ 48, 230],
[ 50, 226],
[146, 96],
[151, 92],
[154, 91],
[315, 38],
[320, 37]])], 'dt_scores': [0.99375725701319, 0.9871711582010613, 0.9937523531067023, 0.9911629231838204], 'rec_text': ['5263647368706', '吗繁物', '发票专天津君和缘商贸有限公司'], 'rec_score': [0.9933745265007019, 0.998288631439209, 0.9999362230300903, 0.9923253655433655], 'input_path': PosixPath('/Users/chenghong0temp/tmpa8eqnpus.png')}, 'src_file_name': 'https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/seal_text_det.png', 'page_id': 0}
可视化图片默认保存在 `output` 目录下,您也可以通过 `--save_path` 进行自定义。
### 2.2 Python脚本方式集成
几行代码即可完成产线的快速推理,以印章文本识别产线为例:
```python
from paddlex import create_pipeline
pipeline = create_pipeline(pipeline="seal_recognition")
output = pipeline.predict("seal_text_det.png")
for res in output:
res.print() ## 打印预测的结构化输出
res.save_to_img("./output/") ## 保存可视化结果
```
得到的结果与命令行方式相同。
在上述 Python 脚本中,执行了如下几个步骤:
(1)实例化 `create_pipeline` 实例化产线对象:具体参数说明如下:
| 参数 | 参数说明 | 参数类型 | 默认值 |
|---|---|---|---|
pipeline |
产线名称或是产线配置文件路径。如为产线名称,则必须为 PaddleX 所支持的产线。 | str |
无 |
device |
产线模型推理设备。支持:“gpu”,“cpu”。 | str |
gpu |
enable_hpi |
是否启用高性能推理,仅当该产线支持高性能推理时可用。 | bool |
False |
| 参数类型 | 参数说明 |
|---|---|
| Python Var | 支持直接传入Python变量,如numpy.ndarray表示的图像数据。 |
| str | 支持传入待预测数据文件路径,如图像文件的本地路径:/root/data/img.jpg。 |
| str | 支持传入待预测数据文件URL,如图像文件的网络URL:示例。 |
| str | 支持传入本地目录,该目录下需包含待预测数据文件,如本地路径:/root/data/。 |
| dict | 支持传入字典类型,字典的key需与具体任务对应,如图像分类任务对应\"img\",字典的val支持上述类型数据,例如:{\"img\": \"/root/data1\"}。 |
| list | 支持传入列表,列表元素需为上述类型数据,如[numpy.ndarray, numpy.ndarray],[\"/root/data/img1.jpg\", \"/root/data/img2.jpg\"],[\"/root/data1\", \"/root/data2\"],[{\"img\": \"/root/data1\"}, {\"img\": \"/root/data2/img.jpg\"}]。 |
| 方法 | 说明 | 方法参数 |
|---|---|---|
| 打印结果到终端 | - format_json:bool类型,是否对输出内容进行使用json缩进格式化,默认为True;- indent:int类型,json格式化设置,仅当format_json为True时有效,默认为4;- ensure_ascii:bool类型,json格式化设置,仅当format_json为True时有效,默认为False; |
|
| save_to_json | 将结果保存为json格式的文件 | - save_path:str类型,保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致;- indent:int类型,json格式化设置,默认为4;- ensure_ascii:bool类型,json格式化设置,默认为False; |
| save_to_img | 将结果保存为图像格式的文件 | - save_path:str类型,保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致; |
对于服务提供的主要操作:
200,响应体的属性如下:| 名称 | 类型 | 含义 |
|---|---|---|
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。固定为0。 |
errorMsg |
string |
错误说明。固定为"Success"。 |
result |
object |
操作结果。 |
| 名称 | 类型 | 含义 |
|---|---|---|
logId |
string |
请求的UUID。 |
errorCode |
integer |
错误码。与响应状态码相同。 |
errorMsg |
string |
错误说明。 |
服务提供的主要操作如下:
infer获取印章文本识别结果。
POST /seal-recognition
| 名称 | 类型 | 含义 | 是否必填 |
|---|---|---|---|
file |
string |
服务可访问的图像文件或PDF文件的URL,或上述类型文件内容的Base64编码结果。对于超过10页的PDF文件,只有前10页的内容会被使用。 | 是 |
fileType |
integer |
文件类型。0表示PDF文件,1表示图像文件。若请求体无此属性,则服务将尝试根据URL自动推断文件类型。 |
否 |
inferenceParams |
object |
推理参数。 | 否 |
inferenceParams的属性如下:
| 名称 | 类型 | 含义 | 是否必填 |
|---|---|---|---|
maxLongSide |
integer |
推理时,若文本检测模型的输入图像较长边的长度大于maxLongSide,则将对图像进行缩放,使其较长边的长度等于maxLongSide。 |
否 |
result具有如下属性:| 名称 | 类型 | 含义 |
|---|---|---|
sealRecResults |
object |
印章文本识别结果。数组长度为1(对于图像输入)或文档页数与10中的较小者(对于PDF输入)。对于PDF输入,数组中的每个元素依次表示PDF文件中每一页的处理结果。 |
dataInfo |
object |
输入数据信息。 |
sealRecResults中的每个元素为一个object,具有如下属性:
| 名称 | 类型 | 含义 |
|---|---|---|
texts |
array |
文本位置、内容和得分。 |
inputImage |
string |
输入图像。图像为JPEG格式,使用Base64编码。 |
layoutImage |
string |
版面区域检测结果图。图像为JPEG格式,使用Base64编码。 |
ocrImage |
string |
OCR结果图。图像为JPEG格式,使用Base64编码。 |
texts中的每个元素为一个object,具有如下属性:
| 名称 | 类型 | 含义 |
|---|---|---|
poly |
array |
文本位置。数组中元素依次为包围文本的多边形的顶点坐标。 |
text |
string |
文本内容。 |
score |
number |
文本识别得分。 |
import base64
import requests
API_URL = "http://localhost:8080/seal-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["sealRecResults"]):
print("Detected texts:")
print(res["texts"])
ocr_img_path = f"ocr_{i}.jpg"
with open(ocr_img_path, "wb") as f:
f.write(base64.b64decode(res["ocrImage"]))
layout_img_path = f"layout_{i}.jpg"
with open(layout_img_path, "wb") as f:
f.write(base64.b64decode(res["layoutImage"]))
print(f"Output images saved at {ocr_img_path} and {layout_img_path}")