[从零开始]用python制作识图翻译器·三

news2024/11/15 23:04:46

AlsoEasy-RecognitionTranslator

  • 具体实现
    • 开发环境准备和验证
      • 下载conda
      • 创建开发环境
      • 文字识别模块
        • 在线模块
        • 离线模块
      • 机器翻译模块
        • 在线模块
        • 离线模块
      • GUI
      • GUI-定位模块
      • GUI-截图模块

具体实现

开发环境准备和验证

前期测试项目文件已上传到我的仓库。

下载conda

conda是python的版本管理工具,因为不同库要求的python版本不一样,非常容易起冲突,所以建议装个conda来管理不同的生产环境,这里就偷个懒贴别人的安装教程了。

创建开发环境

cmd运行如下命令:

conda create -n test python==3.7.2

键入y并回车。
在这里插入图片描述
完成后cmd运行如下命令,进入测试环境(前面有环境名即进入了相应环境):

conda activate test

在这里插入图片描述
后面如果使用pip命令时出现"runtime out"错误,建议使用换源命令下载,以豆瓣换源下载torch为例:

pip install --index-url https://pypi.douban.com/simple torch

文字识别模块

在线模块

  使用百度的开放接口。虽然是免费的,但需要按照参考教程注册开发者帐号并申请调用权限,获取"APP_ID"、“API_KEY”、"SECRET_KEY"三个关键字。做完以上操作以后,在开发环境中使用pip命令添加依赖:

pip install baidu-aip
pip install chardet

然后用如下代码测试一下接口能否正常使用吧,将如下代码保存为py文件,并在cmd中相应目录下用python命令运行:

from aip import AipOcr

config = {
	'BAIDU_OCR_APP_ID': '',			# 这里写自己的 APP_ID
	'BAIDU_OCR_API_KEY': '',		# 这里写自己的 API_KEY
	'BAIDU_OCR_SECRET_KEY': ''		# 这里写自己的 SECRET_KEY
}
path = 'D:\pybox\folder\test\example1.jpg'	# 写上你要检测图片的绝对地址

# 下面的部分都不用动,检测的语言类型的关键字可以根据你检测图片的文字做变换
LANS = ['CHN_ENG','ENG','JAP','KOR']		# 记录语言类型的关键字
default_options = {				# 这里是一些检测选项
    "language_type": "JAP",			# 检测的语言类型,JAP表示日文
    "detect_direction": "false",    # 是否检测语言方向
    "detect_language": "true",      # 是否检测语言类型
    "paragraph": "false",           # 是否输出段落信息
    "probability": "false"          # 是否返回每段置信度
}

client = AipOcr(
	config['BAIDU_OCR_APP_ID'], 
	config['BAIDU_OCR_API_KEY'], 
	config['BAIDU_OCR_SECRET_KEY']
)

with open(path, 'rb') as f:
	result = client.basicGeneral(f.read(), default_options)
print(result)

这里提供一张样图和相应的测试结果
在这里插入图片描述
在这里插入图片描述

离线模块

  使用easyOCR模型,这个模型对游戏文本框这种文字明晰的简单环境识别率高,识别速度快。唯一比较麻烦的是初次使用需要下载模型。使用pip命令添加依赖:

pip install easyocr

如果出现"runtime out"错误,记得使用换源命令下载:

pip install --index-url https://pypi.douban.com/simple easyocr

如果模型下载得太慢了可以到我的百度里下载备份,提取码:vci8。
测试代码如下:

import easyocr
import os
__PATH__ = os.path.dirname(os.path.abspath(__file__))
__MODEL_PATH__ = os.path.join(__PATH__, '../model')
# ch_tra 繁体
LANS = ['ch_sim','en','ja','ko']
path = r'D:\pybox\folder\test\example4.jpg'     # 这里写自己测试图片的绝对路径

client = easyocr.Reader(
    lang_list = ['en','ja'],    # 识别语言,可多项
    download_enabled = True,    # 自动下载模型
    model_storage_directory = __MODEL_PATH__    # 设置模型保存路径
)
result = client.readtext(path)
print(result)

此处同样提供一张测试图样和测试结果:
在这里插入图片描述
在这里插入图片描述

  当然离线ocr模块也可以选择pp-ocr,虽然pp-ocr的功能十分强大并且识别率也是极高,但是pp-ocr的依赖十分复杂并且需要手动选择复杂模型,过程比较繁琐,故不推荐。
  tesseractOCR因为有python版本冲突、识别率较低等问题故不作考虑。

机器翻译模块

在线模块

  在线翻译同样选择百度的百度翻译(百度真好用!)。同样需要我们按照百度的官方教程申请权限,获取"appid"和"SECRET_KEY"关键字。
  因为百度翻译的api使用的网络请求接口的方式,故不需要再添加依赖,直接调用如下测试代码:

# API文档地址: https://fanyi-api.baidu.com/product/113
import hashlib
import json
from random import randint
import time
import urllib.request
import urllib.parse

MAX_RESP_TIME = 5   # 超时最大重传数
REQUEST_FAILED = -1 # 请求失败码
LANS = ['auto','zh','en','jp','kor']    # 语言类型关键字
encoding = 'utf-8'  # 编码用utf-8

SECRET_KEY = ''     # 填上自己的SECRET_KEY
options = {
    'appid': '',    # 填上自己的APP_ID
    'salt': '777',    # 只是一个随机数,用于和sign进行验证
    'from': 'en',   # 源语言类型,自己根据翻译内容做修改
    'to': 'zh',     # 目标语言类型,自己根据翻译内容做修改
    'q': '',        # 翻译的文本内容
    'sign': ''      # 数字签名
}

def trans(content, lfrom):
        url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
        options['q'] = content
        options['from'] = lfrom
        options['sign'] = getMD5(options['appid'] + content + options['salt'] + SECRET_KEY)
        html = getTranslateResponce(url, options)
        res = json.loads(html)
        i = 0 
        while i < MAX_RESP_TIME:
            if res.get('error_code') != REQUEST_FAILED:
                break
            i += 1
            print('本次请求失败,原因为:', res['error_msg'])
            time.sleep(1)
            html = getTranslateResponce(url, options)
            res = json.loads(html)
        print(res)

# md5加密生成数字签名sign
def getMD5(content):
    return hashlib.md5(content.encode(encoding)).hexdigest()

# 发送http网络接口请求
def getTranslateResponce(url, data):
    data = urllib.parse.urlencode(data).encode(encoding)
    response = urllib.request.urlopen(url, data)
    return response.read().decode(encoding)

test_text_en = 'A secret makes a woman woman.'
test_text_jp = '真実はいつもひとつ。'
trans(test_text_en, 'en')
trans(test_text_jp, 'jp')

得到结果:
在这里插入图片描述

离线模块

  在github上搜索“offline translate”,直接找高星项目。发现argos-translate简单好用,故冲之。
在这里插入图片描述
按照代码仓库readme的教程,pip下载依赖。

pip install argostranslate

当然因为是离线的,同样也需要下载模型。不过可以直接用代码中下载,下载速度也很快:

# API文档地址: https://github.com/argosopentech/argos-translate
# 模型下载地址:https://www.argosopentech.com/argospm/index/
from email.policy import default
from argostranslate import package, translate

# 中-3 英-0 日-16 韩-17
LANS = [3, 0, 16, 17]
MIDDLEWARE = 0  # 中间转换语言
options = {
    'from': LANS[2],
    'to': LANS[0]
}
translation = [None, None]
client = translate.get_installed_languages()    # 下载语言包
print(package.get_available_packages())         # 查看能用的语言包
# 因为都是某语言译英或者英译某语言,所以如果源语言和目标语言不包含英语时需要进行二次转换
def trans(content):
    if options['from'] == MIDDLEWARE | options['to'] == MIDDLEWARE:
        translation[0] = client[options['from']].get_translation(client[options['to']])
        return translation[0].translate(content)
    else:
        translation[0] = client[options['from']].get_translation(client[MIDDLEWARE])
        translation[1] = client[MIDDLEWARE].get_translation(client[options['to']])
        mid = translation[0].translate(content)
        return translation[1].translate(mid)

result = trans('真実はいつもひとつ。')
print(result)

注意:argostranslate只支持某译英或英译某,所以在源语言和目标语言中不含英语时,需要先翻译成英语再翻译成目标语言。因此日译汉时会出现不小的精度损失。

在这里插入图片描述

GUI

  前文已经解释过选择pyqt而非wxpython的原因。直接pip添加GUI的依赖:

pip install PyQt5

测试代码如下:

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit
import PyQt5.QtWidgets as QT

# 应用
app = QApplication([])

# 绘制窗口
window = QMainWindow()
window.resize(500, 400)
window.move(300, 310)
window.setWindowTitle('薪资统计')

textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)
textEdit.resize(300,350)

button = QPushButton('统计', window)
button.move(380,80)

# 事件注册
def handleCalc():
    window.close()
button.clicked.connect(handleCalc)

# 窗口显示
window.show()
app.exec_()

演示结果(这只是一个简单的demo,点击统计按钮窗口就会关闭):
在这里插入图片描述

GUI-定位模块

import sys,math
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class Drawing(QWidget):
    def __init__(self, parent = None):
        super(Drawing, self).__init__(parent)
        self.resize(600,400)
        self.setWindowTitle('拖拽绘制矩形')
        self.rect = None
        
    #重写绘制函数
    def paintEvent(self, event):
        #初始化绘图工具
        qp = QPainter()
        #开始在窗口绘制
        qp.begin(self)
        #自定义画点方法
        if self.rect:
            self.drawRect(qp)
        #结束在窗口的绘制
        qp.end()

    def drawRect(self, qp):
        #创建红色,宽度为4像素的画笔
        pen = QPen(Qt.red, 4)
        qp.setPen(pen)
        qp.drawRect(*self.rect)
    
    #重写三个时间处理
    def mousePressEvent (self, event):
        print("mouse press")
        self.rect = (event.x(), event.y(), 0, 0)
    def mouseReleaseEvent (self, event) :
        print("mouse release")

    def mouseMoveEvent(self, event):
        start_x, start_y = self.rect[0:2]
        self.rect = (start_x, start_y, event.x() - start_x, event.y() - start_y)
        self.update()

if __name__ == '__main__':
    app=QApplication(sys.argv)
    demo=Drawing()
    demo.show()
    sys.exit(app.exec_())

测试效果(在窗口内用鼠标拖拽绘制矩形):
在这里插入图片描述

GUI-截图模块

from PIL import ImageGrab
import os
__dir__ = os.path.dirname(os.path.abspath(__file__))
__cache_path__ = os.path.join(__dir__, '../shot_cache.jpg')

position = [100, 0, 500, 1000] # 左上右下定位

# 开始截图
def capturePhoto(position):
    # 左上右下
    img = ImageGrab.grab(position)
    img.save(__cache_path__)
    return img

img = capturePhoto(position)
# 显示截图
img.show()

测试效果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day863.协程 -Java 并发编程实战

协程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程&#xff0c;但线程是个重量级的对象&#xff0c;不能频繁创建、销毁&#xff0c;而且线程切换的成本也很高&#xff0c;为了解决这些问题&#xff0c;Java SD…

C++设计模式(4)——策略模式

策略模式 亦称&#xff1a; Strategy 意图 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 问题 一天&#xff0c; 你打算为游客们创建一款导游程序。 该程序的核心…

什么是CNCF云原生

一、CNCF简介 CNCF&#xff1a;全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于2015年12月11日&#xff0c;是一个开源软件基金会&#xff0c;它致力于云原生&#xff08;Cloud Native&#xff09;技术的普及和可持续发展。…

golang 错误处理channel+error真的香

官方推荐golang中错误处理当做值处理&#xff0c; 既然是值那就可以在channel中传输&#xff0c;本文带你看看golang中channelerror来做异步错误处理有多香&#xff0c;看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗&#xff1f; 场景 如下&#xff0…

LeetCode刷题笔记 - JavaScript(二)

文章目录1.剑指 Offer 60. n个骰子的点数2.面试题67. 把字符串转换成整数3.面试题59 - II. 队列的最大值剑指 Offer 60. n个骰子的点数 面试题67. 把字符串转换成整数 面试题59 - II. 队列的最大值 1.剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上&#xff0c;所有骰子朝上一…

Java运行机制

java的运行机制 Java程序的运行机制分为编写、编译和运行三个步骤。 1.编写 编写是指在Java开发环境中进行程序代码的编辑&#xff0c;最终生成后缀名为“.java”的Java源文件。 2.编译 编译是指使用Java编译器对源文件进行错误排查的过程&#xff0c;编译后将生成后缀名为…

一篇文章带你熟悉Ajax

文章目录一、AJAX 简介二、创建 AJAX 的基本步骤1. 创建 XMLHttpRequest 对象2.向服务器发送请求3.服务器响应状态一、AJAX 简介 ☀️AJAX 的英文全称为 Asynchronous JavaScript And XML&#xff0c;Asynchronous 是异步的意思。何为异步呢&#xff1f;在这里异步是指通过 AJA…

IT运维服务体系的总体架构是什么?

大家好&#xff0c;我是技福的小咖老师。 今天我们来简单介绍一下IT运维服务体系的总体架构。 运维服务体系由运维服务制度、运维服务流程、运维服务组织、运维服务队伍、运维技术服务平台以及运行维护对象六部分组成&#xff0c;涉及制度、人、技术、对象四类因素。制度是规…

每日一题-力扣(leetcode)2368. 受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

激光雷达对植被冠层结构和SIF同时探测展望

前言陆表植被在全球碳循环中起着不可替代的作用。但现阶段&#xff0c;人们对气候变化与植被生态理化功能的关系的研究还不够完善。为了提高气候预测以及缓解气候恶化的速率&#xff0c;对植被参数比如&#xff1a;叶面积指数&#xff08;leaf&#xff09;、植被冠层结构&#…

JavaScript JSON序列化和反序列化

文章目录JavaScript JSON序列化和反序列化概述JSON序列化JSON.stringify()仅一个参数使用使用2个参数使用3个参数其他自定义toJson序列化顺序反序列化JSON.parse()仅一个参数使用使用2个参数eval()JavaScript JSON序列化和反序列化 概述 JSON数据在网络传输时存在两种类型&am…

【虹科云展厅】虹科赋能汽车智能化云展厅专题回顾

虹科赋能汽车智能化云展厅 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更有技术工程…

PromQL之选择器和运算符

平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符 PromQL 匹配器 相等匹配器&#xff08;&#xff09; 选择与提供的字符串完全相同的数据 例&#xff1a;筛选出id“G1 Eden Space” 的数据 jvm_memory_used_bytes{id"G1 Eden Space"}…

Elasticsearch高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age&…

知识图谱与神经网络,神经调节知识网络图

1、图立方和知识图谱的区别和联系与区别 图网络&#xff0c;即Natural Graph&#xff0c;是基于世界各实体之间的自然关系表示而得到的图&#xff0c;他们的节点一般是某个特定网络中的实体&#xff08;人、物理机、分子&#xff09;。例如&#xff1a;社交网络、通信网络、蛋…

阿里云-ODPS SQL-日常开发日期、字符、数学运算、聚合函数函数使用技巧

文章目录1、背景2、 数据处理2.1、OLTP与OLAP概念2.2、OLTP与OLAP区别3、日常开发常用函数3.1、日期函数3.2、数学运算函数3.3、字符串处理函数3.4、聚合函数1、背景 数据仓库&#xff0c;是一个面向主题的、集成的、随时间变化的、信息本身相对稳定的数据集合。 数据仓库从Or…

2-Node.js 内置模块

Node.js 内置模块 简介 之前说过&#xff0c;Node.js 中重要的两句话是 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。 上面两句话&#xff0c;可以使用下面的图片来具体认识。…

【机器学习 - 5】:多元线性回归

文章目录多元线性回归多元线性回归公式推导举例&#xff1a;波士顿房价取特征值RM为例取所有特证为例多元线性回归 多元线性回归方程&#xff1a;特征值为两个或两个以上。 以下是多元线性回归的模型&#xff0c;我们需要求出theta&#xff0c;使得真实值和预测值的差值最小。 …

2023寒假算法集训营1

A. World Final? World Cup! (I) &#xff08;模拟、枚举&#xff09; 题意&#xff1a; 给定一个长度为 10 的01串&#xff0c;表示 A、B 双方的点球情况&#xff0c;1 表示罚进&#xff0c;0 表示罚不进。 A 先手&#xff0c;交替罚点球&#xff0c;各罚五次。 得分多者…

C语言字符串操作函数(库函数)及其实现

库函数 函数介绍及模拟实现 1.1strlen 1.2strcpy 1.3strcat 1.4strcmp 1.5strncpy 1.6strncat 1.7strncmp 1.8strstr 1.9strtok 1.10strerror 1.11memcpy 1.12memmove 1.13memcmp 小结 本章重点&#xff1a; 重点介绍处理字符串和字符串的库函数的使用和注意事项…