微信扫码
与创始人交个朋友
我要投稿
关注真聊技术,我们一起探究AI奥秘!
在上一篇文章中,我们介绍了如何在 Windows 环境中配置 OCR 相关模型,并完成了模型验证。本篇文章将基于之前的内容,进一步讲解如何将文本检测、方向分类和文本识别模型进行串联,最终搭建一个基础的 OCR 应用服务。通过这些模型的串联与部署,我们将能够创建一个可商用的 OCR 系统,从而满足更复杂的文档解析需求,并为未来自定义训练模型的服务部署奠定坚实的基础。
有关在 Windows 环境下安装模型运行环境的具体步骤和说明,请参考之前的文章,链接如下:
PaddleOCR 提供了一种方便的检测与识别模型串联工具,能够高效实现两阶段的文本识别系统。该系统通过将检测模型与识别模型相结合,实现从图像到文本的精准转换。以下是整个串联过程的详细描述:
首先,输入的图像会经过文本检测模型。这一模型负责定位图像中可能包含文本的区域,输出相应的文本边界框。PaddleOCR 提供了多种检测模型,如 DB、EAST 等,能够根据不同场景需求进行选择。这一步的关键在于准确检测文本区域,为后续的识别提供基础。
为了提高文本识别的精度,检测框会进行几何矫正。此步骤通过调整检测出的文本区域,使文本框尽量贴合文字内容,避免由于倾斜、变形等因素造成的识别误差。通过这一步,可以极大地提升对不同角度、排列文本的识别效果。
经过矫正后的文本框会输入到文本识别模型中进行文字内容的识别。PaddleOCR 提供了多种识别模型(如 CRNN、RARE 等),这些模型通过深度学习方法,将输入的图像区域转换为实际的字符序列,生成识别文本。
在文本识别过程中,系统还会为每个检测和识别结果打分。通过设定一定的置信度阈值,系统可以过滤掉低置信度的检测结果,确保最终输出的文本更加准确。这一步通过调整过滤标准,可以根据不同任务场景的需求来平衡识别的精度和召回率。
文本检测、文本识别串联模型推理验证:
1.打开Anaconda Prompt终端:在Windows桌面左下角Windows Start Menu -> Anaconda3 -> Anaconda Prompt启动控制台,进入E:\paddle_ocr\PaddleOCR源码路径下,执行以下命令激活PaddleOCR的Python环境。
conda activate paddle_env
python ./tools\infer\predict_system.py --image_dir="./doc\imgs\00018069.jpg" --det_model_dir="./inference\ch_PP-OCRv4_det_infer" --cls_model_dir="./inference\ch_ppocr_mobile_v2.0_cls_infer" --rec_model_dir="./inference\ch_PP-OCRv4_rec_infer" --use_angle_cls=true --use_gpu=False
Json结果部分展示:
[
{
"transcription": "代号",
"points": [
[
19,
1
],
[
54,
1
],
[
54,
21
],
[
19,
21
]
]
}
]
use_angle_cls
参数,它决定了是否启用方向分类模型。image_dir
: 用于指定输入图像的路径,可以是单张图像或一组图像的文件夹路径。det_model_dir
: 用于指定检测模型的路径,该模型负责识别图像中的文本区域。
rec_model_dir
: 用于指定识别模型的路径,该模型将检测到的文本区域转换为字符序列。
cls_model_dir
: 用于指定方向分类模型的路径,该模型用于矫正文本的方向。
use_angle_cls
: 控制是否启用方向分类模型。
use_angle_cls
的详细说明:use_angle_cls
参数用于控制是否启用方向分类模型。方向分类模型的主要功能是判断和校正图像中检测到的文本方向,尤其是在图像中出现旋转、倾斜或倒置文本的情况下。通过这个模型,系统能够先对文本方向进行分类和矫正,再进行文字识别,以提高识别的准确性。
use_angle_cls
设置为 True
)是必要的:文本方向不一致:当图像中包含多个方向的文本,如有水平、垂直、旋转甚至倒置的文字时,方向分类模型能够自动判断文本方向并进行调整。
文档扫描场景:在扫描文件或票据时,文本区域可能存在不同角度的排布,尤其是在手持拍摄的图像中,方向分类模型可以显著提高识别的精度。
票据和票证处理:有时在处理发票或表单时,文本区域可能是倒置的或倾斜的。方向分类模型可以确保即使文本方向不正确,模型仍然能准确识别文字。
use_angle_cls
设置为 False
),以节省推理时间和计算资源。PaddleOCR提供2种服务部署方式:
基于PaddleHub Serving的部署:代码路径为./deploy/hubserving
基于PaddleServing的部署:代码路径为./deploy/pdserving
deploy/hubserving/
└─ ocr_cls 文本方向分类模块服务包
└─ ocr_det 文本检测模块服务包
└─ ocr_rec 文本识别模块服务包
└─ ocr_system 文本检测+文本方向分类+文本识别串联服务包
└─ structure_layout 版面分析服务包
└─ structure_table 表格识别服务包
└─ structure_system PP-Structure服务包
└─ kie_ser 关键信息抽取-SER服务包
└─ kie_ser_re 关键信息抽取-SER+RE服务包
deploy/hubserving/ocr_system/
└─ __init__.py 空文件,必选
└─ config.json 配置文件,可选,使用配置启动服务时作为参数传入
└─ module.py 主模块,必选,包含服务的完整逻辑
└─ params.py 参数文件,必选,包含模型路径、前后处理参数等参数
进入E:\paddle_ocr\PaddleOCR源码路径下,在praddle_env的Python的环境下,执行以下命令安装PaddleHub最新版本。
pip3 install paddlehub --upgrade -i https://mirrors.aliyun.com/pypi/simple/
模型 | 路径 |
检测模型 | ./inference/ch_PP-OCRv4_det_infer/ |
识别模型 | ./inference/ch_PP-OCRv4_rec_infer/ |
方向分类器 | ./inference/ch_ppocr_mobile_v2.0_cls_infer/ |
模型路径可在params.py
中查看和修改,可以替换成自己训练转换好的模型。
/
替换为\
)下,安装模块命令如下表:服务模块 | 命令 |
检测+识别串联 | hub install deploy/hubserving/ocr_system |
# 执行模型安装命令
hub install deploy\hubserving\ocr_system
3. 启动服务
# 执行启动命令后,见到如下界面说明服务已启动
hub serving start -m ocr_system
4. 请求服务
进入E:\paddle_ocr\PaddleOCR源码路径下,在praddle_env的Python的环境下,执行以下命令,验证已启动服务是否可用。
python ./tools\test_hubserving.py --server_url=http://127.0.0.1:8866/predict/ocr_system --image_dir=./doc\imgs/00018069.jpg --visualize=false
[{'confidence': 0.999848484992981, 'text': '代号', 'text_region': [[19, 1], [54, 1], [54, 21], [19, 21]]}, {'confidence': 0.9992080926895142, 'tex
t': '项目', 'text_region': [[124, 2], [159, 2], [159, 21], [124, 21]]}, {'confidence': 0.9987339973449707, 'text': '结果', 'text_region': [[232, 1], [268, 1], [268, 21], [232, 21]]
}, {'confidence': 0.9997586607933044, 'text': '参考值', 'text_region': [[296, 1], [347, 1], [347, 20], [296, 20]]}, {'confidence': 0.9999487996101379, 'text': '单位', 'text_region'
: [[376, 1], [411, 1], [411, 21], [376, 21]]}, {'confidence': 0.9965283274650574, 'text': 'ALT', 'text_region': [[24, 23], [51, 23], [51, 39], [24, 39]]}, {'confidence': 0.99857491
25480652, 'text': '谷丙转氨酶', 'text_region': [[100, 20], [185, 20], [185, 41], [100, 41]]}, {'confidence': 0.9979120492935181, 'text': '25.6', 'text_region': [[233, 23], [269, 23
], [269, 39], [233, 39]]}, {'confidence': 0.9666016697883606, 'text': '0--40', 'text_region': [[299, 22], [345, 22], [345, 40], [299, 40]]}, {'confidence': 0.8711754679679871, 'tex
t': 'U/L', 'text_region': [[378, 21], [408, 21], [408, 40], [378, 40]]}, {'confidence': 0.9945583343505859, 'text': 'TBIL', 'text_region': [[19, 41], [55, 41], [55, 59], [19, 59]]}
, {'confidence': 0.9986435770988464, 'text': '总胆红素', 'text_region': [[110, 39], [177, 39], [177, 60], [110, 60]]}, {'confidence': 0.9964954853057861, 'text': '11.2', 'text_regi
on': [[232, 41], [270, 41], [270, 59], [232, 59]]}, {'confidence': 0.949794352054596, 'text': '<20', 'text_region': [[308, 41], [338, 41], [338, 59], [308, 59]]}, {'confidence': 0.
9597413539886475, 'text': 'umol/L', 'text_region': [[367, 41], [420, 41], [420, 59], [367, 59]]}, {'confidence': 0.9963439702987671, 'text': 'DBIL', 'text_region': [[19, 59], [55,
59], [55, 78], [19, 78]]}, {'confidence': 0.9987521171569824, 'text': '直接胆红素', 'text_region': [[102, 58], [184, 58], [184, 79], [102, 79]]}, {'confidence': 0.9962077140808105,
'text': '3.3', 'text_region': [[235, 59], [266, 59], [266, 78], [235, 78]]}, {'confidence': 0.7987732291221619, 'text': '0--7', 'text_region': [[304, 60], [340, 60], [340, 76], [3
04, 76]]}, {'confidence': 0.949164867401123, 'text': 'umol/L', 'text_region': [[368, 59], [420, 59], [420, 78], [368, 78]]}, {'confidence': 0.9881249666213989, 'text': 'IBIL', 'tex
t_region': [[20, 78], [54, 78], [54, 97], [20, 97]]}, {'confidence': 0.9977105259895325, 'text': '间接胆红素', 'text_region': [[102, 77], [184, 77], [184, 98], [102, 98]]}, {'confi
dence': 0.9968709945678711, 'text': '7.9', 'text_region': [[235, 78], [266, 78], [266, 97], [235, 97]]}, {'confidence': 0.9892260432243347, 'text': '1.5--15', 'text_region': [[291,
79], [350, 79], [350, 94], [291, 94]]}, {'confidence': 0.9596831798553467, 'text': 'umol/L', 'text_region': [[369, 79], [420, 79], [420, 97], [369, 97]]}, {'confidence': 0.9953203
201293945, 'text': 'TP', 'text_region': [[27, 98], [48, 98], [48, 116], [27, 116]]}, {'confidence': 0.9998953342437744, 'text': '总蛋白', 'text_region': [[118, 97], [166, 97], [166
, 116], [118, 116]]}, {'confidence': 0.9984322190284729, 'text': '58.9', 'text_region': [[224, 98], [272, 98], [272, 116], [224, 116]]}, {'confidence': 0.9880561828613281, 'text':
'60--80', 'text_region': [[297, 98], [349, 98], [349, 116], [297, 116]]}, {'confidence': 0.9866965413093567, 'text': 'g/L', 'text_region': [[379, 98], [408, 98], [408, 118], [379,
118]]}, {'confidence': 0.998601496219635, 'text': 'ALB', 'text_region': [[24, 118], [51, 118], [51, 135], [24, 135]]}, {'confidence': 0.9997892379760742, 'text': '白蛋白', 'text_re
gion': [[118, 112], [169, 115], [168, 137], [116, 134]]}, {'confidence': 0.9980158805847168, 'text': '35.1', 'text_region': [[232, 117], [269, 117], [269, 136], [232, 136]]}, {'con
fidence': 0.9636005759239197, 'text': '33--55', 'text_region': [[296, 117], [348, 117], [348, 135], [296, 135]]}, {'confidence': 0.957646906375885, 'text': 'g/L', 'text_region': [[
378, 118], [407, 115], [409, 135], [380, 138]]}, {'confidence': 0.9895787239074707, 'text': 'GLO', 'text_region': [[24, 137], [51, 137], [51, 153], [24, 153]]}, {'confidence': 0.99
96899962425232, 'text': '球蛋白', 'text_region': [[117, 136], [167, 136], [167, 153], [117, 153]]}, {'confidence': 0.997654914855957, 'text': '23.8', 'text_region': [[232, 136], [2
70, 136], [270, 154], [232, 154]]}, {'confidence': 0.992893636226654, 'text': '20--30', 'text_region': [[296, 136], [349, 136], [349, 153], [296, 153]]}, {'confidence': 0.937683820
7244873, 'text': 'g/L', 'text_region': [[378, 137], [407, 134], [409, 154], [380, 157]]}, {'confidence': 0.994020402431488, 'text': 'A/G', 'text_region': [[24, 155], [51, 155], [51
, 172], [24, 172]]}, {'confidence': 0.9995932579040527, 'text': '白球比', 'text_region': [[119, 154], [168, 154], [168, 173], [119, 173]]}, {'confidence': 0.997298538684845, 'text'
: '1.5', 'text_region': [[234, 154], [266, 154], [266, 173], [234, 173]]}, {'confidence': 0.9626685380935669, 'text': '1.5--2.5', 'text_region': [[287, 155], [357, 155], [357, 173]
, [287, 173]]}, {'confidence': 0.9928719401359558, 'text': 'ALP', 'text_region': [[21, 175], [50, 171], [52, 191], [23, 195]]}, {'confidence': 0.9545178413391113, 'text': '碱性磷酸
', 'text_region': [[100, 172], [184, 172], [184, 193], [100, 193]]}, {'confidence': 0.9982390403747559, 'text': '93', 'text_region': [[240, 175], [260, 175], [260, 192], [240, 19 9
2]]}, {'confidence': 0.9920914769172668, 'text': '15--112', 'text_region': [[290, 173], [354, 173], [354, 194], [290, 194]]}, {'confidence': 0.9722098708152771, 'text': 'IU/L', 'text_region': [[376, 175], [410, 175], [410, 191], [376, 191]]}, {'confidence': 0.998141348361969, 'text': 'GGT', 'text_region': [[24, 194], [50, 194], [50, 211], [24, 211]]}, {'confidence': 0.9910216331481934, 'text': '谷氨酰转肽酶', 'text_region': [[98, 192], [188, 192], [188, 210], [98, 210]]}, {'confidence': 0.9981499314308167, 'text': '14.3', 'text_region32, 193], [270, 193], [270, 212], [232, 212]]}, {'confidence': 0.96588134765625, 'text': '<50', 'text_region': [[310, 194], [337, 194], [337, 211], [310, 211]]}, {'confidence': 0.9874141812324524, 'text': 'U/L', 'text_region': [[379, 194], [406, 194], [406, 211], [379, 211]]}, {'confidence': 0.9977130889892578, 'text': 'AST', 'text_region': [[24, 213], [50, 213], [50, 229], [24, 229]]}, {'confidence': 0.9985289573669434, 'text': '谷草转氨酶', 'text_region': [[100, 208], [185, 211], [185, 232], [99, 229]]}, {'confidence': 0.9976338744163513, 'text': '16.3', 'text_region': [[232, 212], [270, 212], [270, 230], [232, 230]]}, {'confidence': 0.9725760221481323, 'text': '8--40', 'text_region': [[298, 213], [345, 213], [345, 230], [298, 230]]}, {'confidence': 0.9855239391326904, 'text': 'U/L', 'text_region': [[379, 213], [406, 213], [406, 229], [379, 229]]}, {'confidence': 0.9941731095314026, 't26, 'text': 'LDH', 'text_region': [[23, 230], [53, 230], [53, 249], [23, 249]]}, {'confidence': 0.9993842840194702, 'text': '乳酸脱氢酶', 'text_region': [[101, 230], [184, 230], [148], [101, 248]]}, {'confidence': 0.9987676739692688, 'text': '167', 'text_region': [[235, 230], [265, 230], [265, 249], [235, 249]]}, {'confidence': 0.9886070489883423, 'text': '114--240', 'text_region': [[287, 232], [358, 232], [358, 249], [287, 249]]}, {'confidence': 0.987419605255127, 'text': 'U/L', 'text_region': [[379, 232], [406, 232], [406, 248], [379, 248]]}, {'confidence': 0.9958209991455078, 'text': 'ADA', 'text_region': [[24, 250], [51, 250], [51, 266], [24, 266]]}, {'confidence': 0.9985343813896179, 'text': '腺甘脱氨酶', _region': [[103, 250], [183, 250], [183, 265], [103, 265]]}, {'confidence': 0.9976718425750732, 'text': '12.6', 'text_region': [[233, 250], [269, 250], [269, 266], [233, 266]]}, {'confidence': 0.9742022752761841, 'text': '4--24', 'text_region': [[299, 249], [345, 249], [345, 266], [299, 266]]}, {'confidence': 0.9864771366119385, 'text': 'U/L', 'text_region': [[379, 250], [407, 250], [407, 266], [379, 266]]}]
字段名称 | 数据类型 | 意义 |
angle | str | 文本角度 |
text | str | 文本内容 |
confidence | float | 文本识别置信度或角度分类置信度 |
text_region | list | 文本位置坐标 |
总结
文本检测、方向分类器和文本识别服务成功发布后,整个系统便可以解析PDF、图片等文档中的文本内容。PaddleOCR的hubserving还能将表格识别、版面分析模型一同串联发布,从而构建一个完整的文档解析服务,对PDF文档实现更全面的处理。此外,还可以通过SER模型发布实现对发票、证件等文档的关键信息抽取。该架构最大的优势在于支持自定义训练的模型发布,用户能够根据行业需求精调、微调模型。未来,我们将重点介绍行业模型的标注、训练与部署,敬请期待。
声明:本文为 真聊技术 原创,转载请联系授权。
看完本文有收获?请转发分享给更多人
关注「真聊技术」,提升综合技能
真聊技术
分享、点赞和在看就是最大的支持❤️
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-05
基于RAG的to B智能体(Agent)应用实践
2024-10-03
RAG实战篇:将用户输入转换为精确的数据库查询语言
2024-10-02
RAG(检索增强生成)新探索:IdentityRAG 提高 RAG 准确性
2024-10-02
2.7K+ Star!LlamaParse:一个为RAG和代理打造的文档解析神器
2024-10-01
你的RAG混合搜索效果不好?别着急上Reranking,先把RRF算法的K=60改了试试。
2024-10-01
LLM RAG面试问题大全!
2024-10-01
检索增强生成(RAG)与相关技术综述:问题、分类、数据、模型、挑战
2024-10-01
大模型RAG:基于PgSql的向量检索
2024-07-18
2024-07-09
2024-07-09
2024-07-08
2024-06-20
2024-07-09
2024-05-05
2024-07-07
2024-07-07
2024-05-19
2024-09-30
2024-09-26
2024-09-26
2024-09-20
2024-09-16
2024-09-12
2024-09-11
2024-09-10