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

基于PaddleOCR的图像文字识别与程序打包方法

目录

一、基本介绍

二、程序实现

1)环境配置

2)代码实现

3)程序运行结果

三、程序打包

1)使用pyinstaller打包程序

2)添加依赖和模型数据

四、需要注意的问题

五、总结


一、基本介绍

       本文主要介绍利用现有开源的图像文字识别(OCR)库,开发一个简单的程序,用于识别图像中的文字信息。当前,开源的OCR库有很多,比如国外的Tesseract、EasyOCR,国内百度、阿里、腾讯等均提供了相应的开源工具包。百度的PaddleOCR在中文识别上准确率很高,百度开发的paddleocr库也为人工智能开发提供了各类算法模型,在人工智能开发领域运用比较广泛。本文基于PaddleOCR,在python中利用百度已经训练好的OCR模型库,完成对图像中文字识别,并将开发程序打包,使其可移植到其他电脑终端使用。

二、程序实现

1)环境配置

(1)新建工程

        python程序开发使用的IDE工具是pyChram2023.1.21版,直接新建一个纯python项目,并新构建一个虚拟环境,基本设置如下,工程路径可自定义。

(2)安装依赖包

        使用PaddleOCR需要安装两个依赖包,分别是paddlepaddle和paddleocr。这两个依赖包均安装在上一步建立的虚拟环境下(venv_WZSB)。需要注意的是,paddleocr目前只支持到python3.8到python3.11版本,若使用的python版本不在此区间,需要安装一个在此区间的版本,并将当前python解释器设置为此可用的版本,否则paddleocr将安装失败。

 

2)代码实现

       使用python编写一个简易的窗口程序,用于加载显示需要识别的图片,并将识别的结果显示在窗口中。

     (1)设置模型存放路径

       首先在代码中设置paddleocr训练模型的存放路径,代码如下。由于我们使用百度工程师已经训练好的模型,所以我们不用再编写具体的文字识别模型,直接使用即可。下面的代码分别表明了检测、识别和分类3个模型文件的存放路径。此处设置的是直接放置在当前工作目录下,若目录下不存在路径和模型,则程序在初次运行时会直接从官网上下载相应模型文件,并存放大指定路径中。

# 自定义模型存储路径  模型不存在时,会自动下载到以下路径中
det_model_path = './det_model'  # 检测
rec_model_path = './rec_model'  # 识别
cls_model_path = './cls_model'  # 分类

      (2)实例化paddleocr对象

       以下代码实例化了一个paddleocr对象。对象参数指明了是否启用方向分类、识别的文字类型、模型文件路径、是否使用GPU等。需要进一步说明的是,此处参数中选择不使用GPU,因为我们此处安装的paddleocr版本是CPU版。百度paddle官网中提供了多个GPU版本的paddleocr,使用GPU版本需要英伟达显卡支持,并安装英伟达对应显卡的CUDA驱动平台,其安装操作比较繁琐,且一般电脑显卡也不支持paddleocr所适配的版本。因此,此处直接使用了CPU版,其运行效率也可以接受。

# 初始化OCR实例
ocr = PaddleOCR(use_angle_cls=True,  # 启用方向分类lang="ch",  # 中文识别det_model_dir=det_model_path,rec_model_dir=rec_model_path,cls_model_dir=cls_model_path,use_gpu=False,  # 是否使用GPUpage_num=0  # PDF页数选择
)

     (3)识别图像文字

    完成图像文字识别只需调用对象的ocr()函数即可,参数说明如下:

  • image_path:这是一个字符串类型的参数,表示要进行文字识别的图像文件的路径。可以是本地文件系统中的绝对路径或相对路径。

  • cls=True:这个参数通常用于开启文本方向分类功能。有些图像中的文字可能存在不同的方向(如水平、垂直、倾斜等),开启该功能后,OCR 引擎会先对文字的方向进行分类识别,然后将文字调整到合适的方向再进行识别,从而提高识别的准确性。

  • result:这是一个变量,用于存储 OCR 识别的结果。结果的具体格式和内容取决于所使用的 OCR 库,一般会包含识别出的文字信息以及其在图像中的位置信息等。

    程序识别的文字信息放置在word_info[1][0]中,此处直接提取出来用于显示。

result = ocr.ocr(image_path, cls=True)
strs = ''
# 解析并打印结果
for line in result:for word_info in line:text = word_info[1][0]confidence = word_info[1][1]# print(f"识别内容: {text} | 置信度: {confidence:.2f}")# print(text)strs = strs + text + '\n'

3)程序运行结果

       如下图所示,随意选取一张带中英文的图片,图中文字信息能够被全部准确识别,说明百度提供的paddleocr库效果很不错。

三、程序打包

        pyinstaller是python提供的一个非常实用的打包工具,但直接使用该工具打包后的本项目exe程序并不能在其他电脑上运行,因为程序运行使用到了模型数据,所以需要对打包后的程序进行一些处理工作。网上也提供了很多其他打包paddleocr程序的方法,限于能力水平,均尝试不成功。下面是自己摸索出的一种可行的替代方式。

1)使用pyinstaller打包程序

        在PyCharm终端窗口中执行pyinstaller --onefile --windowed --collect-all paddleocr wenzishibie.py,完成后我们会在当前工程目录下看到新建了一个dist文件夹,在该文件夹中有一个exe可执行程序wenzishibie.exe。

2)添加依赖和模型数据

       如果直接执行上一步的wenzishibie.exe,程序会报错,缺少依赖库和模型数据,这时我们需要将模型数据和缺少的依赖库拷贝一份到dist文件夹中,如下图所示。正常情况下,pyinstaller命令会将程序所有依赖打包到wenzishibie.exe,但是此处确实仍然存在有依赖缺失的问题。mklml.dll文件就是缺失的动态库,我们在当前的虚拟环境中搜索到该文件,然后复制一份即可。此时我们在该文件夹下就可以直接运行wenzishibie.exe。

        将dist文件夹所有内容直接拷贝到其他电脑后,也可以正常运行wenzishibie.exe程序。若需要将dist文件夹中的内容再次打包为一个exe可执行程序,可以使用Enigma Virtual Box打包工具,也可参见使用winrar打包exe程序方法。

四、需要注意的问题

        1) 本项目的程序均是在新建的虚拟环境中编写的,因此所有依赖库的安装均应确保安装在了新的虚拟环境中,否则可能存在程序无法运行的问题。

        2)在程序打包过程中,我们可以直接将模型数据文件夹拷贝到dist文件中,使其与可执行文件wenzishibie.exe在同一目录下,以确保程序运行时能找到模型文件,并可进一步将程序封装为一个可执行文件,是因为我们在程序代码实现中加载模型时使用的是相对路径(det_model_path = './det_model' ),程序运行时将直接从wenzishibie.exe所在路径下去查找模型文件。如果我们在代码中不使用此路径,则本文所介绍的程序打包方法将不适用,因为程序运行时将无法找到模型文件,除非在移植的电脑上将模型文件复制到代码指定路径下,但这样做失去了程序打包移植的意义。

五、总结

        本文介绍了使用paddleocr库编写一个图像文字识别的简单程序,并通过在代码中的特殊处理,结合pyinstaller工具实现图像识别程序打包移植。使用paddleocr库进行文字识别开发简单高效,文字识别率准确率也很高。项目所使用的源代码和模型数据库可从此处下载,以作参考。

相关文章:

基于PaddleOCR的图像文字识别与程序打包方法

目录 一、基本介绍 二、程序实现 1)环境配置 2)代码实现 3)程序运行结果 三、程序打包 1)使用pyinstaller打包程序 2)添加依赖和模型数据 四、需要注意的问题 五、总结 一、基本介绍 本文主要介绍利用现有开源…...

单片机上SPI和IIC的区别

SPI(Serial Peripheral Interface)和IC(Inter-Integrated Circuit)是两种常用的嵌入式外设通信协议,它们各有优缺点,适用于不同的场景。以下是它们的详细对比: — 1. 基本概念 SPI&#xff0…...

Python 字典(一个简单的字典)

在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…...

一个简单的Windows TCP服务器实现

初始化 WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr { 0x00 }; struct sockaddr_in clientAddr { 0x00 }; int clientAddrLen sizeof(clientAddr);if (WSAStartup(MAKEWORD(2, 2), &wsaData) ! 0) {printf("WSAStartup f…...

Node.js笔记入门篇

黑马程序员视频地址: Node.js与Webpack-01.Node.js入门 基本认识 概念 定义:Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本 作用:使用Node.js 编写服务器端程序 ✓ …...

EX_25/2/10

epoll实现多路客户端之间的登录注册及消息和文件传输 服务器部分 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include…...

python视频爬虫

文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析&#xff0c;利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求&#xff0c;可以通过get&#xff0c;p…...

RbFT:针对RAG中检索缺陷的鲁棒性微调

今天给大家分享一篇最新的RAG论文&#xff1a; 论文题目&#xff1a;Enhancing Retrieval-Augmented Generation: A Study of Best Practices 论文链接&#xff1a;https://arxiv.org/pdf/2501.18365 论文代码&#xff1a;https://github.com/StibiumT16/Robust-Fine-tuning 研…...

证明: 极限的局部有界性

在考研数学中&#xff0c;极限的局部有界性是一个非常重要的概念&#xff0c;尤其是在讨论函数的连续性、可积性和可微性等性质时。局部有界性可以帮助我们理解函数在某些区域内的行为。 定理&#xff1a; 如果 lim ⁡ x → x 0 f ( x ) L \lim_{x \to x_0} f(x) L limx→x0…...

51单片机俄罗斯方块计分函数

/************************************************************************************************************** * 名称&#xff1a;scoring * 功能&#xff1a;计分 * 参数&#xff1a;NULL * 返回&#xff1a;NULL * 备注&#xff1a;采用非阻塞延时 ****************…...

new 以及 call、apply、bind 关键字解析

1.new关键字 自动创建对象&#xff1a;使用new调用构造函数时&#xff0c;会自动创建一个空对象&#xff0c;并将其赋值给this。你不需要显式地使用{}来创建对象。 绑定this到新对象&#xff1a;构造函数内部的this指向新创建的对象&#xff0c;因此可以在构造函数中为新对象添…...

【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器

用Deepseek搭建免费的个人知识库–综合教程&#xff08;完整版&#xff09;&#xff1a;第二篇&#xff1a;Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了&#xff0c;我们的重点不在于那些简单的步骤&#xff0c;而是在需要为下一步做准备的地方更加…...

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…...

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…...

Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用

在这个春节&#xff0c;如一声春雷&#xff0c;DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢&#xff1f;在之前的文章 “使用…...

寒假2.6--SQL注入之布尔盲注

知识点 原理&#xff1a;通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信息 适用情况&#xff1a;一个界面存在注入&#xff0c;但是没有显示位&#xff0c;没有SQL语句执行错误信息&#xff0c;通常用于在无法直接…...

CTF中特别小的EXE是怎么生成的

我们在打CTF时候&#xff0c;出题的爷爷们给出的exe都很小 就10k左右&#xff0c;有的甚至就5k&#xff0c;那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作&#xff1a; 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...

git rebase 和 git merge的区别

Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录&#xff0c;合并之后&#xff0c;父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的&#xf…...

Gitlab中如何进行仓库迁移

需求&#xff1a;之前有一个自己维护的新仓库A&#xff0c;现在需要将这个仓库提交并覆盖另一个旧的仓库B&#xff0c;需要保留A中所有的commit信息。 1.方法一&#xff1a;将原有仓库A导出后再导入到新的仓库B中 适用场景&#xff1a;新的仓库B是一个待建仓库&#xff0c;相当…...

LabVIEW 开发航天项目软件

在航天项目软件开发中&#xff0c;LabVIEW 凭借其图形化编程优势被广泛应用。然而&#xff0c;航天项目的高可靠性、高精度及复杂环境适应性要求&#xff0c;使得在使用 LabVIEW 开发时&#xff0c;有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...

DriverStore Explorer:突破Windows驱动管理瓶颈,释放系统空间提升80%存储效率

DriverStore Explorer&#xff1a;突破Windows驱动管理瓶颈&#xff0c;释放系统空间提升80%存储效率 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 诊断存储异常&#xff1a;设…...

Windows下PyTorch CPU版安装全攻略:从下载到验证(含conda常用命令)

Windows平台PyTorch CPU版高效安装指南&#xff1a;从零基础到环境验证 在深度学习领域&#xff0c;PyTorch已成为最受欢迎的框架之一。对于Windows用户而言&#xff0c;特别是刚接触机器学习的新手&#xff0c;正确安装PyTorch是迈入这一领域的第一步。本文将详细介绍如何在Wi…...

Linux I2C设备驱动避坑指南:以MPU6050为例,详解i2c_transfer与数据读取失败

Linux I2C设备驱动深度调试&#xff1a;MPU6050通信稳定性问题全解析 当你在嵌入式系统中集成MPU6050传感器时&#xff0c;是否遇到过这样的场景&#xff1a;设备树配置正确&#xff0c;驱动代码逻辑清晰&#xff0c;但传感器数据读取却间歇性失败&#xff0c;内核日志中频繁出…...

Phi-4-mini-reasoning效果展示:同参数量级中推理准确率超Llama3-8B实测对比

Phi-4-mini-reasoning效果展示&#xff1a;同参数量级中推理准确率超Llama3-8B实测对比 1. 开篇亮点&#xff1a;小模型的大智慧 Phi-4-mini-reasoning这款仅有3.8B参数的轻量级开源模型&#xff0c;正在重新定义我们对小模型能力的认知。作为专为数学推理、逻辑推导和多步解…...

从单片机思维到FPGA思维:我用Xilinx Ego1做循迹小车踩过的那些‘坑’

从单片机思维到FPGA思维&#xff1a;Xilinx Ego1循迹小车开发实战避坑指南 第一次用FPGA做循迹小车时&#xff0c;我盯着Vivado里密密麻麻的时序报告发呆了半小时——这和我熟悉的单片机开发完全是两个世界。作为有三年STM32开发经验的工程师&#xff0c;本以为凭借Verilog语法…...

SGMICRO圣邦微 SGM803B-JXN3G/TR SOT-23-3 监控和复位芯片

特性 适用于MAX803/MAX809/MAX810和ADM803/ADM809/ADM810的卓越升级版 高精度固定检测选项:3V、3.3V和5V 低供电电流:300nA(典型值)上电复位脉冲宽度:150毫秒(最小值) 复位输出选项: 开漏nRESET输出(SGM803B)推挽nRESET输出(SGM809B) . . 推挽复位输出(SGM810B)复位有效电压低至…...

Joy-Con Toolkit终极指南:快速解锁Switch手柄隐藏功能

Joy-Con Toolkit终极指南&#xff1a;快速解锁Switch手柄隐藏功能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Switch手柄设计的开源控制软件&#xff0c;为游戏玩家提供前所…...

探索AI辅助开发新范式:让快马平台成为你的专属前端智囊

最近在做一个需要收集用户反馈的小项目&#xff0c;发现用传统的表单方式实在太死板了。正好看到InsCode(快马)平台的AI辅助开发功能&#xff0c;决定试试用AI生成一个交互式反馈墙。没想到整个过程出奇地顺利&#xff0c;这里分享一下我的实践心得。 需求分析阶段 我首先在平…...

协方差矩阵可视化指南:如何用Seaborn热力图解读变量关系(附完整代码)

协方差矩阵可视化指南&#xff1a;如何用Seaborn热力图解读变量关系&#xff08;附完整代码&#xff09; 在数据分析的实际工作中&#xff0c;我们常常需要向非技术背景的决策者解释复杂的统计结果。这时候&#xff0c;一张直观的热力图往往比几十页的统计报告更有说服力。协方…...

Oracle日期处理进阶:除了EXTRACT,这些场景你还可以试试INTERVAL和TO_CHAR

Oracle日期处理进阶&#xff1a;解锁INTERVAL与TO_CHAR的高阶应用场景 在Oracle数据库的日常开发中&#xff0c;日期时间处理是每个开发者都无法回避的课题。当我们已经熟练掌握了EXTRACT这类基础函数后&#xff0c;往往会发现单纯提取日期部分已经无法满足复杂业务场景的需求—…...