Python自动化(5)——ocr识字

Python自动化(5)——ocr识字

通过网络识字

网络识字的平台有很多,主要有百度以及科大讯飞,这里以百度智能云来简单示例。
首先需要在百度智能云上注册一个账号,并创建一个应用,网址:
https://console.bce.baidu.com/ai/#/ai/ocr/app/list
在这里插入图片描述
获取到API Key和Secret Key之后,python安装request模块。
接下来就可以写代码了,此处直接上代码(部分):

获取百度智能云的access token

    def getAccessToken(self):# 获取token值# client_id 为官网获取的API_KEY, client_secret 为官网获取的SECRET_KEYhost = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=' + \'client_credentials&client_id=' + self.apiKey + \'&client_secret=' + self.secretKeyresponse = requests.get(host)access_token = response.json()['access_token']return access_token# 联网识字,通过百度api识字# @border 识别区域# @type 识别方式,默认是2(通用文字识别(标准含位置版))def getWordsByBaiDu(self, border=None, type=2):assessToken = self.getAccessToken()request_url = Noneif type == self.type_general_basic:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"# 通用文字识别(标准版)1000次/月,QPS/并发:2qpselif type == self.type_general:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general"# 通用文字识别(标准含位置版)1000次/月,QPS/并发:2qpselif type == self.type_accurate_basic:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"# 通用文字识别(高精度版)1000次/月,QPS/并发:2qpselif type == self.type_accurate:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate"# 通用文字识别(高精度含位置版)500次/月,QPS/并发:2qpselif type == self.type_webimage:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage"# 网络图片文字识别 1000次/月,QPS/并发:2qpselif type == self.type_webimage_loc:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage_loc"# 网络图片文字识别(含位置版)总量500次,QPS/并发:2qpselif type == self.type_table:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/table"# 表格文字识别V2 500次/月,QPS/并发:2qpselif type == self.type_handwriting:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting"# 手写文字识别 500次/月,QPS/并发:2qpselif type == self.type_numbers:request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/numbers"# 数字识别 1000次/月,QPS/并发:2qps# qimg = self.screen.captureScreen('getWords.png', border)try:f = open('getWords.png', 'rb')imgBytes = base64.b64encode(f.read())params = {"image":imgBytes}request_url = request_url + "?access_token=" + assessTokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)print(str(response.json()["words_result"]))except Exception as e:print('网络识图出错了')print(str(e))return []else:return response.json()["words_result"]

这里我实现的是通过截图的方式保存一张临时图片,然后再发送这张图片给百度识字。其中,self.apiKey填写获取到的API Key,self.secretKey填写获取到的Secret Key。百度智能云的OCR分了很多种不同场景使用的API,并且免费版的有次数和迸发限制,具体如下:
通用文字识别(标准版)1000次/月,QPS/并发:2qps
通用文字识别(标准含位置版)1000次/月,QPS/并发:2qps
通用文字识别(高精度版)1000次/月,QPS/并发:2qps
通用文字识别(高精度含位置版)500次/月,QPS/并发:2qps
网络图片文字识别 1000次/月,QPS/并发:2qps
网络图片文字识别(含位置版)总量500次,QPS/并发:2qps
表格文字识别V2 500次/月,QPS/并发:2qps
手写文字识别 500次/月,QPS/并发:2qps
数字识别 1000次/月,QPS/并发:2qps
其它的业务不免费。

使用一个文本文档来测试一下,测试代码以及结果:

from PyQt5.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
t = Text()
t.bind(2102088)
r = t.getWordsByBaiDu()

在这里插入图片描述

在这里插入图片描述
可以看到,基本上能正确识别出来结果(只是多了一个“》”号)。
这种方法的优缺点也很明显,优点是使用的是百度的识字模型,百度的识字模型一般都不会太差,并且也不用把模型保存在本地,可以省点空间,使用起来也很快捷。缺点是需要网络,并且有迸发限制,次数限制,还有网络延迟,可以说缺点比较多,因此更建议使用本地的OCR识字模块。

使用Easy OCR识字

首先安装EasyOCR模块。
接下来就比较简单,就是通过easyocr的模型来识别图片中的文字,直接上代码:

import easyocr
self.easyocr = easyocr.Reader(['ch_sim','en'])
def getWordsByEasyOcr(self, border=None):qimg = self.screen.captureScreen(None, border)res = self.easyocr.readtext(self.screen.qimageToNDArray(qimg))print('getWordsByEasyOcr words: '+str(res))return res
测试代码:
from PyQt5.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
t = Text()
t.bind(2691300)
r = t.getWordsByEasyOcr()

这里用到了屏幕截图的qimageToNDArray方法,就是用于将截取出来的图片(QImage类型)转换成可以被easyocr识别的NDArray类型。因为用到了屏幕截图,所以还是需要加上QApplication类
结果:
在这里插入图片描述
在这里插入图片描述
首次运行时,easyocr会自动下载所需的模型到电脑里,下载位置:C:\Users\Administrator.EasyOCR
创建easyocr的时候,传入的第一个参数是需要识别的语言,是一个数组,可以同时识别多种语言,easyocr常用的语言代号:
ch_sim:简体中文
ch_tra:繁体中文
en:英语
ja:日语
ko:韩语
de:德语
fr:法语
es:西班牙语
pt:葡萄牙语
注意,初始化easyocr时,会有一个warnning,意思是,CUDA不可用,默认使用CPU,使用GPU时,此模块的速度要快得多。如果要使用的话,可以开启显卡的CUDA功能,不过此处不做说明(因为本人也没有开启…)。创建easyocr类的时候是默认开启的,就算设置成不开启,也会弹提示,因此这里我就没管。
后面就是识字的结果,可以看到,是正确识别出我所输入的文本了。结果是一个大数组,每一段识别出来的文本都是一个元组(使用英文小括号括住的),元组里面第一个数组就是识别出的文本区域4个点的坐标,接着是识别出的文本,以及识别结果的相似度。
在这里插入图片描述
在这里插入图片描述
多行文本会识别出多段结果。
当然,easyocr也可以直接识别一张图片,传入一张图片的地址就行,例如:
t.easyocr.readtext(‘xxx.png’)
这样也能识别出图片中的文本。不过easyocr有一个问题,就是识别多行文本的时候,可能会识别不出来(我就试过,不过忘记了复现不出来),因此我使用了paddleocr。

使用Paddle OCR识字

paddlerocr的使用和easyocr其实差别不大,首先安装paddleocr模块。
接着同样是使用paddleocr直接识别就行:

self.paddleOcr = PaddleOCR(use_angle_cls=True, lang="ch")
def getWordsByPaddleocr(self, border=None):qimg = self.screen.captureScreen(None, border)res = self.paddleOcr.ocr(self.screen.qimageToNDArray(qimg))print('getWordsByPaddleocr words: '+str(res))return res

与easyocr相同,使用paddleocr同样需要下载模型,首次运行时会自动下载所需的模型。创建paddleocr时,use_angle_cls参数用于确定是否使用角度分类模型,即是否识别垂直方向的文字。lang参数定义需要识别的文字类型,ch是中文。
Paddleocr常用的语言代号:
ch:中文
en:英语
japan:日语
korean:韩语
german:德语
fr:法语
测试代码:
from PyQt5.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
t = Text()
t.bind(2691300)
r = t.getWordsByPaddleocr()
结果:
在这里插入图片描述
在这里插入图片描述
paddlerocr初始化时会有一大堆的log输出,这些可以忽略。识别结果还是比较准确的,格式和easyocr稍微有些不一样,这里我改了下方法,让识别结果的格式与easyocr识别结果一致。

def getWordsByPaddleocr(self, border=None):qimg = self.screen.captureScreen(None, border)res = self.paddleOcr.ocr(self.screen.qimageToNDArray(qimg))easyOcrRes = [] # 转换成EasyOcr的返回格式for i in range(len(res[0])):pos = res[0][i][0]text = res[0][i][1][0]similar = res[0][i][1][1]easyOcrRes.append((pos, text, similar))print('getWordsByPaddleocr words: '+str(res))return easyOcrRes

这样识别出来的结果经过封装后,和easyocr识别结果的格式一致了,这样使用的时候会方便一点。

完整自动化工程代码:https://gitee.com/chj-self/PythonRobotization

大佬们找到问题欢迎拍砖~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355402.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高速异地组网怎么办理?

在当今信息化时代,跨地域的远程办公、远程教育、远程医疗等需求越来越多。而高速异地组网作为一种解决不同地区之间快速组建局域网的方法,被广泛应用。本文将介绍一款异地组网内网穿透产品——【天联】,并提供其办理流程。 【天联】组网是什…

LoRa126X系列LoRa模块:专为物联网设计而生

LoRa126X是思为无线研发的一款应用于物联网应用的LoRa 前端模块系列,采用 Semtech 公司的 SX1262和SX1268 芯片。该系列模块具有小体积、低功耗,高灵敏度等特点,并且严格遵循无铅工艺生产和测试流程,符合 RoHS 和 Reach 环保标准。…

oracle发送http请求

UTL_HTTP包让SQL和PLSQL能够调用超文本传输协议(HTTP),也就是说可以使用它在Internet上访问数据。 当包用HTTPS从Web site获取数据时,要使用Oracle Wallet,它是由Oracle Wallet Manager或者orapki utility创建。非HTT…

购物网站系统

摘 要 随着互联网的快速发展,不同的平台软件也不断涌出市场,在众多的平台中,购物网站深受人们的欢迎,也成为生活中不可缺少的一部分。经过对国内外购物情况的调查,社区购物在近几年来成为电商发展的新趋势&#xff0c…

VB实现加法计算

textbox1失去焦点,检查输入的值是否为数字。 textbox2中按下Enter键,检查输入的值是否为数字。 textbox3获得焦点,计算textbox1和textbox2的和。 Public Class Form1Private Sub TextBox1_LostFocus(sender As Object, e As EventArgs) Hand…

【AI大模型】Transformers大模型库(十一):Trainer训练类

目录 一、引言 二、Trainer训练类 2.1 概述 2.2 使用示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。 🤗 Transformers 提供了数以千计的预训练模型&am…

千呼新零售2.0【更新日志】持续更新ing

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

Mybatis中BaseEntity作用

新建各种对象的时候,一般来说,有几个属性是所有对象共有的,比如说id,is_del,is_enable这些,然后设置一个基础对象,以后新建所有对象的时候都继承它,就省的每次都要写这些共有的属性了

GPT-4系列模型,在文档理解中的多维度评测

著名云数据平台Snowflake的研究人员发布了一篇论文,主要对OpenAI的GPT-4系列模型进行了研究,查看其文本生成、图像理解、文档摘要等能力。 在DocVQA、InfographicsVQA、SlideVQA和DUDE数据集上对GPT-4、GPT-4 V、GPT-4 Turbo V OCR等进行了多维度测试。…

SD3发布,送你3个ComfyUI工作流

大家好,我是每天分享AI应用的萤火君! 这几天AI绘画界最轰动的消息莫过于Stable Diffusion 3(简称SD3)的发布。SD3是一个多模态的 Diffusion Transformer 模型,其在图像质量、排版、复杂提示理解和资源效率方面具有显著…

计算机考研|408第二轮复习是二刷王道还是先看强化课?

在基础复习完一轮后,大部分人会把前面的内容忘掉很多!这个时候不要着急进入强化,在强化阶段之前先把4本书再重新整理复习一遍,查缺补漏。然后再看王道强化课! 对于408这门具有大量知识需要学习的专业课,有…

【深度学习】智能手写数字识别系统

文章目录 一.实验课题背景说明1.1实验目的1.2实验环境1.2.1安装PyTorch1.2.2安装其他必要的库 二.模型说明2.1模型概述2.2模型结构 三.数据说明3.1 输入数据3.1.1输入数据特征3.1.2输入数据维度3.1.3输入数据预处理 3.2 数据格式3.2.1输出数据…

如何调用讯飞星火认知大模型的API以利用其卓越功能

摘要 讯飞星火认知大模型,作为科大讯飞精心打造的一款人工智能模型,在自然语言理解和生成方面展现出了卓越的能力。这款模型通过深度学习技术和大量数据的训练,具备了强大的语言理解、文本生成和对话交互等功能。 一、模型功能概述 讯飞星…

linux端口被占用 关闭端口

系列文章目录 文章目录 系列文章目录一、linux端口被占用 关闭端口1.参考链接2.具体命令 二、【linux关闭进程命令】fuser -k 和 kill -9 的区别1.参考链接2.具体命令 一、linux端口被占用 关闭端口 1.参考链接 linux端口被占用 关闭端口 2.具体命令 1.查看端口是否被占用 …

商超仓库管理系统

摘要 随着全球经济和互联网技术的快速发展,依靠互联网技术的各种管理系统逐渐应用到社会的方方面面。各行业的有识之士都逐渐开始意识到过去传统的人工管理模式已经逐渐成为企业发展的绊脚石,不再适应现代企业的发展需要。企业想要得到更好的发展&#…

FreeRtos-13资源管理

一、临界资源是什么 要独占式地访问临界资源,有3种方法: 1.公平竞争:比如使用互斥量,谁先获得互斥量谁就访问临界资源,这部分内容前面讲过。 谁要跟我抢,我就灭掉谁: 2.中断要跟我抢?我屏蔽中断 3.其他任务要跟我抢?我禁止调度器,不运行任务切换 二、暂停调度器…

【C语言】自定义类型

目录 一、结构体: 1、结构体的声明: 2、结构体的自引用: 3、结构体变量的定义和初始化: 4、结构体内存对齐: 5、结构体传参: 6、位段: 二、枚举类型: 三、联合体&#xff1a…

网络安全:什么是SQL注入

文章目录 网络安全:什么是SQL注入引言SQL注入简介工作原理示例代码 攻击类型为什么SQL注入危险结语 网络安全:什么是SQL注入 引言 在数字化时代,数据安全成为了企业和个人最关心的问题之一。SQL注入(SQL Injection)是…

【LLM之RAG】RAT论文阅读笔记

研究背景 近年来,大型语言模型(LLMs)在各种自然语言推理任务上取得了显著进展,尤其是在结合大规模模型和复杂提示策略(如链式思维提示(CoT))时。然而,LLMs 在推理的事实…

C++的智能指针 RAII

目录 产生原因 RAII思想 C11的智能指针 智能指针的拷贝与赋值 shared_ptr的拷贝构造 shared_ptr的赋值重置 shared_ptr的其它成员函数 weak_ptr 定制删除器 简单实现 产生原因 产生原因:抛异常等原因导致的内存泄漏 int div() {int a, b;cin >> a…