AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


打造自己的RAG解析大模型:Windows下部署OCR应用服务(可商业应用)
发布日期:2024-10-05 21:05:05 浏览次数: 1527


关注真聊技术,我们一起探究AI奥秘!



在上一篇文章中,我们介绍了如何在 Windows 环境中配置 OCR 相关模型,并完成了模型验证。本篇文章将基于之前的内容,进一步讲解如何将文本检测、方向分类和文本识别模型进行串联,最终搭建一个基础的 OCR 应用服务。通过这些模型的串联与部署,我们将能够创建一个可商用的 OCR 系统,从而满足更复杂的文档解析需求,并为未来自定义训练模型的服务部署奠定坚实的基础。

有关在 Windows 环境下安装模型运行环境的具体步骤和说明,请参考之前的文章,链接如下:

Windows下OCR模型的安装与推理

模型串联推理过程介绍

PaddleOCR 提供了一种方便的检测与识别模型串联工具,能够高效实现两阶段的文本识别系统。该系统通过将检测模型与识别模型相结合,实现从图像到文本的精准转换。以下是整个串联过程的详细描述:

1. 文本检测阶段

首先,输入的图像会经过文本检测模型。这一模型负责定位图像中可能包含文本的区域,输出相应的文本边界框。PaddleOCR 提供了多种检测模型,如 DB、EAST 等,能够根据不同场景需求进行选择。这一步的关键在于准确检测文本区域,为后续的识别提供基础。

2. 检测框矫正

为了提高文本识别的精度,检测框会进行几何矫正。此步骤通过调整检测出的文本区域,使文本框尽量贴合文字内容,避免由于倾斜、变形等因素造成的识别误差。通过这一步,可以极大地提升对不同角度、排列文本的识别效果。

3. 文本识别

经过矫正后的文本框会输入到文本识别模型中进行文字内容的识别。PaddleOCR 提供了多种识别模型(如 CRNN、RARE 等),这些模型通过深度学习方法,将输入的图像区域转换为实际的字符序列,生成识别文本。

4. 得分过滤

在文本识别过程中,系统还会为每个检测和识别结果打分。通过设定一定的置信度阈值,系统可以过滤掉低置信度的检测结果,确保最终输出的文本更加准确。这一步通过调整过滤标准,可以根据不同任务场景的需求来平衡识别的精度和召回率。

文本检测、文本识别串联模型推理验证:

1.打开Anaconda Prompt终端:在Windows桌面左下角Windows Start Menu -> Anaconda3 -> Anaconda Prompt启动控制台,进入E:\paddle_ocr\PaddleOCR源码路径下,执行以下命令激活PaddleOCR的Python环境。

conda activate paddle_env
2. 执行串联模型推理命令
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文件。
串联模型推理可视化结果如下图:

Json结果部分展示:

[  {    "transcription": "代号",    "points": [      [        19,        1      ],      [        54,        1      ],      [        54,        21      ],      [        19,        21      ]    ]  }]
在 PaddleOCR 的推理过程中,模型的配置对识别精度和效率至关重要。以下是关于模型推理的关键参数配置说明,特别是 use_angle_cls 参数,它决定了是否启用方向分类模型。

主要参数说明:

  1. image_dir: 用于指定输入图像的路径,可以是单张图像或一组图像的文件夹路径。
  2. det_model_dir: 用于指定检测模型的路径,该模型负责识别图像中的文本区域。

  3. rec_model_dir: 用于指定识别模型的路径,该模型将检测到的文本区域转换为字符序列。

  4. cls_model_dir: 用于指定方向分类模型的路径,该模型用于矫正文本的方向。

  5. use_angle_cls: 控制是否启用方向分类模型。

关于 use_angle_cls 的详细说明:

use_angle_cls 参数用于控制是否启用方向分类模型。方向分类模型的主要功能是判断和校正图像中检测到的文本方向,尤其是在图像中出现旋转、倾斜或倒置文本的情况下。通过这个模型,系统能够先对文本方向进行分类和矫正,再进行文字识别,以提高识别的准确性。

何时需要启用方向分类模型?

在以下情况下,启用方向分类模型(即将 use_angle_cls 设置为 True)是必要的:
  • 文本方向不一致:当图像中包含多个方向的文本,如有水平、垂直、旋转甚至倒置的文字时,方向分类模型能够自动判断文本方向并进行调整。

  • 文档扫描场景:在扫描文件或票据时,文本区域可能存在不同角度的排布,尤其是在手持拍摄的图像中,方向分类模型可以显著提高识别的精度。

  • 票据和票证处理:有时在处理发票或表单时,文本区域可能是倒置的或倾斜的。方向分类模型可以确保即使文本方向不正确,模型仍然能准确识别文字。

何时不需要启用方向分类模型?

如果输入图像中的文本方向已经是固定的(如整齐的水平文本),且图像预处理阶段已经保证了文本的正确方向,那么可以关闭方向分类模型(即将 use_angle_cls 设置为 False),以节省推理时间和计算资源。

基于PaddleHub Serving的服务部署

PaddleOCR提供2种服务部署方式:

  • 基于PaddleHub Serving的部署:代码路径为./deploy/hubserving

  • 基于PaddleServing的部署:代码路径为./deploy/pdserving

PaddleHub Serving 是 PaddleOCR 提供的一种部署服务方式,用于快速构建和发布 OCR 服务。在 PaddleHub Serving 部署中,您可以通过其模块化、易用的 API 结构,快速将 PaddleOCR 模型部署为在线服务。
hubserving服务部署目录下包括文本检测、文本方向分类,文本识别、文本检测+文本方向分类+文本识别3阶段串联,版面分析、表格识别和PP-Structure七种服务包,请根据需求选择相应的服务包进行安装和启动。目录结构如下:
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服务包
每个服务包下包含3个文件。以2阶段串联ocr_system服务包为例,目录如下:
deploy/hubserving/ocr_system/  └─  __init__.py    空文件,必选  └─  config.json    配置文件,可选,使用配置启动服务时作为参数传入  └─  module.py      主模块,必选,包含服务的完整逻辑  └─  params.py      参数文件,必选,包含模型路径、前后处理参数等参数

安装PaddleHub

进入E:\paddle_ocr\PaddleOCR源码路径下,在praddle_env的Python的环境下,执行以下命令安装PaddleHub最新版本。

pip3 install paddlehub --upgrade -i https://mirrors.aliyun.com/pypi/simple/
1. 下载推理模型
安装服务模块前,需要准备推理模型并放到正确路径。默认模型路径为:
模型 路径
检测模型 ./inference/ch_PP-OCRv4_det_infer/
识别模型 ./inference/ch_PP-OCRv4_rec_infer/
方向分类器 ./inference/ch_ppocr_mobile_v2.0_cls_infer/

模型路径可在params.py中查看和修改,可以替换成自己训练转换好的模型。

2. 安装服务模块
PaddleOCR提供5种服务模块,以2阶段串联ocr_system服务包为例,在Linux环境(Windows环境请将/替换为\)下,安装模块命令如下表:
服务模块 命令
检测+识别串联 hub install deploy/hubserving/ocr_system
# 执行模型安装命令hub install deploy\hubserving\ocr_system

3. 启动服务

启动2阶段串联ocr_system服务,端口默认8866,并发任务数,默认为2*cpu_count-1。
# 执行启动命令后,见到如下界面说明服务已启动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, 'text': '项目', '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.9985749125480652, '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, 'text': '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_region': [[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], [304, 76]]}, {'confidence': 0.949164867401123, 'text': 'umol/L', 'text_region': [[368, 59], [420, 59], [420, 78], [368, 78]]}, {'confidence': 0.9881249666213989, 'text': 'IBIL', 'text_region': [[20, 78], [54, 78], [54, 97], [20, 97]]}, {'confidence': 0.9977105259895325, 'text': '间接胆红素', 'text_region': [[102, 77], [184, 77], [184, 98], [102, 98]]}, {'confidence': 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.9953203201293945, '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_region': [[118, 112], [169, 115], [168, 137], [116, 134]]}, {'confidence': 0.9980158805847168, 'text': '35.1', 'text_region': [[232, 117], [269, 117], [269, 136], [232, 136]]}, {'confidence': 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.9996899962425232, 'text': '球蛋白', 'text_region': [[117, 136], [167, 136], [167, 153], [117, 153]]}, {'confidence': 0.997654914855957, 'text': '23.8', 'text_region': [[232, 136], [270, 136], [270, 154], [232, 154]]}, {'confidence': 0.992893636226654, 'text': '20--30', 'text_region': [[296, 136], [349, 136], [349, 153], [296, 153]]}, {'confidence': 0.9376838207244873, '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 92]]}, {'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]]}]
结果说明:
返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下:
字段名称 数据类型 意义
angle str 文本角
text str 文本内容
confidence float 文本识别置信度或角度分类置信度
text_region list 文本位置坐标

总结

文本检测、方向分类器和文本识别服务成功发布后,整个系统便可以解析PDF、图片等文档中的文本内容。PaddleOCR的hubserving还能将表格识别、版面分析模型一同串联发布,从而构建一个完整的文档解析服务,对PDF文档实现更全面的处理。此外,还可以通过SER模型发布实现对发票、证件等文档的关键信息抽取。该架构最大的优势在于支持自定义训练的模型发布,用户能够根据行业需求精调、微调模型。未来,我们将重点介绍行业模型的标注、训练与部署,敬请期待。

声明:本文为 真聊技术 原创,转载请联系授权。



看完本文有收获?请转发分享给更多人

关注「真聊技术」,提升综合技能



真聊技术

Base在AIGC应用、RAG、模型训练、LLM微调、微服务、领域驱动设计。



分享、点赞和在看就是最大的支持❤️


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询