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

Al發表於2020-10-29

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

最近小編遇到一個生存問題,女朋友讓我給她翻譯英文化妝品標籤。美其名曰:"程式猿每天英語開發,英文一定很好吧,來幫我翻譯翻譯化妝品成分",”來,幫我看看這個面膜建議敷幾分鐘“。。。。看來斥巨資買化妝品不算完,還需要會各種英文介紹。

啊

默默收起大學考的一摞429分的四級證照,我開啟了IDE。。。我打算開發一個能批量翻譯的圖片的demo,把家裡的各種化妝品都翻譯好。機智如我,是不會自己從訓練模型做起的,開啟有道智雲的友好的AI介面頁面 ,果然有圖片翻譯服務,體驗了一下可是真不錯,於是果斷使用。

效果展示

Demo在這裡,一起來看看效果吧:

識別過程如下:

演示

逐個看看效果哈!make up for ever 雖然沒翻譯成玫珂菲,哈哈哈但是關鍵詞長期保溼、固定噴霧都翻譯出來了~~棒

result-定妝

這個更是不明覺厲,韓文、英文混合都能翻譯~~~

result-可萊斯

櫻花水的表現也不錯哦~

result-櫻花水

再亂入一個開起來更像包裝盒的圖片識別,效果不錯,沒受圖片上文字傾斜等影響 :

result2

呼叫API的準備工作——生成呼叫所需要的應用id和金鑰

根據有道智雲的介面約定,需要先在有道智雲的個人頁面上生成呼叫所需要的應用id和金鑰,以便作為你的呼叫標識以及收費參考。。

具體步驟是:在有道智雲的個人頁面上建立例項、建立應用、繫結應用和例項,獲取呼叫介面用到的應用的id和金鑰。具體個人註冊的過程和應用建立過程詳見文章分享一次批量檔案翻譯的開發過程

例項

開發過程介紹

1、api介面介紹

先介紹下該工程的核心部分,有道智雲圖片翻譯服務的呼叫介面

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

介面呼叫方式:POST

請求格式:表單

相應格式:JSON

介面呼叫引數

呼叫API需要向介面傳送以下欄位來訪問服務。

欄位名 型別 含義 必填 備註
type text 檔案上傳型別 True 目前支援Base64,請置該欄位值為1
from text 源語言 True 參考下方的 支援語言 (可設定為auto)
to text 目標語言 True 參考下方的 支援語言 (可設定為auto)
appKey text 應用ID True 可在 應用管理 檢視
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、介面部分

主要元素:


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 ,沒想到藉助開放平臺的力量,影像識別,自然語言處理變得如此易如反掌,只要能正確發起請求,就能得到不錯的翻譯結果,剩下大把的時間用來和女朋友炫技,這感覺——爽!

專案地址:https://github.com/LemonQH/BatchPicTranslate

相關文章