最近做项目需要对印章进行识别,并提取其中的印章文字,又不希望这个模型太大,还要方便部署,于是乎这个模型是个不错的选择。
一、模型简介
“Seal-Recognition”模型是PaddleX旗下的一款模型(PaddleX 是基于飞桨框架构建的低代码开发工具,它集成了众多开箱即用的预训练模型,可以实现模型从训练到推理的全流程开发,支持国内外多款主流硬件,助力AI 开发者进行产业实践。模型丰富一键调用:将覆盖文本图像智能分析、OCR、目标检测、时序预测等多个关键领域的 200+ 飞桨模型整合为 19 条模型产线,通过极简的 Python API 一键调用,快速体验模型效果。同时支持 20+ 单功能模块,方便开发者进行模型组合使用)。印章文本识别是一种自动从文档或图像中提取和识别印章内容的技术。印章文本识别产线中包含版面区域分析模块、印章印章文本检测模块和文本识别模块。
二、模型安装(本地)
1、推荐使用conda创建虚拟环境,python版本为3.8~3.10(因为paddleX的支持版本是这样的),我的是3.10。
2、安装paddlepaddle
这里给出地址:https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/installation/paddlepaddle_install.md推荐使用GPU进行推理,不然可能会出现很多错误,下面给出pip安装的指令。也可前往官网进行下载。
# cpu
python -m pip install paddlepaddle==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
# gpu,该命令仅适用于 CUDA 版本为 11.8 的机器环境
python -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/
# gpu,该命令仅适用于 CUDA 版本为 12.3 的机器环境
python -m pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu123/
3、安装paddleX
它提供了wheel包和插件安装模式,由于需要模型推理与集成 ,这里使用wheel包安装。指令如下:(!!!请务必保证 PaddlePaddle 安装成功,安装成功后,方可安装paddleX)
pip install https://paddle-model-ecology.bj.bcebos.com/paddlex/whl/paddlex-3.0.0b1-py3-none-any.whl
三、模型使用
到这里,其实印章模型并没有下载,需要我们创建pipeline后,会自动下载。只需要几行即可完成推理。代码如下:
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/") ## 保存可视化结果
运行这段代码,会自动下载该模型所需要的文件,会自动保存在C:\Users\XXXX\.paddlex目录下,如果你不想下载到C盘,官方也给出了方式。例如,若您的配置文件保存在 ./my_path/seal_recognition.yaml
,则只需执行:
from paddlex import create_pipeline
pipeline = create_pipeline(pipeline="./my_path/seal_recognition.yaml")
output = pipeline.predict("seal_text_det.png")
for res in output:
res.print() ## 打印预测的结构化输出
res.save_to_img("./output/") ## 保存可视化结果
他会自动下载所印章文本识别产线中包含版面区域分析模块、印章印章文本检测模块和文本识别模块。当然你可以根据自己的需求进行下载。给出官网:https://github.com/PaddlePaddle/PaddleX/blob/release/3.0-beta1/docs/pipeline_usage/tutorials/ocr_pipelines/seal_recognition.md他的结果都是每个样本的预测结果均为dict
类型,打印出来也是dict类型,针对于我的项目,我需要提取其中的文字信息,所以做了以下的代码更改:
# 处理每个预测结果(代码片段)
for res in output:
if 'ocr_result' in res:
ocr_result = res['ocr_result']
rec_text = ocr_result.get('rec_text', None) # 安全提取 `rec_text`
if rec_text:
total_num += 1
# 判断 `rec_text` 的类型
if isinstance(rec_text, list):
# 如果是列表,将列表中的元素拼接为一个字符串
combined_text = ''.join(rec_text)
seal_texts.append(combined_text)
else:
# 如果是单一字符串,直接添加
seal_texts.append(rec_text)
print(f"{filename}中的印章信息: {seal_texts[-1]}")
这样会安全提取出文字,不过由于印章被文字遮挡的比较多,因此文字并不是这么的精确。
当然他的这个res.print()里面的ocr_result字段其实还包含了一个score,是用来给识别出来的印章进行一个评分,满分为1 ,如果识别的文字不是很准确或者文字根本就没有识别出来,可以查看这个得分来进行一个评判。比如我的page6就没有被识别出文字,但是有socre。
如果对于预测的结果不太满意,官方也给出了方案,可以自己进行微调。如果印章文本识别产线提供的默认模型权重在您的场景中,精度或速度不满意,您可以尝试利用您自己拥有的特定领域或应用场景的数据对现有模型进行进一步的微调,以提升印章文本识别产线的在您的场景中的识别效果。这里我没有进行微调,如有需要,可以参照官网:PaddleX/docs/pipeline_usage/tutorials/ocr_pipelines/seal_recognition.md at release/3.0-beta1 · PaddlePaddle/PaddleX · GitHub