博客
关于我
Python批量图片识别并翻译——我用python给女朋友翻译化妆品标签!
阅读量:227 次
发布时间:2019-03-01

本文共 4987 字,大约阅读时间需要 16 分钟。

最近小编遇到一个生存问题,女朋友让我给她翻译英文化妆品标签。美其名曰:"程序猿每天英语开发,英文一定很好吧,来帮我翻译翻译化妆品成分",”来,帮我看看这个面膜建议敷几分钟“。。。。看来斥巨资买化妆品不算完,还需要会各种英文介绍。

默默收起大学考的一摞429分的四级证书,我打开了IDE。。。我打算开发一个能批量翻译的图片的 demo ,把家里的各种化妆品都翻译好。机智如我,是不会自己从训练模型做起的,打开有道智云的友好的AI接口页面 ,果然有图片翻译服务, 体验 了一下可是真不错,于是果断使用。

效果展示

Demo在 这里 ,一起来看看效果吧:

识别过程如下:

逐个看看效果哈!make up for ever 虽然没翻译成 玫珂菲 ,哈哈哈 但是关键词长期保湿、固定喷雾都翻译出来了 ~~棒

这个更是不明觉厉,韩文、英文混合都能翻译~~~

樱花水的表现也不错哦~

再乱入一个开起来更像包装盒的图片识别,效果不错,没受图片上文字倾斜等影响 :

调用API的准备工作——生成调用所需要的应用id和密钥

根据有道智云的接口约定,需要先在有道智云的个人页面上生成调用所需要的应用id和密钥,以便作为你的调用标识以及收费参考。。

具体步骤是:在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取调用接口用到的应用的id和密钥。具体个人注册的过程和应用创建过程详见文章 分享一次批量文件翻译的开发过程

开发过程介绍

1、api接口介绍

先介绍下该工程的核心部分,有道智云 图片翻译服务 的调用接口

API HTTPS地址: https://openapi.youdao.com/ocrtransapi

接口调用方式:POST

请求格式:表单

相应格式:JSON

接口调用参数

调用API需要向接口发送以下字段来访问服务。

字段名类型含义必填备注typetext文件上传类型True目前支持Base64,请置该字段值为1fromtext源语言True参考下方的 支持语言 (可设置为auto)totext目标语言True参考下方的 支持语言 (可设置为auto)appKeytext应用IDTrue可在 应用管理 查看salttextUUIDTrue1995882C5064805BC30A39829B779D7Bsigntext签名Truemd5(应用Id+q+salt+应用密钥)exttext翻译结果音频格式,支持mp3falsemp3qtext要识别的图片truetype为1时必填,图片的Base64编码docTypetext服务器响应类型,目前只支持jsonfalsejsonrendertext是否需要服务端返回渲染的图片,0:否;1:是,默认是0false0nullIsErrortext如果ocr没有检测到文字,是否返回错误,false:否;true:是,默认是falsefalse注意是字符串

签名生成方法如下:

1、将请求参数中的 应用ID appKey , 图片的Base64编码 q , UUID salt 和 应用密钥 按照 应用ID+q+salt+应用密钥 的顺序拼接得到字符串 str 。

2、对字符串 str 做 md5,得到32位大写的 sign (参考Java生成MD5示例,可点击右侧的JAVA示例)。

输出结果

返回的结果是json格式,具体说明如下:

字段名字段说明orientation图片所对应的方向lanFromocr所识别出来认为的图片中的语言textAngle图片的倾斜角度errorCode错误码lanTo目标语言resRegions图片翻译的具体内容-boundingBox区域范围,四个值: 左上角的x值,左上角的y值,区域的的宽,区域的高 例如:134,0,1066,249-linesCount行数(用于前端排版)-lineheight行高-context该区域的原文-linespace行间距-tranContent翻译结果

2、详细开发

这个demo使用python3开发,包括maindow.py,transclass.py,pictranslate.py三个文件。maindow.py主要实现界面部分,使用python自带的tkinter库,来进行图片文件选择、选择结果存放路径。transclass.py实现了图片读取、处理等逻辑,最后通过pictranslate.py中的方法来调用图片翻译API。

1、界面部分

主要元素:

root=tk.Tk()root.title("netease youdao translation test")frm = tk.Frame(root)frm.grid(padx='50', pady='50')btn_get_file = tk.Button(frm, text='选择待翻译图片', command=get_files)btn_get_file.grid(row=0, column=0, ipadx='3', ipady='3', padx='10', pady='20')text1 = tk.Text(frm, width='40', height='10')text1.grid(row=0, column=1)btn_get_result_path=tk.Button(frm,text='选择翻译结果路径',command=set_result_path)btn_get_result_path.grid(row=1,column=0)text2=tk.Text(frm,width='40', height='2')text2.grid(row=1,column=1)btn_sure=tk.Button(frm,text="翻译",command=translate_files)btn_sure.grid(row=2,column=1)root.mainloop()

获取待翻译图片文件的方法(此处设置的仅支持.jpg文件):

def get_files():    files = filedialog.askopenfilenames(filetypes=[('text files', '.jpg')])    translate.file_paths=files    if files:        for file in files:            text1.insert(tk.END, file + '\n')            text1.update()    else:        print('你没有选择任何文件')

获取结果存储路径:

def set_result_path():    result_path=filedialog.askdirectory()    translate.result_root_path=result_path    text2.insert(tk.END,result_path)

翻译按钮,调用了translate_files,该文件中的translate_files()方法最终调用了translate类的translate_files()方法:

def translate_files():    if translate.file_paths:        translate.translate_files()        tk.messagebox.showinfo("提示","搞定")    else :        tk.messagebox.showinfo("提示","无文件")

2、批量图片处理

transclass.py实现了图片读取、处理等逻辑,Translate类定义如下:

class Translate():    def __init__(self,name,file_paths,result_root_path,trans_type):        self.name=name        self.file_paths=file_paths  			# 待翻译文件路径        self.result_root_path=result_root_path  # 结果存放路径        self.trans_type=trans_type    def translate_files(self):        for file_path in self.file_paths:	#对批量图片逐个处理            file_name=os.path.basename(file_path)            print('==========='+file_path+'===========')            trans_reult=self.translate_use_netease(file_path) #对单个图片调用接口            resul_file=open(self.result_root_path+'/result_'+file_name.split('.')[0]+'.txt','w').write(trans_reult)     #返回结果写入    def translate_use_netease(self,file_content):  #调用有道接口,并返回结果        result= connect(file_content)        return result

3、有道api调用

pictranslate.py中封装了调用有道智云API的一些方法,其中最核心的是connect()方法,按照接口要求拼接了所需参数,发起请求并返回结果。

def connect(file_content,fromLan,toLan):    f = open(file_content, 'rb')  # 二进制方式打开图文件    q = base64.b64encode(f.read()).decode('utf-8')  # 读取文件内容,转换为base64编码    f.close()    data = {}    # data['from'] = '源语言'    # data['to'] = '目标语言'    data['from'] = 'auto'    data['to'] = 'auto'    data['type'] = '1'    data['q'] = q    salt = str(uuid.uuid1())    signStr = APP_KEY + q + salt + APP_SECRET    sign = encrypt(signStr)    data['appKey'] = APP_KEY    data['salt'] = salt    data['sign'] = sign    response = do_request(data)    result=json.loads(str(response.content, encoding="utf-8"))    print(result)    translateResults=result['resRegions']    print(translateResults)    pictransresult=""    for i in translateResults:        pictransresult=pictransresult+i['tranContent']+"\n"    return pictransresult

总结

又是一次愉快的开发体验,而且还是为数不多的求生成功体验 : P ,没想到借助开放平台的力量,图像识别,自然语言处理变得如此易如反掌,只要能正确发起请求,就能得到不错的翻译结果,剩下大把的时间用来和女朋友炫技,这感觉——爽!

 

转载地址:http://zkwv.baihongyu.com/

你可能感兴趣的文章
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>