打造自己的RAG解析大模型:Windows部署OCR服务(可商业应用)

本篇文章将讲解如何将文本检测、方向分类和文本识别模型进行串联,最终搭建一个基础的 OCR 应用服务。通过这些模型的串联与部署,我们将能够创建一个可商用的 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, '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]]}]

结果说明:

返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下:

字段名称数据类型意义
anglestr文本角度
textstr文本内容
confidencefloat文本识别置信度或角度分类置信度
text_regionlist文本位置坐标

总结

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

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值