python 實現(xiàn)批量圖片識別并翻譯
近小編遇到一個生存問題,女朋友讓我給她翻譯英文化妝品標簽。美其名曰:"程序猿每天英語開發(fā),英文一定很好吧,來幫我翻譯翻譯化妝品成分",”來,幫我看看這個面膜建議敷幾分鐘“。。。??磥沓饩拶Y買化妝品不算完,還需要會各種英文介紹。
默默收起大學(xué)考的一摞429分的四級證書,我打開了IDE。。。我打算開發(fā)一個能批量翻譯的圖片的demo,把家里的各種化妝品都翻譯好。機智如我,是不會自己從訓(xùn)練模型做起的,打開有道智云的友好的AI接口頁面 ,果然有圖片翻譯服務(wù),體驗了一下可是真不錯,于是果斷使用。
效果展示
Demo在這里,一起來看看效果吧:
識別過程如下:
逐個看看效果哈!make up for ever 雖然沒翻譯成玫珂菲,哈哈哈但是關(guān)鍵詞長期保濕、固定噴霧都翻譯出來了~~棒
這個更是不明覺厲,韓文、英文混合都能翻譯~~~
櫻花水的表現(xiàn)也不錯哦~
再亂入一個開起來更像包裝盒的圖片識別,效果不錯,沒受圖片上文字傾斜等影響 :
調(diào)用API的準備工作——生成調(diào)用所需要的應(yīng)用id和密鑰
根據(jù)有道智云的接口約定,需要先在有道智云的個人頁面上生成調(diào)用所需要的應(yīng)用id和密鑰,以便作為你的調(diào)用標識以及收費參考。。
具體步驟是:在有道智云的個人頁面上創(chuàng)建實例、創(chuàng)建應(yīng)用、綁定應(yīng)用和實例,獲取調(diào)用接口用到的應(yīng)用的id和密鑰。具體個人注冊的過程和應(yīng)用創(chuàng)建過程詳見文章分享一次批量文件翻譯的開發(fā)過程
開發(fā)過程介紹
1、api接口介紹
先介紹下該工程的核心部分,有道智云圖片翻譯服務(wù)的調(diào)用接口
API HTTPS地址:https://openapi.youdao.com/ocrtransapi
接口調(diào)用方式:POST
請求格式:表單
相應(yīng)格式:JSON
接口調(diào)用參數(shù)
調(diào)用API需要向接口發(fā)送以下字段來訪問服務(wù)。
字段名 | 類型 | 含義 | 必填 | 備注 |
---|---|---|---|---|
type | text | 文件上傳類型 | True | 目前支持Base64,請置該字段值為1 |
from | text | 源語言 | True | 參考下方的 支持語言 (可設(shè)置為auto) |
to | text | 目標語言 | True | 參考下方的 支持語言 (可設(shè)置為auto) |
appKey | text | 應(yīng)用ID | True | 可在 應(yīng)用管理 查看 |
salt | text | UUID | True | 1995882C5064805BC30A39829B779D7B |
sign | text | 簽名 | True | md5(應(yīng)用Id+q+salt+應(yīng)用密鑰) |
ext | text | 翻譯結(jié)果音頻格式,支持mp3 | false | mp3 |
q | text | 要識別的圖片 | true | type為1時必填,圖片的Base64編碼 |
docType | text | 服務(wù)器響應(yīng)類型,目前只支持json | false | json |
render | text | 是否需要服務(wù)端返回渲染的圖片,0:否;1:是,默認是0 | false | 0 |
nullIsError | text | 如果ocr沒有檢測到文字,是否返回錯誤,false:否;true:是,默認是false | false | 注意是字符串 |
簽名生成方法如下:
1、將請求參數(shù)中的 應(yīng)用ID appKey , 圖片的Base64編碼 q ,UUID salt 和 應(yīng)用密鑰 按照 應(yīng)用ID+q+salt+應(yīng)用密鑰的順序拼接得到字符串 str 。
2、對字符串 str 做 md5,得到32位大寫的 sign (參考Java生成MD5示例,可點擊右側(cè)的JAVA示例)。
輸出結(jié)果
返回的結(jié)果是json格式,具體說明如下:
字段名 | 字段說明 |
---|---|
orientation | 圖片所對應(yīng)的方向 |
lanFrom | ocr所識別出來認為的圖片中的語言 |
textAngle | 圖片的傾斜角度 |
errorCode | 錯誤碼 |
lanTo | 目標語言 |
resRegions | 圖片翻譯的具體內(nèi)容 |
-boundingBox | 區(qū)域范圍,四個值: 左上角的x值,左上角的y值,區(qū)域的的寬,區(qū)域的高 例如:134,0,1066,249 |
-linesCount | 行數(shù)(用于前端排版) |
-lineheight | 行高 |
-context | 該區(qū)域的原文 |
-linespace | 行間距 |
-tranContent | 翻譯結(jié)果 |
2、詳細開發(fā)
這個demo使用python3開發(fā),包括maindow.py,transclass.py,pictranslate.py三個文件。maindow.py主要實現(xiàn)界面部分,使用python自帶的tkinter庫,來進行圖片文件選擇、選擇結(jié)果存放路徑。transclass.py實現(xiàn)了圖片讀取、處理等邏輯,最后通過pictranslate.py中的方法來調(diào)用圖片翻譯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='選擇翻譯結(jié)果路徑',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()
獲取待翻譯圖片文件的方法(此處設(shè)置的僅支持.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('你沒有選擇任何文件')
獲取結(jié)果存儲路徑:
def set_result_path(): result_path=filedialog.askdirectory() translate.result_root_path=result_path text2.insert(tk.END,result_path)
翻譯按鈕,調(diào)用了translate_files,該文件中的translate_files()方法最終調(diào)用了translate類的translate_files()方法:
def translate_files(): if translate.file_paths: translate.translate_files() tk.messagebox.showinfo("提示","搞定") else : tk.messagebox.showinfo("提示","無文件")
2、批量圖片處理
transclass.py實現(xiàn)了圖片讀取、處理等邏輯,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 # 結(jié)果存放路徑 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) #對單個圖片調(diào)用接口 resul_file=open(self.result_root_path+'/result_'+file_name.split('.')[0]+'.txt','w').write(trans_reult) #返回結(jié)果寫入 def translate_use_netease(self,file_content): #調(diào)用有道接口,并返回結(jié)果 result= connect(file_content) return result
3、有道api調(diào)用
pictranslate.py中封裝了調(diào)用有道智云API的一些方法,其中最核心的是connect()方法,按照接口要求拼接了所需參數(shù),發(fā)起請求并返回結(jié)果。
def connect(file_content,fromLan,toLan): f = open(file_content, 'rb') # 二進制方式打開圖文件 q = base64.b64encode(f.read()).decode('utf-8') # 讀取文件內(nèi)容,轉(zhuǎn)換為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
總結(jié)
又是一次愉快的開發(fā)體驗,而且還是為數(shù)不多的求生成功體驗 : P ,沒想到借助開放平臺的力量,圖像識別,自然語言處理變得如此易如反掌,只要能正確發(fā)起請求,就能得到不錯的翻譯結(jié)果,剩下大把的時間用來和女朋友炫技,這感覺——爽!
項目地址:https://github.com/LemonQH/BatchPicTranslate
以上就是python 實現(xiàn)批量圖片識別并翻譯的詳細內(nèi)容,更多關(guān)于python 圖片識別并翻譯的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python Web框架之Django框架Model基礎(chǔ)詳解
這篇文章主要介紹了Python Web框架之Django框架Model基礎(chǔ),結(jié)合實例形式分析了Django框架Model模型相關(guān)使用技巧與操作注意事項,需要的朋友可以參考下2019-08-08matplotlib部件之矩形選區(qū)(RectangleSelector)的實現(xiàn)
這篇文章主要介紹了matplotlib部件之矩形選區(qū)(RectangleSelector)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02