1. 程式人生 > >Python批量圖片識別並翻譯——我用python給女朋友翻譯化妝品標籤

Python批量圖片識別並翻譯——我用python給女朋友翻譯化妝品標籤

# Python批量圖片識別並翻譯——我用python給女朋友翻譯化妝品標籤 最近小編遇到一個生存問題,女朋友讓我給她翻譯英文化妝品標籤。美其名曰:"程式猿每天英語開發,英文一定很好吧,來幫我翻譯翻譯化妝品成分",”來,幫我看看這個面膜建議敷幾分鐘“。。。。看來斥巨資買化妝品不算完,還需要會各種英文介紹。 默默收起大學考的一摞429分的四級證書,我打開了IDE。。。我打算開發一個能批量翻譯的圖片的[demo](https://github.com/LemonQH/BatchPicTranslate),把家裡的各種化妝品都翻譯好。機智如我,是不會自己從訓練模型做起的,開啟有道智雲的友好的AI介面頁面 ,果然有圖片翻譯服務,[體驗](https://ai.youdao.com/product-fanyi-picture.s)了一下可是真不錯,於是果斷使用。 ### 效果展示 Demo在[這裡](https://github.com/LemonQH/BatchPicTranslate),一起來看看效果吧: 識別過程如下: ![演示](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182522422-1218826794.gif) 逐個看看效果哈!make up for ever 雖然沒翻譯成**玫珂菲**,哈哈哈~但是關鍵詞長期保溼、固定噴霧都翻譯出來了~~~棒 ![result-定妝](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182608575-536552913.png) 這個更是不明覺厲,韓文、英文混合都能翻譯~~~ ![result-可萊斯](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182628076-131744343.png) 櫻花水的表現也不錯哦~ ![result-櫻花水](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182647211-965278418.png) 再亂入一個開起來更像包裝盒的圖片識別,效果不錯,沒受圖片上文字傾斜等影響 : ![result2](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182704614-1689560880.png) ### 呼叫API的準備工作——生成呼叫所需要的應用id和金鑰 根據有道智雲的介面約定,需要先在有道智雲的個人頁面上生成呼叫所需要的應用id和金鑰,以便作為你的呼叫標識以及收費參考。。 具體步驟是:在有道智雲的個人頁面上建立例項、建立應用、繫結應用和例項,獲取呼叫介面用到的應用的id和金鑰。具體個人註冊的過程和應用建立過程詳見文章[分享一次批量檔案翻譯的開發過程](https://blog.csdn.net/qiedabeng8686/article/details/108416385) ![例項](https://img2020.cnblogs.com/blog/1411116/202010/1411116-20201029182720830-1316657383.png) ### 開發過程介紹 #### 1、api介面介紹 先介紹下該工程的核心部分,有道智雲[圖片翻譯服務](https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/%E5%9B%BE%E7%89%87%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1/%E5%9B%BE%E7%89%87%E7%BF%BB%E8%AF%91%E6%9C%8D%E5%8A%A1-API%E6%96%87%E6%A1%A3.html)的呼叫介面 API HTTPS地址:https://openapi.youdao.com/ocrtransapi 介面呼叫方式:POST 請求格式:表單 相應格式:JSON ##### 介面呼叫引數 呼叫API需要向介面傳送以下欄位來訪問服務。 | 欄位名 | 型別 | 含義 | 必填 | 備註 | | ----------- | ---- | ------------------------------------------------------------ | ----- | ------------------------------------------------------------ | | type | text | 檔案上傳型別 | True | 目前支援Base64,請置該欄位值為1 | | from | text | 源語言 | True | 參考下方的 [支援語言](https://ai.youdao.com/DOCSIRMA/html/自然語言翻譯/API文件/圖片翻譯服務/圖片翻譯服務-API文件.html#section-9) (可設定為auto) | | to | text | 目標語言 | True | 參考下方的 [支援語言](https://ai.youdao.com/DOCSIRMA/html/自然語言翻譯/API文件/圖片翻譯服務/圖片翻譯服務-API文件.html#section-9) (可設定為auto) | | appKey | text | 應用ID | True | 可在 [應用管理](https://ai.youdao.com/appmgr.s) 檢視 | | salt | text | UUID | True | 1995882C5064805BC30A39829B779D7B | | sign | text | 簽名 | True | md5(應用Id+q+salt+應用金鑰) | | ext | text | 翻譯結果音訊格式,支援mp3 | false | mp3 | | q | text | 要識別的圖片 | true | type為1時必填,圖片的Base64編碼 | | docType | text | 伺服器響應型別,目前只支援json | false | json | | render | text | 是否需要服務端返回渲染的圖片,0:否;1:是,預設是0 | false | 0 | | nullIsError | text | 如果ocr沒有檢測到文字,是否返回錯誤,false:否;true:是,預設是false | false | 注意是字串 | > 簽名生成方法如下: > 1、將請求引數中的 `應用ID appKey` , `圖片的Base64編碼 q` ,`UUID salt` 和 `應用金鑰` 按照 `應用ID+q+salt+應用金鑰`的順序拼接得到字串 `str` 。 > 2、對字串 `str` 做 md5,得到32位大寫的 `sign` (參考Java生成MD5示例,可點選右側的JAVA示例)。 ##### 輸出結果 返回的結果是json格式,具體說明如下: | 欄位名 | 欄位說明 | | ------------ | ------------------------------------------------------------ | | orientation | 圖片所對應的方向 | | lanFrom | ocr所識別出來認為的圖片中的語言 | | 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、介面部分 主要元素: ```python 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檔案): ```python 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('你沒有選擇任何檔案') ``` 獲取結果儲存路徑: ```python 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()方法: ```python def translate_files(): if translate.file_paths: translate.translate_files() tk.messagebox.showinfo("提示","搞定") else : tk.messagebox.showinfo("提示","無檔案") ``` ##### 2、批量圖片處理 transclass.py實現了圖片讀取、處理等邏輯,Translate類定義如下: ```python 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()方法,按照介面要求拼接了所需引數,發起請求並返回結果。 ```python 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 ,沒想到藉助開放平臺的力量,影象識別,自然語言處理變得如此易如反掌,只要能正確發起請求,就能得到不錯的翻譯結果,剩下大把的時間用來和女朋友炫技,這感覺——爽! 專案地址:https://github.com/LemonQH/BatchPicT