当前位置: 首页 > news >正文

「PaddleOCR」 模型应用优化流程

PaddleOCR 算是OCR算法里面较好用的,支持的内容多,而且社区维护的好(手把手教你,生怕你学不会),因此在国内常采用。目前已经更新到 2.8版本了,功能更加丰富、强大;目前支持通用OCR、表格识别、图片信息提取以及文档场景信息提取,基本覆盖了常用的场景

首先下载模型代码 https://github.com/PaddlePaddle/PaddleOCR
需要视频课程的可以看 https://aistudio.baidu.com/education/group/info/25207

参考资料:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/models_list.md

在这里插入图片描述
在这里插入图片描述

1、安装环境

首先PaddleOCR处理模型训练需要环境,数据打标工具PPOCRLabel也需要配置,因此一并配置好 conda 环境 paddle_ocr

创建conda环境 paddle_ocr,可以参考 doc/doc_ch/environment.md、installation.md 文件

# 推荐环境:
PaddlePaddle >= 2.1.2
Python 3.7
CUDA10.1 / CUDA10.2
CUDNN 7.6# 常规创建 conda环境
conda create -n paddle_ocr python=3.7		# python 版本可自定义*# 使用清华源加速下载
conda create --name paddle_ocr python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/# 激活paddle_ocr环境
conda activate paddle_ocr# 安装paddle等库
pip3 install --upgrade pip#如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
python3 -m pip install paddlepaddle-gpu==2.0.0 -i https://mirror.baidu.com/pypi/simple#如果您的机器是CPU,请运行以下命令安装
python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple更多的版本需求,请参照[安装文档](https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。# 安装标注软件 PPOCRLabel
pip install PPOCRLabel

2、数据标注

最新版的PaddleOCR内部不再包含PPOCRLabel,可以参考 https://github.com/ViatorSun/PPOCRLabel

将conda环境切换成 paddle_ocr,然后在终端输入 PPOCRLabel --lang ch 即可启动 PPOCRLabel 标注工具, --lang 设置界面语言(默认英文,仅支持中英文,中文ch、英文en),如下图所示

在这里插入图片描述

  1. PPOCRLabel 支持预标注,选择 PaddleOCR -> 选择模型,可以选择待识别文字的语言,如中英文、英文、法语等;
  2. 左下角的自动标注可以帮助将图片中的文字用 PaddleOCR模型检测并标注下,预标注的效果一般比较差,但是可以节省拉框的时间,还是有一定作用的
  3. 标注过程中会有几个txt文件用于保存数据,Cache.cach 用于保存预标注数据,fileState.txt记录图片标注状态,Label.txt 为导出的标记结果,rec_gt.txt 和 crop_img 为导出的识别结果,
# 修改 fileState.txt 文件,免去一张一张确认
import os
import os.path as ospshuffixes = [".jpg", ".jpeg", ".png"]
file_path = "/media/sun/Data/Dataset/OCR_Data/ocr_data"if osp.exists(file_path):with open(osp.join(file_path,"fileState.txt"), "w", encoding="utf-8") as f:for file in os.listdir(file_path):if osp.splitext(file)[-1].lower() in shuffixes:img_dir = osp.join(file_path, file)f.write(img_dir + "\t1\n")print(f"save {img_dir} \t1")

对于预标注的内容,未必全部适合项目需求,因此可以通过正则化将预标注内容筛选,降低手动删除目标框的低效

import re
import json
import os.path as ospLabel_dir = "/media/sun/DataYZ/DataSet/led_Digital/Label.txt"label_lst = []
if osp.exists(Label_dir):with open(Label_dir, "r", encoding="utf-8") as f:for line in f.readlines():print(line)save_data = []data_list = json.loads(line.split('\t')[-1].replace('\n', ''))for data in data_list:if bool(re.match(r'^[0-9.]+$', data["transcription"])):				# 只保留数字和小数点 的识别结果save_data.append(data)save_label = line.split('\t')[0] + '\t' + str(save_data) + '\n'label_lst.append(save_label)# 重写
with open(Label_dir, "w", encoding="utf-8") as f:for data in label_lst:f.write(data)

注意
发现标注工具有一个隐藏小问题(谈不上bug),可能跟后续的识别有关
当标注框的高与宽的比例大于 1.5则进行 90度旋转(默认顺时针旋转),如果想避免这种情况将红框两行代码注释掉就可以了
在这里插入图片描述

标注完所有的数据之后,需要划分数据集,可以采用PaddeOCR/PPOCRLabel/gen_ocr_train_val_test.py 脚本进行处理,–trainValTestRatio 设置三个数据集的比例,–datasetRootPath设置标注好的数据集路径,–detRootPath 生成的检测数据集路径,–recRootPath 生成识别数据集路径 即可。注意,标注文件中的框只能是四个点坐标,过多过少都会无法识别

至此,数据处理完成


3、模型训练

PaddleOCR 识别分为两个过程,目标区域的检测 det 以及 对目标区域的内容识别 rec

训练脚本如下,配置好 yaml 文件,即可直接训练,此处的 data/ 路径是博主自己创建的,避免与官方提供的 config/ 下的yaml 文件冲突,可将需要的 config/*.yaml 拷贝到 ./data 路径下

import os# detect 模型检测
command = "python3 tools/train.py -c data/det_r50_vd_db.yml"
print(command)
os.system(command)# rec 模型识别
command = "python tools/train.py -c data/ch_PP-OCRv3_rec.yml"
print(command)
os.system(command)

det.yaml 文件与 rec.yaml 几乎一致

其中 rec.yml 的 save_model_dir 为模型训练保存路径;pretrained_model 为预训练模型权重;save_inference_dir 为模型导出时的输出路径;character_dict_path 为字符词典路径;其余的就是 Train & Eval 数据集的路径需要修改;
在生成的 模型训练保存路径中,有 train.log 、config.yaml 、best_model 和其他中间epoch 权重

在这里插入图片描述


导出推理模型

训练过程中保存的模型权重

path.pdopt:优化器状态
path.states:训练中间信息
path.pdparams:保存的模型的参数

在这里插入图片描述

导出的推理模型格式为 inference.pdmodel、inference.pdiparams,其中 Global.save_inference_dir 不需要重复设置 *yaml 文件中已经包含了,如果 *.yaml 中已经设置过了,模型转换就无需再赋值,当然赋值了会以重新赋值的参数运行

注意!
此处有一点需要注意的就是 Global.pretrained_model 必须从新赋值,因为 *yaml 文件中的 pretrained_model 为训练时的预训练权重,此处为待导出的模型权重路径;
还有就是权重路径是 ./runs/20240703/det_r50_vd/best_model/model.pdopt/pdparams 省去后缀的路径,而不是文件夹的路径,因此必须填写到权重名

import os# det
os.system(f"python   tools/export_model.py    "f"-c data/det_r50_vd_db.yml   "f"-o Global.pretrained_model=./runs/20240703/det_r50_vd/best_model/model  "     	# 待转化权重f"Global.load_static_weights=False "# f"Global.save_inference_dir=./inference/20240704/db_r50/ ")# ocr
os.system(f"python3 tools/export_model.py "f"-c data/ch_PP-OCRv3_rec.yml   "f"-o Global.pretrained_model=./runs/20240703/rec_ppocr/best_model/model ")     	# 待转化权重# f"Global.save_inference_dir=./inference/20240704/rec_ppocr/ ")

模型推理

最后是模型推理,此处可以使用如下脚本预测,生成的结果在 inference_results 路径下

import os
import os.path as ospif __name__ == '__main__':img_path = "./test"det_model_dir = "./inference/20240710/det_infer"rec_model_dir = "./inference/20240710/rec_infer"for i, file in enumerate(os.listdir(img_path)):img = osp.join(img_path, file)command = f"python3 tools/infer/predict_system.py --image_dir={img} --det_model_dir={det_model_dir} --rec_model_dir={rec_model_dir} --use_angle_cls=false"print(command)os.system(command)

在这里插入图片描述

相关文章:

「PaddleOCR」 模型应用优化流程

PaddleOCR 算是OCR算法里面较好用的,支持的内容多,而且社区维护的好(手把手教你,生怕你学不会),因此在国内常采用。目前已经更新到 2.8版本了,功能更加丰富、强大;目前支持通用OCR、表格识别、图片信息提取…...

VUE2 子组件传多个参数,父组件函数接收所有入参并加自定义参数

需求中有个场景是需要在子组件中传多个参数&#xff0c;让父组件接收所有入参&#xff0c;并且父组件也要加自己的参数 1.子组件传多个参数给父组件 子组件 // 子组件 ChildComponent.vue <template><button click"sendDataToParent">传递数据给父组件…...

less和sass有啥区别哪个更加好

Less 和 Sass&#xff08;特别是其最流行的变体 SCSS&#xff09;都是 CSS 预处理器&#xff0c;它们扩展了 CSS 的功能&#xff0c;如变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等&#xff0c;以编程方式生成 CSS。它们之间的主要区别在于语法、功能和工具生态…...

Qt Design Studio 4.5现已发布

Qt Design Studio现已强势回归&#xff0c;生产力和可用性均得到大幅提升。无论是直观的3D编辑界面&#xff0c;还是与Figma和Qt Creator的无缝连接&#xff0c;新版Qt Design Studio将为您带来更好的产品开发体验。快来深入了解Qt Design Studio的全新功能吧&#xff01; 为3…...

GCN-LSTM实现时空预测

简介:现有的预测模型越来考虑时间和空间的相关性,统称为时空预测。这种预测模型往往比简单的序列模型(例如RNN、LSTM、GRU及其变体)、Transformer等效果更好。我使用Keras实现了该GCN-LSTM代码,因为Keras相比于torch更容易入手和理解。我实现了一个基于Keras的GCN网络层,…...

《算法笔记》总结No.6——贪心

一.简单贪心 贪心法是求解一类最优化问题的方法&#xff0c;它总是考虑在当前状态下局部最优(或较优)之后&#xff0c;来使全局的结果达到最优(或较优)的策略。显然&#xff0c;如果采取较优而非最优的策略(最优策略可能不存在或是不易想到)&#xff0c;得到的全局结果也无法是…...

久期分析与久期模型

目录 一、久期分析的理论原理 二、数据准备 三、Stata 程序代码及解释 四、代码运行结果 一、久期分析的理论原理 久期&#xff08;Duration&#xff09;是衡量债券价格对利率变动敏感性的重要指标。它不仅仅是一个简单的时间概念&#xff0c;更是反映了债券现金流回收的平均…...

MybatisPlus 使用教程

MyBatisPlus使用教程 文章目录 MyBatisPlus使用教程1、使用方式1.1 引入依赖1.2 构建mapper接口 2、常用注解2.1 TableName2.2 TableId2.3 TableField MyBatisPlus顾名思义便是对MyBatis的加强版&#xff0c;但两者本身并不冲突(只做增强不做改变)&#xff1a; 引入它并不会对原…...

bash: redi-cli: 未找到命令...

问题描述 在执行命令&#xff1a;redi-cli --bigkeys 提示&#xff1a;bash: redi-cli: 未找到命令... 确定服务器是否有Redis进程 ps -ef | grep redis查找Redis 文件信息 find / -name "redis-*"进入到当前目录 cd /usr/bin/再次执行命令 涉及redis-cli 连…...

linux 内核 红黑树接口说明

红黑树(rbtree)在linux内核中使用非常广泛,cfs调度任务管理&#xff0c;vma管理等。本文不会涉及关于红黑树插入和删除时的各种case的详细描述,感兴趣的读者可以查阅其他资料。本文主要聚焦于linux内核中经典rbtree和augment-rbtree操作接口的说明。 1、基本概念 二叉树:每个…...

【ELK】filebeat 和logstash区别

Filebeat 和 Logstash 都是 Elastic Stack (也称为 ELK Stack) 的重要组件&#xff0c;用于日志数据的收集、处理和传输。它们有不同的功能和使用场景&#xff1a; Filebeat 角色: 轻量级日志收集器。功能: 从指定的日志文件中读取日志数据。可以从多个源&#xff08;如文件、…...

CNN -1 神经网络-概述

CNN -1 神经网络-概述 一:芯片科技发展介绍了解1> 芯片科技发展趋势2> 芯片使用领域3> 芯片介绍1. 神经网络芯片2. 神经网络处理单元NPU(Neural Processing Unit)二:神经网络1> 什么是神经网络2> 神经元3> 人工神经网络三:卷积神经网络(CNN)入门讲解一…...

插片式远程IO模块:Profinet总线耦合器在STEP7配置

XD9000是Profinet总线耦合器&#xff0c;单个耦合器最多可扩展32个I/O模块&#xff01;本文将深入探讨插片式远程IO模块的应用&#xff0c;并揭秘Profinet总线耦合器在STEP7配置过程中的技巧与注意事项。 STEP7-MicroWINSMART软件组态步骤&#xff1a; 1、按照下图指示安装GSD…...

python3读取shp数据

目录 1 介绍 1 介绍 需要tmp.shp文件和tmp.dbf文件&#xff0c;需要安装geopandas第三方库&#xff0c;python3代码如下&#xff0c; import geopandas as gpdshp_file_path "tmp.shp" shp_data gpd.read_file(shp_file_path) for index, row in shp_data.iterro…...

pytorch实现水果2分类(蓝莓,苹果)

1.数据集的路径&#xff0c;结构 dataset.py 目的&#xff1a; 输入&#xff1a;没有输入&#xff0c;路径是写死了的。 输出&#xff1a;返回的是一个对象&#xff0c;里面有self.data。self.data是一个列表&#xff0c;里面是&#xff08;图片路径.jpg&#xff0c;标签&…...

Redis实践经验

优雅的Key结构 Key实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:id例&#xff1a;login:user:10长度步超过44字节&#xff08;版本不同&#xff0c;上限不同&#xff09;不包含特殊字符 优点&#xff1a; 可读性强避免key冲突方便管理节省内存&#x…...

分类题解清单

目录 简介MySQL题一、聚合函数二、排序和分组三、高级查询和连接四、子查询五、高级字符串函数 / 正则表达式 / 子句 算法题一、双指针二、滑动窗口三、模拟四、贪心五、矩阵六、排序七、链表八、设计九、前缀和十、哈希表十一、字符串十二、二叉树十三、二分查找十四、回溯十五…...

QUdpSocket 的bind函数详解

QUdpSocket 是 Qt 框架中用于处理 UDP 网络通信的类。bind 函数是此类中的一个重要方法&#xff0c;它用于将 QUdpSocket 对象绑定到一个特定的端口上&#xff0c;以便在该端口上接收 UDP 数据包。 函数原型 在 Qt 中&#xff0c;bind 函数的原型通常如下所示&#xff1a; b…...

[spring] Spring MVC - security(下)

[spring] Spring MVC - security&#xff08;下&#xff09; callback 一下&#xff0c;当前项目结构如下&#xff1a; 这里实现的功能是连接数据库&#xff0c;大范围和 [spring] rest api security 重合 数据库连接 - 明文密码 第一部分使用明文密码 设置数据库 主要就是…...

数据库数据恢复—SQL Server数据库由于存放空间不足报错的数据恢复案例

SQL Server数据库数据恢复环境&#xff1a; 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库&#xff0c;SQL Server数据库存放在D盘分区中。 SQL Server数据库故障&#xff1a; 存放SQL Server数据库的D盘分区容量不足&#xff0c;管理员在E盘中生…...

Swift-All快速上手:RM模型评测保姆级教程,小白也能搞定

Swift-All快速上手&#xff1a;RM模型评测保姆级教程&#xff0c;小白也能搞定 1. 前言&#xff1a;为什么要评测RM模型&#xff1f; 想象你训练了一个AI裁判&#xff0c;专门给AI生成的回答打分。但你怎么知道这个裁判判得准不准&#xff1f;这就是RM&#xff08;Reward Mod…...

OFA-VE系统在网络安全领域的视觉分析应用

OFA-VE系统在网络安全领域的视觉分析应用 1. 引言 网络安全监控正面临前所未有的挑战。随着网络攻击手段的日益复杂和隐蔽&#xff0c;传统的基于规则和签名的检测方法已经难以应对新型威胁。每天都有海量的图像和文本数据在网络中流动&#xff0c;其中可能隐藏着恶意内容、虚…...

Qwen2.5-72B大模型实战指南:GPTQ-Int4量化+128K上下文+Chainlit可视化交互全流程

Qwen2.5-72B大模型实战指南&#xff1a;GPTQ-Int4量化128K上下文Chainlit可视化交互全流程 1. 模型简介 Qwen2.5-72B-Instruct-GPTQ-Int4是Qwen大型语言模型系列的最新版本&#xff0c;代表了当前开源大模型领域的顶尖水平。这个72.7B参数的模型经过GPTQ 4-bit量化处理&#…...

OpenClaw+千问3.5-35B-A3B-FP8:个人知识库自动化更新系统

OpenClaw千问3.5-35B-A3B-FP8&#xff1a;个人知识库自动化更新系统 1. 为什么需要自动化知识库更新 作为一个长期依赖个人知识库的技术写作者&#xff0c;我深刻体会到手动维护知识库的痛点。每当遇到新资料&#xff0c;我需要经历"阅读→摘录→分类→归档"的全流…...

OpenClaw故障排查大全:Gemma-3-12b-it接口连接失败解决方案

OpenClaw故障排查大全&#xff1a;Gemma-3-12b-it接口连接失败解决方案 1. 问题背景与典型场景 上周我在本地部署Gemma-3-12b-it模型时&#xff0c;遭遇了OpenClaw连接失败的经典问题。明明模型服务已经启动&#xff0c;OpenClaw网关也显示运行正常&#xff0c;但每次发起请求…...

PHP中HTML标签过滤的5种有效方法

什么是XSS攻击&#xff1f; XSS&#xff08;Cross-Site Scripting&#xff09;攻击是指攻击者在网页中插入恶意脚本&#xff0c;当其他用户浏览该页面时&#xff0c;恶意脚本会被执行&#xff0c;从而盗取用户信息、会话令牌或进行其他恶意操作。 方法一&#xff1a;htmlspeci…...

Oracle VM VirtualBox快速上手指南——Win10环境下的下载与安装详解

1. 为什么选择VirtualBox搭建虚拟环境&#xff1f; 作为一个在虚拟化领域摸爬滚打多年的老手&#xff0c;我测试过市面上几乎所有主流虚拟机软件。对于Windows 10用户来说&#xff0c;Oracle VM VirtualBox绝对是入门虚拟化的首选利器。它最大的优势就是完全免费开源&#xff0…...

Arduino嵌入式工具库解析:按键消抖、字符串格式化与I²C通信

1. 项目概述utils_asukiaaa是一个面向 Arduino 平台的轻量级工具函数库&#xff0c;聚焦于三类高频嵌入式开发场景&#xff1a;机械按键消抖与状态机管理、字符串格式化处理、IC 总线设备通信封装。该库采用 C 命名空间组织&#xff08;utils_asukiaaa::button/utils_asukiaaa:…...

作家使用AI写小说:写作者必须接纳人工智能但我们依然珍贵

我最近在游乐场听到一段对话&#xff0c;这比任何分析师对泡沫的预测都更应该让AI公司高管担忧。一个男孩和一个女孩&#xff0c;大概10岁&#xff0c;正在争吵。"那是AI&#xff01;那是AI&#xff01;"女孩喊道。她的意思是男孩在沉溺于一种新的特殊胡言乱语&#…...

Linux内核死锁检测与Lockdep工具详解

1. Linux内核死锁问题概述在Linux内核开发中&#xff0c;死锁是一个令人头疼的问题。想象一下这样的场景&#xff1a;两个进程就像两个固执的人&#xff0c;各自握着对方想要的东西&#xff0c;却都不愿意先放手&#xff0c;结果就是双方都卡在那里动弹不得。这就是死锁的典型表…...