paddle ocr
paddle ocr
- paddle ocr笔记
- 准备工作
- reference
- to onnx
- 文本检测
- 文本检测
- 文字识别
paddle ocr笔记
准备工作
- 下载字典ppocr_keys_v1.txt,下标从1开始
- 模型转换
reference
- paddlepaddle
to onnx
下载模型,或者直接使用python跑一下并且把本地模型拿过来用,一共三个模型:文本检测,文本方向校准,文字识别模型
paddle2onnx --model_dir ./det/ch/ch_PP-OCRv4_det_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./det-model.onnx --opset_version 11 --enable_onnx_checker Truepaddle2onnx --model_dir ./rec/ch/ch_PP-OCRv4_rec_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./rec-model.onnx --opset_version 11 --enable_onnx_checker Truepaddle2onnx --model_dir ./cls/ch_ppocr_mobile_v2.0_cls_infer --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./cls-padmodel.onnx --opset_version 11 --enable_onnx_checker True
文本检测
import onnxruntime
import cv2
import numpy as np# 读取图片
# image = cv2.imread("chinese.png")
image = cv2.imread("none.png")# 加载 ONNX 文本检测模型
det_session = onnxruntime.InferenceSession("./onnx/det-model.onnx")# 预处理
det_input = cv2.resize(image, (640, 640)) / 255.0 # 归一化
det_input = np.transpose(det_input, (2, 0, 1))[np.newaxis, :, :, :].astype(np.float32)# 推理
input_name = det_session.get_inputs()[0].name
output_name = det_session.get_outputs()[0].name
det_output = det_session.run([output_name], {input_name: det_input})[0]# 获取非零值的索引(文本区域)
non_zero_indices = np.nonzero(det_output)print(f'--------------------------')
print(f'len:{len(non_zero_indices[0])}')
# 打印非零值的索引及对应的值
for i in range(len(non_zero_indices[0])):print(f'--------------------------')coords = tuple(non_zero_indices[j][i] for j in range(len(non_zero_indices)))print(f"坐标: {coords}, 值: {det_output[coords]}")
文本检测
import onnxruntime
import cv2
import numpy as np# 读取图片
# image = cv2.imread("chinese.png")
# image = cv2.imread("none.png")
image = cv2.imread("oneline.png")# 加载 ONNX 文本检测模型
det_session = onnxruntime.InferenceSession("./onnx/det-model.onnx")# 预处理
det_input = cv2.resize(image, (640, 640)) / 255.0 # 归一化
# det_input = image / 255.0 # 归一化
det_input = np.transpose(det_input, (2, 0, 1))[np.newaxis, :, :, :].astype(np.float32)# 推理
input_name = det_session.get_inputs()[0].name
output_name = det_session.get_outputs()[0].name
det_output = det_session.run([output_name], {input_name: det_input})[0]#
#
#
# 获取非零值的索引(文本区域)
# non_zero_indices = np.nonzero(det_output)# print(f'--------------------------')
# print(f'len:{len(non_zero_indices[0])}')
# # 打印非零值的索引及对应的值
# for i in range(len(non_zero_indices[0])):
# print(f'--------------------------')
# coords = tuple(non_zero_indices[j][i] for j in range(len(non_zero_indices)))
# print(f"坐标: {coords}, 值: {det_output[coords]}")# 5. 确保 `det_output` 是 4D (batch, channels, height, width)
print("det_output shape:", det_output.shape)# 6. 获取二值化文本区域
box_thresh = 0.3
text_mask = (det_output[0, 0, :, :] > box_thresh).astype(np.uint8) * 255# 7. 确保 `text_mask` 是单通道 2D 图像
print("text_mask shape:", text_mask.shape) # 应该是 (height, width)# 8. 显示二值化结果(可选)
cv2.imshow("Text Mask", text_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()# 9. 确保 `text_mask` 兼容 OpenCV
if len(text_mask.shape) == 3:text_mask = cv2.cvtColor(text_mask, cv2.COLOR_BGR2GRAY)# 10. 轮廓检测
contours, _ = cv2.findContours(text_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 11. 打印检测到的文本框
for contour in contours:x, y, w, h = cv2.boundingRect(contour)print(f"检测到的文本框: x={x}, y={y}, w={w}, h={h}")
文字识别
import onnxruntime
import cv2
import numpy as np# 读取图片
image = cv2.imread("rec-cv2.imread.png")target_height = 48
h, w = image.shape[:2]
new_w = int(w * (target_height / h))
new_w = max(32, (new_w // 32) * 32)
image = cv2.resize(image, (new_w, target_height));
print(f'resize: {image.shape}')# image = cv2.imread("none.png")# 加载 ONNX 文本检测模型
rec_session = onnxruntime.InferenceSession("./onnx/rec-model.onnx")# 预处理
# rec_input = cv2.resize(image, (640, 640)) / 255.0 # 归一化
rec_input = image / 255.0 # 归一化
rec_input = np.transpose(rec_input, (2, 0, 1))[np.newaxis, :, :, :].astype(np.float32)print(f'shape: {rec_input.shape}')# 推理
input_name = rec_session.get_inputs()[0].name
output_name = rec_session.get_outputs()[0].name
print(f'input_name: {input_name}')
print(f'output_name: {output_name}')
rec_output = rec_session.run([output_name], {input_name: rec_input})[0]with open('onnx/dict.txt', 'r', encoding='utf-8') as f:dict_list = f.readlines()dict_list = [line.strip() for line in dict_list]# 返回下标的字典dict_index = {i + 1: char for i, char in enumerate(dict_list)}print(rec_output[0].shape)# 假设 rec_output[0] 的 shape 为 (60, 6625)
probabilities = rec_output[0] # 取出 (60, 6625)# Step 1: 找到每个时间步概率最高的索引
max_indices = np.argmax(probabilities, axis=1) # shape: (60,)# print(f'--dict: {dict_index}')
# Step 2: CTC 处理(去重)
decoded_text = []
prev_index = -1 # 记录前一个索引,避免重复
for index in max_indices:if index != prev_index and index in dict_index: # 避免重复 & 确保索引合法print(f'--index: {index}, dict[{index}] = dict_index[{index}]')decoded_text.append(dict_index[index])prev_index = index# Step 3: 转换为字符串
decoded_text = "".join(decoded_text)print("识别结果:", decoded_text)
相关文章:
paddle ocr
paddle ocr paddle ocr笔记准备工作referenceto onnx文本检测文本检测文字识别 paddle ocr笔记 准备工作 下载字典ppocr_keys_v1.txt,下标从1开始模型转换 reference paddlepaddle to onnx 下载模型,或者直接使用python跑一下并且把本地模型拿过来…...
通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析
背景 因为在不同的启动环境下,获取上下文路径的方式需要有所调整。在 IDEA 中运行时,路径是基于当前页面的 URL(如 index.html),而在 Tomcat 部署时,它是基于项目上下文路径(如 ssm-project&am…...
Spring Boot 整合 ElasticJob 分布式任务调度教程
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 ElasticJob 分布式任务调度教程 一、ElasticJob 简介 ElasticJob 是当当网开源的分布式任务调度解决方案,支持: …...
Django项目之订单管理part6(message组件和组合搜索组件)
一.前言 我们前面讲的差不多了,接着上节课讲,今天要来做一个撤单要求,我们可以用ajax请求,但是我这里介绍最后一个知识点,message组件,但是我会把两种方式都讲出来的,讲完这个就开始讲我们最重…...
[MySql] 多表关系, 多表查询
一. 多表关系 1.1 一对多 例如: 员工 - 部门表 (一个部门可以有多个员工) 并且在多的一方增加一个字段关联一的一方的主键. 外键约束: 物理外键 (使用 foreign key 定义外键关联另一张表的主键) 缺点: 影响增删改效率; 仅用于单节点, 不适用与集群; 易引发死锁, 性能低; …...
Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移
XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…...
一文详解QT环境搭建:Windows使用CLion配置QT开发环境
在当今的软件开发领域,跨平台应用的需求日益增长,Qt作为一款流行的C图形用户界面库,因其强大的功能和易用性而备受开发者青睐。与此同时,CLion作为一款专为C/C打造的强大IDE,提供了丰富的特性和高效的编码体验。本文将…...
MSTP和链路聚合
MSTP 802.1S --- MSTP --- 多生成树协议 --- 就是在RSTP基础上,再针对链路利用率低问题进行优化,可以和RSTP以及STP向下兼容。 实例 --- Instance --- 可以理解为一个V LAN或者多个VALN的集合。一个交换网络可以针对一个实例创建一棵树,起到…...
每天学一个 Linux 命令(8):ls
大家好,欢迎来到《每天掌握一个Linux命令》系列。在这个系列中,我们将逐步学习并熟练掌握Linux命令,今天,我们要学习的命令是ls。 01 什么是ls命令 在Linux系统中,ls命令是“list”的缩写,其英文全称为“list directory contents”,即“列出目录内容”。该命令非常实用…...
交换机、路由器、VLAN、单臂路由、三层交换、STP
华为模拟安装 1.依次安装wincap 2.wireshark 3.virtual box 4.ensp 一、设置 1.virtual box设置 2.计算机防火墙允许以上程序 3.eNSP设置 路由器:AR2240 交换机:S5700、CE12800 防火墙USG6000V 交换机 一、交换机工作原理 1、回顾 二层交换机…...
算法 | 2024最新算法:斑翠鸟优化算法原理,公式,应用,算法改进研究综述,matlab代码
基于斑翠鸟优化算法的原理、应用及改进研究综述 一、算法原理 斑翠鸟优化算法(Pied Kingfisher Optimizer, PKO)是2024年由Bouaouda等人提出的一种新型仿生智能优化算法,其灵感来源于斑翠鸟的捕食行为与共生关系。算法通过模拟斑翠鸟的栖息悬停、潜水捕鱼及与其他生物的共生…...
六十天Linux从0到项目搭建(第二十二天)(pipe、管道四种场景)
1 关于 pipe 系统调用的解析 int pipe(int pipefd[2]) 是 Unix/Linux 系统中用于创建匿名管道的系统调用。以下是关于管道特点的详细解释: 输出型参数 pipefd[2] 是输出型参数,调用成功后: pipefd[0] 存放管道的读取端文件描述符 pipefd[1…...
数据安全与网络安全——问答复习
目录 1、请简要分析勒索软件攻击的原理,并给出技术防护⽅案。 勒索软件攻击原理: 技术防护⽅案 2、举例数据安全问题 数据泄露 数据篡改 数据丢失 3、如何应对数据安全问题 技术层⾯ 管理层⾯ 4、软件漏洞 产⽣原因: 缓冲区溢出漏洞: 注⼊漏…...
ESP-01模块连接手机热点问题及解决方法
在使用ESP-01模块连接手机热点时,可能会遇到一些问题。本文将详细介绍如何解决这些问题,并分享最终通过将WiFi切换到2.4GHz成功解决问题的经验。 一、问题描述 在尝试使用ESP-01模块连接手机热点时,遇到了连接失败的问题。以下是操作过程中…...
go中锁的入门到进阶使用
Go 并发编程:从入门到精通的锁机制 引言:为什么需要锁? Go 语言以其天生支持并发的特性深受开发者喜爱,但并发带来的问题也不容小觑,比如数据竞争、并发安全等。如果多个 Goroutine 访问同一个变量,没有做…...
JS判断对象是否为空的方法
在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现: 方法 1:使用 Object.keys() javascript function isEmptyObject(obj) {// 确保是普通对象(排除 n…...
idea导入tomcat的jar
概述 对于老项目,未使用 Maven/Gradle 管理依赖的,在需要编译 Servlet/JSP 代码时,需要手动添加 Tomcat JAR 依赖(如 servlet-api.jar)方能进行编绎。 步骤: 1、找到 Tomcat 的 JAR 文件 进入 Tomcat 安…...
Linux 下安装和使用 Jupyter Notebook
Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染,推荐使用虚拟环境方式安装并启动它。本教程将教你如何: 安装 Python、pip、venv使用虚拟环境安装 Jupyter汉化安装实用插件设置登录密码启动并远程访问编写一个一键…...
【Ubuntu常用命令】
1.将本地服务器文件或文件夹传输到远程服务器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夹 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.从远程服务器传输文件到本地服务器 scp administrator10.60.51.20:/data/a.txt /h…...
UR机械臂sim2real推荐包
推荐一个和ur机械臂配套的interface: ur_rtde Universal Robots RTDE C Interface — ur_rtde 1.6.0 documentation 也欢迎大家提供新想法和bug...
HTTP协议深度解析详解
HTTP协议深度解析详解 一、HTTP协议基础架构 1.1 请求响应模型 #mermaid-svg-pAGwQipduFJRm11I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pAGwQipduFJRm11I .error-icon{fill:#552222;}#mermaid-svg-pAGwQipd…...
算法学习第十七天:LRU缓存与布隆过滤器
LRU缓存与布隆过滤器 目录 LRU缓存 基本概念实现原理C代码实现 布隆过滤器 基本概念实现原理C代码实现 LRU缓存 基本概念 LRU(Least Recently Used):最近最少使用策略,当缓存空间不足时,淘汰最久未被访问的数据。…...
html中img标签直接使用border-radius时会图片进行了遮挡
前言 该问题是我写完项目之后,UI走查发现的问题,虽然我也发现了问题,但是改起来,不好改,就耽搁了。后面UI还是要求要改。一直找不到解决方案,歪打正着通过MDN官网偶然看到的clip-path属性。 需求 一个图…...
【Keepalived】Keepalived-2.3.3明确结束对CentOS 7的支持
2025年3月30日,官方发布了Keepalived的最新版,版本号:2.3.3 而2024年11月3日发布的2.3.2版本,在CentOS 7.9上编译的时候,就出现了报错,但是在Alma Linux 8.10上,则可以成功编译安装,…...
Docker学习--容器生命周期管理相关命令--docker pause/unpause 命令
docker pause 命令的作用: 用于暂停一个或多个容器中的所有进程。 语法: docker pause CONTAINER [CONTAINER…](要操作的容器的名称,可以同时操作多个)。 实例: ①暂停一个容器及其所有进程:…...
【Zabbix技术系列文章】第④篇——Zabbix 数据可视化
在当今数字化运维时代,面对海量的监控数据,如何从中快速获取有价值的信息至关重要。Zabbix 的数据可视化功能为我们提供了直观、高效的解决方案,它能将复杂的监控数据转化为清晰易懂的图表和仪表盘,助力运维人员迅速发现问题、分析…...
R CSV 文件处理指南
R CSV 文件处理指南 引言 CSV(逗号分隔值)文件是一种常见的文件格式,它以纯文本形式存储表格数据。在R语言中,CSV文件处理是非常基础且重要的技能。本文将详细介绍如何在R中读取、处理和导出CSV文件,并探讨一些高级技…...
在Git仓库的Readme上增加目录页
一般在编写Readme时想要增加像文章那样的目录,方便快速跳转,但是Markdown语法并没有提供这样的方法,但是可以通过超链接结合锚点的方式来实现,如下图是我之前一个项目里写的Readme: 例如有下面几个Readme内容ÿ…...
[特殊字符]《多商户家政系统技术解析:SpringBoot+MyBatisPlus+UniApp高效实战指南》
🛠️ 引言:多商户家政系统的技术挑战与价值 在数字化时代,家政行业逐渐向线上迁移,从传统的线下预约转向平台化管理。多商户家政系统具备复杂的角色体系,包括: 🛎️ 商户端:管理订单…...
请求Header(Request Headers)详解
请求Header(Request Headers)详解 HTTP请求Header是HTTP请求消息的重要组成部分,用于在客户端和服务器之间传递附加信息。这些信息帮助服务器理解客户端的环境、偏好和请求的具体内容,从而能够返回更合适的响应。以下是对请求Hea…...
深度求索:开源革命下的AI普惠之路
引言:AI领域的破局者 2025年,全球AI领域因一家中国公司的崛起而震动。杭州深度求索(DeepSeek)推出的V3大模型以6710亿参数、14.8万亿token训练数据量,在数学竞赛、代码生成等专业领域超越多数国际竞品,其每…...
XSS 攻击(详细)
目录 引言 一、XSS 攻击简介 二、XSS 攻击类型 1.反射型 XSS 2.存储型 XSS 3.基于 DOM 的 XSS 4.Self - XSS 三、XSS 攻击技巧 1.基本变形 2.事件处理程序 3.JS 伪协议 4.编码绕过 5.绕过长度限制 6.使用标签 四、XSS 攻击工具与平台 1.XSS 攻击平台 2.BEEF 五…...
使用Redis实现轻量级消息队列
使用消息中间件如RabbitMQ或kafka虽然好,但也给服务器带来很大的内存开销,当系统的业务量,并发量不高时,考虑到服务器和维护成本,可考虑使用Redis实现一个轻量级的消息队列,实现事件监听的效果。下面介绍下…...
13届省赛python A组:10.数的拆分
题目1 数的拆分 给定 T 个正整数 ai,分别问每个 ai 能否表示为 x 1 y 1 ⋅ x 2 y 2 x1^{y1}⋅x2^{y2} x1y1⋅x2y2 的形式,其中 x1,x2 为正整数,y1,y2 为大于等于 2 的正整数。 输入格式 输入第一行包含一个整数 T 表示询问次数。 接下来…...
【Android Studio】下载安装过程(详细)
目录 一、前期准备 JDK下载安装 二、下载安装 下载 安装 启动 一、前期准备 JDK下载安装 详细的安装过程请移步我的另一篇博客jdk17详细安装步骤_jdk17安装教程详细-CSDN博客 cmd打开命令行,输入java -version验证,可以看到此处我安装的是java23。…...
【RAGFlow】ubuntu22部署ragflow(v0.17.2)
按照官方手册部署: https://ragflow.io/docs/v0.17.2/ 部署环境: CPU: 4核memory: 16gGPU: T4(vGPU)Disk: 20g 1. 配置国内docker-ce源 https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/ 用清华源,要不然下载速度感人 …...
Easysearch 如何短暂维护 Data 节点
之前介绍过如何移除 Data 节点,那么如果只是短暂停止一个 Data 节点进行维护,之后再次加入集群,是否也需要按照移除节点的步骤进行操作呢?我们先梳理下核心原理。 核心原理 我们先看看节点离开集群之后集群是怎样处理的。当节点…...
【cocos creator 3.x】3Dui创建,模型遮挡ui效果
官方文档:https://docs.cocos.com/creator/3.8/manual/zh/ui-system/components/editor/ui-model.html 1、3Dui创建 创建label,默认会添加canvas根节点和2dCamera 将Camera删除,canvas上组建去除cc.Canvas,cc.widget࿰…...
UE5学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针
文章目录 一主菜单搭建UI显示主菜单时,暂停游戏,显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式,放中间 显示主菜单时,暂停游戏࿰…...
有哪些开源的视频生成模型
1. 阿里巴巴通义万相2.1(WanX 2.1) 技术架构:基于Diffusion Transformer(DiT)架构,结合自研的高效变分自编码器(VAE)和Flow Matching训练方案,支持时空上下文建模。参数…...
基于Spring Boot的家庭理财系统app的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
SQLAlchemy系列教程:事件驱动的数据库交互
在现代Web应用开发中,数据库交互往往需要超越简单的CRUD操作。当用户注册成功后自动发送欢迎邮件?在订单创建时同步库存数据?这些场景都需要监听数据库状态变化并触发相应逻辑。SQLAlchemy的事件系统为此提供了优雅的解决方案。 本文将深入解…...
linux基本命令(2)--进程命令PS
其实吧, 在linux命令下 输入man ps也可以,一行行拖下去也是看到解析的。退出不看的时候记得按q哦 基本介绍 国际惯例介绍下这个命令的用途。 在Linux下ps命令是用于查看系统上运行的进程的最基本的命令之一。它提供了当前进程的同时,如用户ID…...
android adb 查看设备传感器
Android ADB 查看设备传感器的使用技巧 在Android开发中,了解设备的传感器是非常重要的一步。不论是开发健康应用、游戏,还是任何需要感知用户环境的应用,传感器的使用都离不开对其数据的获取。Android Debug Bridge(ADB…...
Verilog HDL 100道面试题及参考答案
目录 Verilog HDL 的四种基本逻辑值是什么? 关键字 reg 和 wire 的主要区别是什么? 解释阻塞赋值(=)与非阻塞赋值(<=)的区别,并举例说明。 如何声明一个双向端口(inout)? 位拼接操作符是什么?举例说明其用法。 拼接信号和常量 拼接常量和信号 重复拼接 以…...
Java基础-26-多态-认识多态
在Java编程中,多态(Polymorphism) 是面向对象编程的核心概念之一。通过多态,我们可以编写更加灵活、可扩展的代码。本文将详细介绍什么是多态、如何实现多态,并通过具体的例子来帮助你更好地理解这一重要概念。 一、什…...
安当CAS密码应用系统:构建企业级固件签名体系的解决方案
在工业互联网与智能设备爆发式增长的今天,固件安全已成为设备安全的"最后一道防线"。据IDC统计,2025年全球68%的固件攻击将利用密钥管理漏洞发起。传统固件签名方案依赖企业自购硬件加密机(HSM),不仅面临高额…...
文法 2025/3/3
文法的定义 一个文法G是一个四元组:G(,,S,P) :一个非空有限的终极符号集合。它的每个元素称为终极符号或终极符,一般用小写字母表示。终极符号是一个语言不可再分的基本符号。 :一个非空有限的非终极符号集合。它的每个元素称为…...
论文阅读:Dual Anchor Graph Fuzzy Clustering for Multiview Data
论文地址:Dual Anchor Graph Fuzzy Clustering for Multiview Data | IEEE Journals & Magazine | IEEE Xplore 代码地址:https://github.com/BBKing49/DAG_FC 摘要 多视角锚图聚类近年来成为一个重要的研究领域,催生了多个高效的方法。然而&#…...
【分享】内外网文件摆渡系统:让数据传输更安全更可靠
【分享】Ftrans内外网文件摆渡系统:让数据传输更安全更可靠! 随着大数据时代的到来,数据的重要性日渐得到重视,数据作为数字经济时代下的基础性资源和战略性资源,是决定国家经济发展水平和竞争力的核心驱动力。以行业…...